From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lh7Zl-0008Jo-Hc for qemu-devel@nongnu.org; Tue, 10 Mar 2009 15:25:17 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lh7Zk-0008J3-1I for qemu-devel@nongnu.org; Tue, 10 Mar 2009 15:25:16 -0400 Received: from [199.232.76.173] (port=52371 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lh7Zj-0008Iy-QJ for qemu-devel@nongnu.org; Tue, 10 Mar 2009 15:25:15 -0400 Received: from savannah.gnu.org ([199.232.41.3]:36292 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Lh7Zj-0003cz-DT for qemu-devel@nongnu.org; Tue, 10 Mar 2009 15:25:15 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Lh7Zi-00058K-Ij for qemu-devel@nongnu.org; Tue, 10 Mar 2009 19:25:14 +0000 Received: from malc by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1Lh7Zi-00058F-3M for qemu-devel@nongnu.org; Tue, 10 Mar 2009 19:25:14 +0000 MIME-Version: 1.0 Errors-To: malc Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: malc Message-Id: Date: Tue, 10 Mar 2009 19:25:14 +0000 Subject: [Qemu-devel] [6803] musicpal: Reorganize IO memory handling (Jan Kiszka) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6803 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6803 Author: malc Date: 2009-03-10 19:25:13 +0000 (Tue, 10 Mar 2009) Log Message: ----------- musicpal: Reorganize IO memory handling (Jan Kiszka) The new MMIO interface requires non-overlapping slots. Reorganize the musicpal accordingly, fixing a regression for the Ethernet emulation. Signed-off-by: Jan Kiszka Modified Paths: -------------- trunk/hw/musicpal.c Modified: trunk/hw/musicpal.c =================================================================== --- trunk/hw/musicpal.c 2009-03-10 10:29:45 UTC (rev 6802) +++ trunk/hw/musicpal.c 2009-03-10 19:25:13 UTC (rev 6803) @@ -20,12 +20,21 @@ #include "audio/audio.h" #include "i2c.h" +#define MP_MISC_BASE 0x80002000 +#define MP_MISC_SIZE 0x00001000 + #define MP_ETH_BASE 0x80008000 #define MP_ETH_SIZE 0x00001000 +#define MP_WLAN_BASE 0x8000C000 +#define MP_WLAN_SIZE 0x00000800 + #define MP_UART1_BASE 0x8000C840 #define MP_UART2_BASE 0x8000C940 +#define MP_GPIO_BASE 0x8000D000 +#define MP_GPIO_SIZE 0x00001000 + #define MP_FLASHCFG_BASE 0x90006000 #define MP_FLASHCFG_SIZE 0x00001000 @@ -429,7 +438,7 @@ musicpal_audio_write }; -static i2c_interface *musicpal_audio_init(uint32_t base, qemu_irq irq) +static i2c_interface *musicpal_audio_init(qemu_irq irq) { AudioState *audio; musicpal_audio_state *s; @@ -457,14 +466,14 @@ iomemtype = cpu_register_io_memory(0, musicpal_audio_readfn, musicpal_audio_writefn, s); - cpu_register_physical_memory(base, MP_AUDIO_SIZE, iomemtype); + cpu_register_physical_memory(MP_AUDIO_BASE, MP_AUDIO_SIZE, iomemtype); qemu_register_reset(musicpal_audio_reset, s); return i2c; } #else /* !HAS_AUDIO */ -static i2c_interface *musicpal_audio_init(uint32_t base, qemu_irq irq) +static i2c_interface *musicpal_audio_init(qemu_irq irq) { return NULL; } @@ -899,7 +908,7 @@ musicpal_lcd_write }; -static void musicpal_lcd_init(uint32_t base) +static void musicpal_lcd_init(void) { musicpal_lcd_state *s; int iomemtype; @@ -907,7 +916,7 @@ s = qemu_mallocz(sizeof(musicpal_lcd_state)); iomemtype = cpu_register_io_memory(0, musicpal_lcd_readfn, musicpal_lcd_writefn, s); - cpu_register_physical_memory(base, MP_LCD_SIZE, iomemtype); + cpu_register_physical_memory(MP_LCD_BASE, MP_LCD_SIZE, iomemtype); s->ds = graphic_console_init(lcd_refresh, lcd_invalidate, NULL, NULL, s); @@ -1195,21 +1204,103 @@ cpu_register_physical_memory(base, MP_FLASHCFG_SIZE, iomemtype); } -/* Various registers in the 0x80000000 domain */ -#define MP_BOARD_REVISION 0x2018 +/* Misc register offsets */ +#define MP_MISC_BOARD_REVISION 0x18 -#define MP_WLAN_MAGIC1 0xc11c -#define MP_WLAN_MAGIC2 0xc124 +#define MP_BOARD_REVISION 0x31 -#define MP_GPIO_OE_LO 0xd008 -#define MP_GPIO_OUT_LO 0xd00c -#define MP_GPIO_IN_LO 0xd010 -#define MP_GPIO_ISR_LO 0xd020 -#define MP_GPIO_OE_HI 0xd508 -#define MP_GPIO_OUT_HI 0xd50c -#define MP_GPIO_IN_HI 0xd510 -#define MP_GPIO_ISR_HI 0xd520 +static uint32_t musicpal_misc_read(void *opaque, target_phys_addr_t offset) +{ + switch (offset) { + case MP_MISC_BOARD_REVISION: + return MP_BOARD_REVISION; + default: + return 0; + } +} + +static void musicpal_misc_write(void *opaque, target_phys_addr_t offset, + uint32_t value) +{ +} + +static CPUReadMemoryFunc *musicpal_misc_readfn[] = { + musicpal_misc_read, + musicpal_misc_read, + musicpal_misc_read, +}; + +static CPUWriteMemoryFunc *musicpal_misc_writefn[] = { + musicpal_misc_write, + musicpal_misc_write, + musicpal_misc_write, +}; + +static void musicpal_misc_init(void) +{ + int iomemtype; + + iomemtype = cpu_register_io_memory(0, musicpal_misc_readfn, + musicpal_misc_writefn, NULL); + cpu_register_physical_memory(MP_MISC_BASE, MP_MISC_SIZE, iomemtype); +} + +/* WLAN register offsets */ +#define MP_WLAN_MAGIC1 0x11c +#define MP_WLAN_MAGIC2 0x124 + +static uint32_t mv88w8618_wlan_read(void *opaque, target_phys_addr_t offset) +{ + switch (offset) { + /* Workaround to allow loading the binary-only wlandrv.ko crap + * from the original Freecom firmware. */ + case MP_WLAN_MAGIC1: + return ~3; + case MP_WLAN_MAGIC2: + return -1; + + default: + return 0; + } +} + +static void mv88w8618_wlan_write(void *opaque, target_phys_addr_t offset, + uint32_t value) +{ +} + +static CPUReadMemoryFunc *mv88w8618_wlan_readfn[] = { + mv88w8618_wlan_read, + mv88w8618_wlan_read, + mv88w8618_wlan_read, +}; + +static CPUWriteMemoryFunc *mv88w8618_wlan_writefn[] = { + mv88w8618_wlan_write, + mv88w8618_wlan_write, + mv88w8618_wlan_write, +}; + +static void mv88w8618_wlan_init(uint32_t base) +{ + int iomemtype; + + iomemtype = cpu_register_io_memory(0, mv88w8618_wlan_readfn, + mv88w8618_wlan_writefn, NULL); + cpu_register_physical_memory(base, MP_WLAN_SIZE, iomemtype); +} + +/* GPIO register offsets */ +#define MP_GPIO_OE_LO 0x008 +#define MP_GPIO_OUT_LO 0x00c +#define MP_GPIO_IN_LO 0x010 +#define MP_GPIO_ISR_LO 0x020 +#define MP_GPIO_OE_HI 0x508 +#define MP_GPIO_OUT_HI 0x50c +#define MP_GPIO_IN_HI 0x510 +#define MP_GPIO_ISR_HI 0x520 + /* GPIO bits & masks */ #define MP_GPIO_WHEEL_VOL (1 << 8) #define MP_GPIO_WHEEL_VOL_INV (1 << 9) @@ -1227,12 +1318,9 @@ /* LCD brightness bits in GPIO_OE_HI */ #define MP_OE_LCD_BRIGHTNESS 0x0007 -static uint32_t musicpal_read(void *opaque, target_phys_addr_t offset) +static uint32_t musicpal_gpio_read(void *opaque, target_phys_addr_t offset) { switch (offset) { - case MP_BOARD_REVISION: - return 0x0031; - case MP_GPIO_OE_HI: /* used for LCD brightness control */ return lcd_brightness & MP_OE_LCD_BRIGHTNESS; @@ -1254,20 +1342,13 @@ case MP_GPIO_ISR_HI: return gpio_isr >> 16; - /* Workaround to allow loading the binary-only wlandrv.ko crap - * from the original Freecom firmware. */ - case MP_WLAN_MAGIC1: - return ~3; - case MP_WLAN_MAGIC2: - return -1; - default: return 0; } } -static void musicpal_write(void *opaque, target_phys_addr_t offset, - uint32_t value) +static void musicpal_gpio_write(void *opaque, target_phys_addr_t offset, + uint32_t value) { switch (offset) { case MP_GPIO_OE_HI: /* used for LCD brightness control */ @@ -1290,6 +1371,27 @@ } } +static CPUReadMemoryFunc *musicpal_gpio_readfn[] = { + musicpal_gpio_read, + musicpal_gpio_read, + musicpal_gpio_read, +}; + +static CPUWriteMemoryFunc *musicpal_gpio_writefn[] = { + musicpal_gpio_write, + musicpal_gpio_write, + musicpal_gpio_write, +}; + +static void musicpal_gpio_init(void) +{ + int iomemtype; + + iomemtype = cpu_register_io_memory(0, musicpal_gpio_readfn, + musicpal_gpio_writefn, NULL); + cpu_register_physical_memory(MP_GPIO_BASE, MP_GPIO_SIZE, iomemtype); +} + /* Keyboard codes & masks */ #define KEY_RELEASED 0x80 #define KEY_CODE 0x7f @@ -1370,18 +1472,6 @@ kbd_extended = 0; } -static CPUReadMemoryFunc *musicpal_readfn[] = { - musicpal_read, - musicpal_read, - musicpal_read, -}; - -static CPUWriteMemoryFunc *musicpal_writefn[] = { - musicpal_write, - musicpal_write, - musicpal_write, -}; - static struct arm_boot_info musicpal_binfo = { .loader_start = 0x0, .board_id = 0x20e, @@ -1395,7 +1485,6 @@ CPUState *env; qemu_irq *pic; int index; - int iomemtype; unsigned long flash_size; if (!cpu_model) @@ -1415,11 +1504,6 @@ sram_off = qemu_ram_alloc(MP_SRAM_SIZE); cpu_register_physical_memory(MP_SRAM_BASE, MP_SRAM_SIZE, sram_off); - /* Catch various stuff not handled by separate subsystems */ - iomemtype = cpu_register_io_memory(0, musicpal_readfn, - musicpal_writefn, env); - cpu_register_physical_memory(0x80000000, 0x10000, iomemtype); - pic = mv88w8618_pic_init(MP_PIC_BASE, pic[ARM_PIC_CPU_IRQ]); mv88w8618_pit_init(MP_PIT_BASE, pic, MP_TIMER1_IRQ); @@ -1454,14 +1538,19 @@ } mv88w8618_flashcfg_init(MP_FLASHCFG_BASE); - musicpal_lcd_init(MP_LCD_BASE); + musicpal_lcd_init(); qemu_add_kbd_event_handler(musicpal_key_event, pic[MP_GPIO_IRQ]); mv88w8618_eth_init(&nd_table[0], MP_ETH_BASE, pic[MP_ETH_IRQ]); - mixer_i2c = musicpal_audio_init(MP_AUDIO_BASE, pic[MP_AUDIO_IRQ]); + mixer_i2c = musicpal_audio_init(pic[MP_AUDIO_IRQ]); + mv88w8618_wlan_init(MP_WLAN_BASE); + + musicpal_misc_init(); + musicpal_gpio_init(); + musicpal_binfo.ram_size = MP_RAM_DEFAULT_SIZE; musicpal_binfo.kernel_filename = kernel_filename; musicpal_binfo.kernel_cmdline = kernel_cmdline;