Commit 486579de70a08098edf3c59eec3e6482a8136e32

Authored by balrog
1 parent 69d6451c

SH: improve the way sh7750 registers io memory (Takashi YOSHII).

Fixes to be needed for commit #5849 "Change MMIO callbacks..."
 hw/sh7750.c:
  - Divide region of CPU control registers to avoid overlapping
    to peripheral modules.
  - Delete unused var "icr", which had moved to hw/sh_intc.c.
 hw/sm501.c:
  - Merge non page aligned palette registers into the region of
    control registers.

Signed-off-by: Takashi YOSHII <takasi-y@ops.dti.ne.jp>
Signed-off-by: Andrzej Zaborowski <andrew.zaborowski@intel.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5934 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 41 additions and 55 deletions
hw/sh7750.c
... ... @@ -60,7 +60,6 @@ typedef struct SH7750State {
60 60 uint16_t periph_portdirb; /* Direction seen from the peripherals */
61 61 sh7750_io_device *devices[NB_DEVICES]; /* External peripherals */
62 62  
63   - uint16_t icr;
64 63 /* Cache */
65 64 uint32_t ccr;
66 65  
... ... @@ -222,8 +221,6 @@ static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr)
222 221 return porta_lines(s);
223 222 case SH7750_PDTRB_A7:
224 223 return portb_lines(s);
225   - case 0x1fd00000:
226   - return s->icr;
227 224 default:
228 225 error_access("word read", addr);
229 226 assert(0);
... ... @@ -328,9 +325,6 @@ static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr,
328 325 assert(0);
329 326 }
330 327 return;
331   - case 0x1fd00000:
332   - s->icr = mem_value;
333   - return;
334 328 default:
335 329 error_access("word write", addr);
336 330 assert(0);
... ... @@ -687,8 +681,12 @@ SH7750State *sh7750_init(CPUSH4State * cpu)
687 681 sh7750_io_memory = cpu_register_io_memory(0,
688 682 sh7750_mem_read,
689 683 sh7750_mem_write, s);
690   - cpu_register_physical_memory_offset(0x1c000000, 0x04000000,
691   - sh7750_io_memory, 0x1c000000);
  684 + cpu_register_physical_memory_offset(0x1f000000, 0x1000,
  685 + sh7750_io_memory, 0x1f000000);
  686 + cpu_register_physical_memory_offset(0x1f800000, 0x1000,
  687 + sh7750_io_memory, 0x1f800000);
  688 + cpu_register_physical_memory_offset(0x1fc00000, 0x1000,
  689 + sh7750_io_memory, 0x1fc00000);
692 690  
693 691 sh7750_mm_cache_and_tlb = cpu_register_io_memory(0,
694 692 sh7750_mmct_read,
... ...
hw/sm501.c
... ... @@ -638,6 +638,32 @@ static CPUWriteMemoryFunc *sm501_system_config_writefn[] = {
638 638 &sm501_system_config_write,
639 639 };
640 640  
  641 +static uint32_t sm501_palette_read(void *opaque, target_phys_addr_t addr)
  642 +{
  643 + SM501State * s = (SM501State *)opaque;
  644 + SM501_DPRINTF("sm501 palette read addr=%x\n", (int)addr);
  645 +
  646 + /* TODO : consider BYTE/WORD access */
  647 + /* TODO : consider endian */
  648 +
  649 + assert(0 <= addr && addr < 0x400 * 3);
  650 + return *(uint32_t*)&s->dc_palette[addr];
  651 +}
  652 +
  653 +static void sm501_palette_write(void *opaque,
  654 + target_phys_addr_t addr, uint32_t value)
  655 +{
  656 + SM501State * s = (SM501State *)opaque;
  657 + SM501_DPRINTF("sm501 palette write addr=%x, val=%x\n",
  658 + (int)addr, value);
  659 +
  660 + /* TODO : consider BYTE/WORD access */
  661 + /* TODO : consider endian */
  662 +
  663 + assert(0 <= addr && addr < 0x400 * 3);
  664 + *(uint32_t*)&s->dc_palette[addr] = value;
  665 +}
  666 +
641 667 static uint32_t sm501_disp_ctrl_read(void *opaque, target_phys_addr_t addr)
642 668 {
643 669 SM501State * s = (SM501State *)opaque;
... ... @@ -719,6 +745,10 @@ static uint32_t sm501_disp_ctrl_read(void *opaque, target_phys_addr_t addr)
719 745 ret = s->dc_crt_hwc_addr;
720 746 break;
721 747  
  748 + case SM501_DC_PANEL_PALETTE ... SM501_DC_PANEL_PALETTE + 0x400*3 - 4:
  749 + ret = sm501_palette_read(opaque, addr - SM501_DC_PANEL_PALETTE);
  750 + break;
  751 +
722 752 default:
723 753 printf("sm501 disp ctrl : not implemented register read."
724 754 " addr=%x\n", (int)addr);
... ... @@ -823,6 +853,10 @@ static void sm501_disp_ctrl_write(void *opaque,
823 853 s->dc_crt_hwc_addr = value & 0x0000FFFF;
824 854 break;
825 855  
  856 + case SM501_DC_PANEL_PALETTE ... SM501_DC_PANEL_PALETTE + 0x400*3 - 4:
  857 + sm501_palette_write(opaque, addr - SM501_DC_PANEL_PALETTE, value);
  858 + break;
  859 +
826 860 default:
827 861 printf("sm501 disp ctrl : not implemented register write."
828 862 " addr=%x, val=%x\n", (int)addr, value);
... ... @@ -842,45 +876,6 @@ static CPUWriteMemoryFunc *sm501_disp_ctrl_writefn[] = {
842 876 &sm501_disp_ctrl_write,
843 877 };
844 878  
845   -static uint32_t sm501_palette_read(void *opaque, target_phys_addr_t addr)
846   -{
847   - SM501State * s = (SM501State *)opaque;
848   - SM501_DPRINTF("sm501 palette read addr=%x\n", (int)addr);
849   -
850   - /* TODO : consider BYTE/WORD access */
851   - /* TODO : consider endian */
852   -
853   - assert(0 <= addr && addr < 0x400 * 3);
854   - return *(uint32_t*)&s->dc_palette[addr];
855   -}
856   -
857   -static void sm501_palette_write(void *opaque,
858   - target_phys_addr_t addr, uint32_t value)
859   -{
860   - SM501State * s = (SM501State *)opaque;
861   - SM501_DPRINTF("sm501 palette write addr=%x, val=%x\n",
862   - (int)addr, value);
863   -
864   - /* TODO : consider BYTE/WORD access */
865   - /* TODO : consider endian */
866   -
867   - assert(0 <= addr && addr < 0x400 * 3);
868   - *(uint32_t*)&s->dc_palette[addr] = value;
869   -}
870   -
871   -static CPUReadMemoryFunc *sm501_palette_readfn[] = {
872   - &sm501_palette_read,
873   - &sm501_palette_read,
874   - &sm501_palette_read,
875   -};
876   -
877   -static CPUWriteMemoryFunc *sm501_palette_writefn[] = {
878   - &sm501_palette_write,
879   - &sm501_palette_write,
880   - &sm501_palette_write,
881   -};
882   -
883   -
884 879 /* draw line functions for all console modes */
885 880  
886 881 #include "pixel_ops.h"
... ... @@ -1070,7 +1065,6 @@ void sm501_init(DisplayState *ds, uint32_t base, unsigned long local_mem_base,
1070 1065 SM501State * s;
1071 1066 int sm501_system_config_index;
1072 1067 int sm501_disp_ctrl_index;
1073   - int sm501_palette_index;
1074 1068  
1075 1069 /* allocate management data region */
1076 1070 s = (SM501State *)qemu_mallocz(sizeof(SM501State));
... ... @@ -1098,13 +1092,7 @@ void sm501_init(DisplayState *ds, uint32_t base, unsigned long local_mem_base,
1098 1092 sm501_disp_ctrl_index = cpu_register_io_memory(0, sm501_disp_ctrl_readfn,
1099 1093 sm501_disp_ctrl_writefn, s);
1100 1094 cpu_register_physical_memory(base + MMIO_BASE_OFFSET + SM501_DC,
1101   - 0x400, sm501_disp_ctrl_index);
1102   -
1103   - sm501_palette_index = cpu_register_io_memory(0, sm501_palette_readfn,
1104   - sm501_palette_writefn, s);
1105   - cpu_register_physical_memory(base + MMIO_BASE_OFFSET
1106   - + SM501_DC + SM501_DC_PANEL_PALETTE,
1107   - 0x400 * 3, sm501_palette_index);
  1095 + 0x1000, sm501_disp_ctrl_index);
1108 1096  
1109 1097 /* bridge to serial emulation module */
1110 1098 if (chr)
... ...