Commit 718ec0be53bae7a4451587e0fd09becc94593c7e
1 parent
43e860ef
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 <jan.kiszka@web.de> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6803 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
139 additions
and
50 deletions
hw/musicpal.c
| @@ -20,12 +20,21 @@ | @@ -20,12 +20,21 @@ | ||
| 20 | #include "audio/audio.h" | 20 | #include "audio/audio.h" |
| 21 | #include "i2c.h" | 21 | #include "i2c.h" |
| 22 | 22 | ||
| 23 | +#define MP_MISC_BASE 0x80002000 | ||
| 24 | +#define MP_MISC_SIZE 0x00001000 | ||
| 25 | + | ||
| 23 | #define MP_ETH_BASE 0x80008000 | 26 | #define MP_ETH_BASE 0x80008000 |
| 24 | #define MP_ETH_SIZE 0x00001000 | 27 | #define MP_ETH_SIZE 0x00001000 |
| 25 | 28 | ||
| 29 | +#define MP_WLAN_BASE 0x8000C000 | ||
| 30 | +#define MP_WLAN_SIZE 0x00000800 | ||
| 31 | + | ||
| 26 | #define MP_UART1_BASE 0x8000C840 | 32 | #define MP_UART1_BASE 0x8000C840 |
| 27 | #define MP_UART2_BASE 0x8000C940 | 33 | #define MP_UART2_BASE 0x8000C940 |
| 28 | 34 | ||
| 35 | +#define MP_GPIO_BASE 0x8000D000 | ||
| 36 | +#define MP_GPIO_SIZE 0x00001000 | ||
| 37 | + | ||
| 29 | #define MP_FLASHCFG_BASE 0x90006000 | 38 | #define MP_FLASHCFG_BASE 0x90006000 |
| 30 | #define MP_FLASHCFG_SIZE 0x00001000 | 39 | #define MP_FLASHCFG_SIZE 0x00001000 |
| 31 | 40 | ||
| @@ -429,7 +438,7 @@ static CPUWriteMemoryFunc *musicpal_audio_writefn[] = { | @@ -429,7 +438,7 @@ static CPUWriteMemoryFunc *musicpal_audio_writefn[] = { | ||
| 429 | musicpal_audio_write | 438 | musicpal_audio_write |
| 430 | }; | 439 | }; |
| 431 | 440 | ||
| 432 | -static i2c_interface *musicpal_audio_init(uint32_t base, qemu_irq irq) | 441 | +static i2c_interface *musicpal_audio_init(qemu_irq irq) |
| 433 | { | 442 | { |
| 434 | AudioState *audio; | 443 | AudioState *audio; |
| 435 | musicpal_audio_state *s; | 444 | musicpal_audio_state *s; |
| @@ -457,14 +466,14 @@ static i2c_interface *musicpal_audio_init(uint32_t base, qemu_irq irq) | @@ -457,14 +466,14 @@ static i2c_interface *musicpal_audio_init(uint32_t base, qemu_irq irq) | ||
| 457 | 466 | ||
| 458 | iomemtype = cpu_register_io_memory(0, musicpal_audio_readfn, | 467 | iomemtype = cpu_register_io_memory(0, musicpal_audio_readfn, |
| 459 | musicpal_audio_writefn, s); | 468 | musicpal_audio_writefn, s); |
| 460 | - cpu_register_physical_memory(base, MP_AUDIO_SIZE, iomemtype); | 469 | + cpu_register_physical_memory(MP_AUDIO_BASE, MP_AUDIO_SIZE, iomemtype); |
| 461 | 470 | ||
| 462 | qemu_register_reset(musicpal_audio_reset, s); | 471 | qemu_register_reset(musicpal_audio_reset, s); |
| 463 | 472 | ||
| 464 | return i2c; | 473 | return i2c; |
| 465 | } | 474 | } |
| 466 | #else /* !HAS_AUDIO */ | 475 | #else /* !HAS_AUDIO */ |
| 467 | -static i2c_interface *musicpal_audio_init(uint32_t base, qemu_irq irq) | 476 | +static i2c_interface *musicpal_audio_init(qemu_irq irq) |
| 468 | { | 477 | { |
| 469 | return NULL; | 478 | return NULL; |
| 470 | } | 479 | } |
| @@ -899,7 +908,7 @@ static CPUWriteMemoryFunc *musicpal_lcd_writefn[] = { | @@ -899,7 +908,7 @@ static CPUWriteMemoryFunc *musicpal_lcd_writefn[] = { | ||
| 899 | musicpal_lcd_write | 908 | musicpal_lcd_write |
| 900 | }; | 909 | }; |
| 901 | 910 | ||
| 902 | -static void musicpal_lcd_init(uint32_t base) | 911 | +static void musicpal_lcd_init(void) |
| 903 | { | 912 | { |
| 904 | musicpal_lcd_state *s; | 913 | musicpal_lcd_state *s; |
| 905 | int iomemtype; | 914 | int iomemtype; |
| @@ -907,7 +916,7 @@ static void musicpal_lcd_init(uint32_t base) | @@ -907,7 +916,7 @@ static void musicpal_lcd_init(uint32_t base) | ||
| 907 | s = qemu_mallocz(sizeof(musicpal_lcd_state)); | 916 | s = qemu_mallocz(sizeof(musicpal_lcd_state)); |
| 908 | iomemtype = cpu_register_io_memory(0, musicpal_lcd_readfn, | 917 | iomemtype = cpu_register_io_memory(0, musicpal_lcd_readfn, |
| 909 | musicpal_lcd_writefn, s); | 918 | musicpal_lcd_writefn, s); |
| 910 | - cpu_register_physical_memory(base, MP_LCD_SIZE, iomemtype); | 919 | + cpu_register_physical_memory(MP_LCD_BASE, MP_LCD_SIZE, iomemtype); |
| 911 | 920 | ||
| 912 | s->ds = graphic_console_init(lcd_refresh, lcd_invalidate, | 921 | s->ds = graphic_console_init(lcd_refresh, lcd_invalidate, |
| 913 | NULL, NULL, s); | 922 | NULL, NULL, s); |
| @@ -1195,20 +1204,102 @@ static void mv88w8618_flashcfg_init(uint32_t base) | @@ -1195,20 +1204,102 @@ static void mv88w8618_flashcfg_init(uint32_t base) | ||
| 1195 | cpu_register_physical_memory(base, MP_FLASHCFG_SIZE, iomemtype); | 1204 | cpu_register_physical_memory(base, MP_FLASHCFG_SIZE, iomemtype); |
| 1196 | } | 1205 | } |
| 1197 | 1206 | ||
| 1198 | -/* Various registers in the 0x80000000 domain */ | ||
| 1199 | -#define MP_BOARD_REVISION 0x2018 | 1207 | +/* Misc register offsets */ |
| 1208 | +#define MP_MISC_BOARD_REVISION 0x18 | ||
| 1209 | + | ||
| 1210 | +#define MP_BOARD_REVISION 0x31 | ||
| 1211 | + | ||
| 1212 | +static uint32_t musicpal_misc_read(void *opaque, target_phys_addr_t offset) | ||
| 1213 | +{ | ||
| 1214 | + switch (offset) { | ||
| 1215 | + case MP_MISC_BOARD_REVISION: | ||
| 1216 | + return MP_BOARD_REVISION; | ||
| 1217 | + | ||
| 1218 | + default: | ||
| 1219 | + return 0; | ||
| 1220 | + } | ||
| 1221 | +} | ||
| 1222 | + | ||
| 1223 | +static void musicpal_misc_write(void *opaque, target_phys_addr_t offset, | ||
| 1224 | + uint32_t value) | ||
| 1225 | +{ | ||
| 1226 | +} | ||
| 1227 | + | ||
| 1228 | +static CPUReadMemoryFunc *musicpal_misc_readfn[] = { | ||
| 1229 | + musicpal_misc_read, | ||
| 1230 | + musicpal_misc_read, | ||
| 1231 | + musicpal_misc_read, | ||
| 1232 | +}; | ||
| 1233 | + | ||
| 1234 | +static CPUWriteMemoryFunc *musicpal_misc_writefn[] = { | ||
| 1235 | + musicpal_misc_write, | ||
| 1236 | + musicpal_misc_write, | ||
| 1237 | + musicpal_misc_write, | ||
| 1238 | +}; | ||
| 1239 | + | ||
| 1240 | +static void musicpal_misc_init(void) | ||
| 1241 | +{ | ||
| 1242 | + int iomemtype; | ||
| 1243 | + | ||
| 1244 | + iomemtype = cpu_register_io_memory(0, musicpal_misc_readfn, | ||
| 1245 | + musicpal_misc_writefn, NULL); | ||
| 1246 | + cpu_register_physical_memory(MP_MISC_BASE, MP_MISC_SIZE, iomemtype); | ||
| 1247 | +} | ||
| 1248 | + | ||
| 1249 | +/* WLAN register offsets */ | ||
| 1250 | +#define MP_WLAN_MAGIC1 0x11c | ||
| 1251 | +#define MP_WLAN_MAGIC2 0x124 | ||
| 1252 | + | ||
| 1253 | +static uint32_t mv88w8618_wlan_read(void *opaque, target_phys_addr_t offset) | ||
| 1254 | +{ | ||
| 1255 | + switch (offset) { | ||
| 1256 | + /* Workaround to allow loading the binary-only wlandrv.ko crap | ||
| 1257 | + * from the original Freecom firmware. */ | ||
| 1258 | + case MP_WLAN_MAGIC1: | ||
| 1259 | + return ~3; | ||
| 1260 | + case MP_WLAN_MAGIC2: | ||
| 1261 | + return -1; | ||
| 1262 | + | ||
| 1263 | + default: | ||
| 1264 | + return 0; | ||
| 1265 | + } | ||
| 1266 | +} | ||
| 1267 | + | ||
| 1268 | +static void mv88w8618_wlan_write(void *opaque, target_phys_addr_t offset, | ||
| 1269 | + uint32_t value) | ||
| 1270 | +{ | ||
| 1271 | +} | ||
| 1272 | + | ||
| 1273 | +static CPUReadMemoryFunc *mv88w8618_wlan_readfn[] = { | ||
| 1274 | + mv88w8618_wlan_read, | ||
| 1275 | + mv88w8618_wlan_read, | ||
| 1276 | + mv88w8618_wlan_read, | ||
| 1277 | +}; | ||
| 1278 | + | ||
| 1279 | +static CPUWriteMemoryFunc *mv88w8618_wlan_writefn[] = { | ||
| 1280 | + mv88w8618_wlan_write, | ||
| 1281 | + mv88w8618_wlan_write, | ||
| 1282 | + mv88w8618_wlan_write, | ||
| 1283 | +}; | ||
| 1284 | + | ||
| 1285 | +static void mv88w8618_wlan_init(uint32_t base) | ||
| 1286 | +{ | ||
| 1287 | + int iomemtype; | ||
| 1200 | 1288 | ||
| 1201 | -#define MP_WLAN_MAGIC1 0xc11c | ||
| 1202 | -#define MP_WLAN_MAGIC2 0xc124 | 1289 | + iomemtype = cpu_register_io_memory(0, mv88w8618_wlan_readfn, |
| 1290 | + mv88w8618_wlan_writefn, NULL); | ||
| 1291 | + cpu_register_physical_memory(base, MP_WLAN_SIZE, iomemtype); | ||
| 1292 | +} | ||
| 1203 | 1293 | ||
| 1204 | -#define MP_GPIO_OE_LO 0xd008 | ||
| 1205 | -#define MP_GPIO_OUT_LO 0xd00c | ||
| 1206 | -#define MP_GPIO_IN_LO 0xd010 | ||
| 1207 | -#define MP_GPIO_ISR_LO 0xd020 | ||
| 1208 | -#define MP_GPIO_OE_HI 0xd508 | ||
| 1209 | -#define MP_GPIO_OUT_HI 0xd50c | ||
| 1210 | -#define MP_GPIO_IN_HI 0xd510 | ||
| 1211 | -#define MP_GPIO_ISR_HI 0xd520 | 1294 | +/* GPIO register offsets */ |
| 1295 | +#define MP_GPIO_OE_LO 0x008 | ||
| 1296 | +#define MP_GPIO_OUT_LO 0x00c | ||
| 1297 | +#define MP_GPIO_IN_LO 0x010 | ||
| 1298 | +#define MP_GPIO_ISR_LO 0x020 | ||
| 1299 | +#define MP_GPIO_OE_HI 0x508 | ||
| 1300 | +#define MP_GPIO_OUT_HI 0x50c | ||
| 1301 | +#define MP_GPIO_IN_HI 0x510 | ||
| 1302 | +#define MP_GPIO_ISR_HI 0x520 | ||
| 1212 | 1303 | ||
| 1213 | /* GPIO bits & masks */ | 1304 | /* GPIO bits & masks */ |
| 1214 | #define MP_GPIO_WHEEL_VOL (1 << 8) | 1305 | #define MP_GPIO_WHEEL_VOL (1 << 8) |
| @@ -1227,12 +1318,9 @@ static void mv88w8618_flashcfg_init(uint32_t base) | @@ -1227,12 +1318,9 @@ static void mv88w8618_flashcfg_init(uint32_t base) | ||
| 1227 | /* LCD brightness bits in GPIO_OE_HI */ | 1318 | /* LCD brightness bits in GPIO_OE_HI */ |
| 1228 | #define MP_OE_LCD_BRIGHTNESS 0x0007 | 1319 | #define MP_OE_LCD_BRIGHTNESS 0x0007 |
| 1229 | 1320 | ||
| 1230 | -static uint32_t musicpal_read(void *opaque, target_phys_addr_t offset) | 1321 | +static uint32_t musicpal_gpio_read(void *opaque, target_phys_addr_t offset) |
| 1231 | { | 1322 | { |
| 1232 | switch (offset) { | 1323 | switch (offset) { |
| 1233 | - case MP_BOARD_REVISION: | ||
| 1234 | - return 0x0031; | ||
| 1235 | - | ||
| 1236 | case MP_GPIO_OE_HI: /* used for LCD brightness control */ | 1324 | case MP_GPIO_OE_HI: /* used for LCD brightness control */ |
| 1237 | return lcd_brightness & MP_OE_LCD_BRIGHTNESS; | 1325 | return lcd_brightness & MP_OE_LCD_BRIGHTNESS; |
| 1238 | 1326 | ||
| @@ -1254,20 +1342,13 @@ static uint32_t musicpal_read(void *opaque, target_phys_addr_t offset) | @@ -1254,20 +1342,13 @@ static uint32_t musicpal_read(void *opaque, target_phys_addr_t offset) | ||
| 1254 | case MP_GPIO_ISR_HI: | 1342 | case MP_GPIO_ISR_HI: |
| 1255 | return gpio_isr >> 16; | 1343 | return gpio_isr >> 16; |
| 1256 | 1344 | ||
| 1257 | - /* Workaround to allow loading the binary-only wlandrv.ko crap | ||
| 1258 | - * from the original Freecom firmware. */ | ||
| 1259 | - case MP_WLAN_MAGIC1: | ||
| 1260 | - return ~3; | ||
| 1261 | - case MP_WLAN_MAGIC2: | ||
| 1262 | - return -1; | ||
| 1263 | - | ||
| 1264 | default: | 1345 | default: |
| 1265 | return 0; | 1346 | return 0; |
| 1266 | } | 1347 | } |
| 1267 | } | 1348 | } |
| 1268 | 1349 | ||
| 1269 | -static void musicpal_write(void *opaque, target_phys_addr_t offset, | ||
| 1270 | - uint32_t value) | 1350 | +static void musicpal_gpio_write(void *opaque, target_phys_addr_t offset, |
| 1351 | + uint32_t value) | ||
| 1271 | { | 1352 | { |
| 1272 | switch (offset) { | 1353 | switch (offset) { |
| 1273 | case MP_GPIO_OE_HI: /* used for LCD brightness control */ | 1354 | case MP_GPIO_OE_HI: /* used for LCD brightness control */ |
| @@ -1290,6 +1371,27 @@ static void musicpal_write(void *opaque, target_phys_addr_t offset, | @@ -1290,6 +1371,27 @@ static void musicpal_write(void *opaque, target_phys_addr_t offset, | ||
| 1290 | } | 1371 | } |
| 1291 | } | 1372 | } |
| 1292 | 1373 | ||
| 1374 | +static CPUReadMemoryFunc *musicpal_gpio_readfn[] = { | ||
| 1375 | + musicpal_gpio_read, | ||
| 1376 | + musicpal_gpio_read, | ||
| 1377 | + musicpal_gpio_read, | ||
| 1378 | +}; | ||
| 1379 | + | ||
| 1380 | +static CPUWriteMemoryFunc *musicpal_gpio_writefn[] = { | ||
| 1381 | + musicpal_gpio_write, | ||
| 1382 | + musicpal_gpio_write, | ||
| 1383 | + musicpal_gpio_write, | ||
| 1384 | +}; | ||
| 1385 | + | ||
| 1386 | +static void musicpal_gpio_init(void) | ||
| 1387 | +{ | ||
| 1388 | + int iomemtype; | ||
| 1389 | + | ||
| 1390 | + iomemtype = cpu_register_io_memory(0, musicpal_gpio_readfn, | ||
| 1391 | + musicpal_gpio_writefn, NULL); | ||
| 1392 | + cpu_register_physical_memory(MP_GPIO_BASE, MP_GPIO_SIZE, iomemtype); | ||
| 1393 | +} | ||
| 1394 | + | ||
| 1293 | /* Keyboard codes & masks */ | 1395 | /* Keyboard codes & masks */ |
| 1294 | #define KEY_RELEASED 0x80 | 1396 | #define KEY_RELEASED 0x80 |
| 1295 | #define KEY_CODE 0x7f | 1397 | #define KEY_CODE 0x7f |
| @@ -1370,18 +1472,6 @@ static void musicpal_key_event(void *opaque, int keycode) | @@ -1370,18 +1472,6 @@ static void musicpal_key_event(void *opaque, int keycode) | ||
| 1370 | kbd_extended = 0; | 1472 | kbd_extended = 0; |
| 1371 | } | 1473 | } |
| 1372 | 1474 | ||
| 1373 | -static CPUReadMemoryFunc *musicpal_readfn[] = { | ||
| 1374 | - musicpal_read, | ||
| 1375 | - musicpal_read, | ||
| 1376 | - musicpal_read, | ||
| 1377 | -}; | ||
| 1378 | - | ||
| 1379 | -static CPUWriteMemoryFunc *musicpal_writefn[] = { | ||
| 1380 | - musicpal_write, | ||
| 1381 | - musicpal_write, | ||
| 1382 | - musicpal_write, | ||
| 1383 | -}; | ||
| 1384 | - | ||
| 1385 | static struct arm_boot_info musicpal_binfo = { | 1475 | static struct arm_boot_info musicpal_binfo = { |
| 1386 | .loader_start = 0x0, | 1476 | .loader_start = 0x0, |
| 1387 | .board_id = 0x20e, | 1477 | .board_id = 0x20e, |
| @@ -1395,7 +1485,6 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | @@ -1395,7 +1485,6 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 1395 | CPUState *env; | 1485 | CPUState *env; |
| 1396 | qemu_irq *pic; | 1486 | qemu_irq *pic; |
| 1397 | int index; | 1487 | int index; |
| 1398 | - int iomemtype; | ||
| 1399 | unsigned long flash_size; | 1488 | unsigned long flash_size; |
| 1400 | 1489 | ||
| 1401 | if (!cpu_model) | 1490 | if (!cpu_model) |
| @@ -1415,11 +1504,6 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | @@ -1415,11 +1504,6 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 1415 | sram_off = qemu_ram_alloc(MP_SRAM_SIZE); | 1504 | sram_off = qemu_ram_alloc(MP_SRAM_SIZE); |
| 1416 | cpu_register_physical_memory(MP_SRAM_BASE, MP_SRAM_SIZE, sram_off); | 1505 | cpu_register_physical_memory(MP_SRAM_BASE, MP_SRAM_SIZE, sram_off); |
| 1417 | 1506 | ||
| 1418 | - /* Catch various stuff not handled by separate subsystems */ | ||
| 1419 | - iomemtype = cpu_register_io_memory(0, musicpal_readfn, | ||
| 1420 | - musicpal_writefn, env); | ||
| 1421 | - cpu_register_physical_memory(0x80000000, 0x10000, iomemtype); | ||
| 1422 | - | ||
| 1423 | pic = mv88w8618_pic_init(MP_PIC_BASE, pic[ARM_PIC_CPU_IRQ]); | 1507 | pic = mv88w8618_pic_init(MP_PIC_BASE, pic[ARM_PIC_CPU_IRQ]); |
| 1424 | mv88w8618_pit_init(MP_PIT_BASE, pic, MP_TIMER1_IRQ); | 1508 | mv88w8618_pit_init(MP_PIT_BASE, pic, MP_TIMER1_IRQ); |
| 1425 | 1509 | ||
| @@ -1454,13 +1538,18 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | @@ -1454,13 +1538,18 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 1454 | } | 1538 | } |
| 1455 | mv88w8618_flashcfg_init(MP_FLASHCFG_BASE); | 1539 | mv88w8618_flashcfg_init(MP_FLASHCFG_BASE); |
| 1456 | 1540 | ||
| 1457 | - musicpal_lcd_init(MP_LCD_BASE); | 1541 | + musicpal_lcd_init(); |
| 1458 | 1542 | ||
| 1459 | qemu_add_kbd_event_handler(musicpal_key_event, pic[MP_GPIO_IRQ]); | 1543 | qemu_add_kbd_event_handler(musicpal_key_event, pic[MP_GPIO_IRQ]); |
| 1460 | 1544 | ||
| 1461 | mv88w8618_eth_init(&nd_table[0], MP_ETH_BASE, pic[MP_ETH_IRQ]); | 1545 | mv88w8618_eth_init(&nd_table[0], MP_ETH_BASE, pic[MP_ETH_IRQ]); |
| 1462 | 1546 | ||
| 1463 | - mixer_i2c = musicpal_audio_init(MP_AUDIO_BASE, pic[MP_AUDIO_IRQ]); | 1547 | + mixer_i2c = musicpal_audio_init(pic[MP_AUDIO_IRQ]); |
| 1548 | + | ||
| 1549 | + mv88w8618_wlan_init(MP_WLAN_BASE); | ||
| 1550 | + | ||
| 1551 | + musicpal_misc_init(); | ||
| 1552 | + musicpal_gpio_init(); | ||
| 1464 | 1553 | ||
| 1465 | musicpal_binfo.ram_size = MP_RAM_DEFAULT_SIZE; | 1554 | musicpal_binfo.ram_size = MP_RAM_DEFAULT_SIZE; |
| 1466 | musicpal_binfo.kernel_filename = kernel_filename; | 1555 | musicpal_binfo.kernel_filename = kernel_filename; |