Commit 486579de70a08098edf3c59eec3e6482a8136e32
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) | ... | ... |