Commit f48f656949894aa4d440f4f2a5e5bf7b34106785
1 parent
5f750b2e
Sparc32: convert boot prom to qdev
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
67 additions
and
87 deletions
hw/sun4m.c
| @@ -422,6 +422,64 @@ static void idreg_register_devices(void) | @@ -422,6 +422,64 @@ static void idreg_register_devices(void) | ||
| 422 | 422 | ||
| 423 | device_init(idreg_register_devices); | 423 | device_init(idreg_register_devices); |
| 424 | 424 | ||
| 425 | +/* Boot PROM (OpenBIOS) */ | ||
| 426 | +static void prom_init(target_phys_addr_t addr, const char *bios_name) | ||
| 427 | +{ | ||
| 428 | + DeviceState *dev; | ||
| 429 | + SysBusDevice *s; | ||
| 430 | + char *filename; | ||
| 431 | + int ret; | ||
| 432 | + | ||
| 433 | + dev = qdev_create(NULL, "openprom"); | ||
| 434 | + qdev_init(dev); | ||
| 435 | + s = sysbus_from_qdev(dev); | ||
| 436 | + | ||
| 437 | + sysbus_mmio_map(s, 0, addr); | ||
| 438 | + | ||
| 439 | + /* load boot prom */ | ||
| 440 | + if (bios_name == NULL) { | ||
| 441 | + bios_name = PROM_FILENAME; | ||
| 442 | + } | ||
| 443 | + filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); | ||
| 444 | + if (filename) { | ||
| 445 | + ret = load_elf(filename, addr - PROM_VADDR, NULL, NULL, NULL); | ||
| 446 | + if (ret < 0 || ret > PROM_SIZE_MAX) { | ||
| 447 | + ret = load_image_targphys(filename, addr, PROM_SIZE_MAX); | ||
| 448 | + } | ||
| 449 | + qemu_free(filename); | ||
| 450 | + } else { | ||
| 451 | + ret = -1; | ||
| 452 | + } | ||
| 453 | + if (ret < 0 || ret > PROM_SIZE_MAX) { | ||
| 454 | + fprintf(stderr, "qemu: could not load prom '%s'\n", bios_name); | ||
| 455 | + exit(1); | ||
| 456 | + } | ||
| 457 | +} | ||
| 458 | + | ||
| 459 | +static void prom_init1(SysBusDevice *dev) | ||
| 460 | +{ | ||
| 461 | + ram_addr_t prom_offset; | ||
| 462 | + | ||
| 463 | + prom_offset = qemu_ram_alloc(PROM_SIZE_MAX); | ||
| 464 | + sysbus_init_mmio(dev, PROM_SIZE_MAX, prom_offset | IO_MEM_ROM); | ||
| 465 | +} | ||
| 466 | + | ||
| 467 | +static SysBusDeviceInfo prom_info = { | ||
| 468 | + .init = prom_init1, | ||
| 469 | + .qdev.name = "openprom", | ||
| 470 | + .qdev.size = sizeof(SysBusDevice), | ||
| 471 | + .qdev.props = (DevicePropList[]) { | ||
| 472 | + {.name = NULL} | ||
| 473 | + } | ||
| 474 | +}; | ||
| 475 | + | ||
| 476 | +static void prom_register_devices(void) | ||
| 477 | +{ | ||
| 478 | + sysbus_register_withprop(&prom_info); | ||
| 479 | +} | ||
| 480 | + | ||
| 481 | +device_init(prom_register_devices); | ||
| 482 | + | ||
| 425 | static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | 483 | static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, |
| 426 | const char *boot_device, | 484 | const char *boot_device, |
| 427 | const char *kernel_filename, | 485 | const char *kernel_filename, |
| @@ -437,10 +495,8 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | @@ -437,10 +495,8 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 437 | qemu_irq *esp_reset, *le_reset; | 495 | qemu_irq *esp_reset, *le_reset; |
| 438 | qemu_irq fdc_tc; | 496 | qemu_irq fdc_tc; |
| 439 | qemu_irq *cpu_halt; | 497 | qemu_irq *cpu_halt; |
| 440 | - ram_addr_t ram_offset, prom_offset; | 498 | + ram_addr_t ram_offset; |
| 441 | unsigned long kernel_size; | 499 | unsigned long kernel_size; |
| 442 | - int ret; | ||
| 443 | - char *filename; | ||
| 444 | BlockDriverState *fd[MAX_FD]; | 500 | BlockDriverState *fd[MAX_FD]; |
| 445 | int drive_index; | 501 | int drive_index; |
| 446 | void *fw_cfg; | 502 | void *fw_cfg; |
| @@ -482,33 +538,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | @@ -482,33 +538,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 482 | ram_offset = qemu_ram_alloc(RAM_size); | 538 | ram_offset = qemu_ram_alloc(RAM_size); |
| 483 | cpu_register_physical_memory(0, RAM_size, ram_offset); | 539 | cpu_register_physical_memory(0, RAM_size, ram_offset); |
| 484 | 540 | ||
| 485 | - /* load boot prom */ | ||
| 486 | - prom_offset = qemu_ram_alloc(PROM_SIZE_MAX); | ||
| 487 | - cpu_register_physical_memory(hwdef->slavio_base, | ||
| 488 | - (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & | ||
| 489 | - TARGET_PAGE_MASK, | ||
| 490 | - prom_offset | IO_MEM_ROM); | ||
| 491 | - | ||
| 492 | - if (bios_name == NULL) | ||
| 493 | - bios_name = PROM_FILENAME; | ||
| 494 | - filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); | ||
| 495 | - if (filename) { | ||
| 496 | - ret = load_elf(filename, hwdef->slavio_base - PROM_VADDR, | ||
| 497 | - NULL, NULL, NULL); | ||
| 498 | - if (ret < 0 || ret > PROM_SIZE_MAX) | ||
| 499 | - ret = load_image_targphys(filename, hwdef->slavio_base, | ||
| 500 | - PROM_SIZE_MAX); | ||
| 501 | - qemu_free(filename); | ||
| 502 | - } else { | ||
| 503 | - ret = -1; | ||
| 504 | - } | ||
| 505 | - if (ret < 0 || ret > PROM_SIZE_MAX) { | ||
| 506 | - fprintf(stderr, "qemu: could not load prom '%s'\n", | ||
| 507 | - bios_name); | ||
| 508 | - exit(1); | ||
| 509 | - } | ||
| 510 | - | ||
| 511 | /* set up devices */ | 541 | /* set up devices */ |
| 542 | + prom_init(hwdef->slavio_base, bios_name); | ||
| 543 | + | ||
| 512 | slavio_intctl = slavio_intctl_init(hwdef->intctl_base, | 544 | slavio_intctl = slavio_intctl_init(hwdef->intctl_base, |
| 513 | hwdef->intctl_base + 0x10000ULL, | 545 | hwdef->intctl_base + 0x10000ULL, |
| 514 | &hwdef->intbit_to_level[0], | 546 | &hwdef->intbit_to_level[0], |
| @@ -1227,10 +1259,8 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1227,10 +1259,8 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1227 | qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq, | 1259 | qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq, |
| 1228 | espdma_irq, ledma_irq; | 1260 | espdma_irq, ledma_irq; |
| 1229 | qemu_irq *esp_reset, *le_reset; | 1261 | qemu_irq *esp_reset, *le_reset; |
| 1230 | - ram_addr_t ram_offset, prom_offset; | 1262 | + ram_addr_t ram_offset; |
| 1231 | unsigned long kernel_size; | 1263 | unsigned long kernel_size; |
| 1232 | - int ret; | ||
| 1233 | - char *filename; | ||
| 1234 | void *fw_cfg; | 1264 | void *fw_cfg; |
| 1235 | 1265 | ||
| 1236 | /* init CPUs */ | 1266 | /* init CPUs */ |
| @@ -1269,33 +1299,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1269,33 +1299,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1269 | ram_offset = qemu_ram_alloc(RAM_size); | 1299 | ram_offset = qemu_ram_alloc(RAM_size); |
| 1270 | cpu_register_physical_memory(0, RAM_size, ram_offset); | 1300 | cpu_register_physical_memory(0, RAM_size, ram_offset); |
| 1271 | 1301 | ||
| 1272 | - /* load boot prom */ | ||
| 1273 | - prom_offset = qemu_ram_alloc(PROM_SIZE_MAX); | ||
| 1274 | - cpu_register_physical_memory(hwdef->slavio_base, | ||
| 1275 | - (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & | ||
| 1276 | - TARGET_PAGE_MASK, | ||
| 1277 | - prom_offset | IO_MEM_ROM); | ||
| 1278 | - | ||
| 1279 | - if (bios_name == NULL) | ||
| 1280 | - bios_name = PROM_FILENAME; | ||
| 1281 | - filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); | ||
| 1282 | - if (filename) { | ||
| 1283 | - ret = load_elf(filename, hwdef->slavio_base - PROM_VADDR, | ||
| 1284 | - NULL, NULL, NULL); | ||
| 1285 | - if (ret < 0 || ret > PROM_SIZE_MAX) | ||
| 1286 | - ret = load_image_targphys(filename, hwdef->slavio_base, | ||
| 1287 | - PROM_SIZE_MAX); | ||
| 1288 | - qemu_free(filename); | ||
| 1289 | - } else { | ||
| 1290 | - ret = -1; | ||
| 1291 | - } | ||
| 1292 | - if (ret < 0 || ret > PROM_SIZE_MAX) { | ||
| 1293 | - fprintf(stderr, "qemu: could not load prom '%s'\n", | ||
| 1294 | - bios_name); | ||
| 1295 | - exit(1); | ||
| 1296 | - } | ||
| 1297 | - | ||
| 1298 | /* set up devices */ | 1302 | /* set up devices */ |
| 1303 | + prom_init(hwdef->slavio_base, bios_name); | ||
| 1304 | + | ||
| 1299 | sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs); | 1305 | sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs); |
| 1300 | 1306 | ||
| 1301 | for (i = 0; i < MAX_IOUNITS; i++) | 1307 | for (i = 0; i < MAX_IOUNITS; i++) |
| @@ -1448,10 +1454,8 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1448,10 +1454,8 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1448 | qemu_irq *cpu_irqs, *slavio_irq, espdma_irq, ledma_irq; | 1454 | qemu_irq *cpu_irqs, *slavio_irq, espdma_irq, ledma_irq; |
| 1449 | qemu_irq *esp_reset, *le_reset; | 1455 | qemu_irq *esp_reset, *le_reset; |
| 1450 | qemu_irq fdc_tc; | 1456 | qemu_irq fdc_tc; |
| 1451 | - ram_addr_t ram_offset, prom_offset; | 1457 | + ram_addr_t ram_offset; |
| 1452 | unsigned long kernel_size; | 1458 | unsigned long kernel_size; |
| 1453 | - int ret; | ||
| 1454 | - char *filename; | ||
| 1455 | BlockDriverState *fd[MAX_FD]; | 1459 | BlockDriverState *fd[MAX_FD]; |
| 1456 | int drive_index; | 1460 | int drive_index; |
| 1457 | void *fw_cfg; | 1461 | void *fw_cfg; |
| @@ -1483,33 +1487,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1483,33 +1487,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1483 | ram_offset = qemu_ram_alloc(RAM_size); | 1487 | ram_offset = qemu_ram_alloc(RAM_size); |
| 1484 | cpu_register_physical_memory(0, RAM_size, ram_offset); | 1488 | cpu_register_physical_memory(0, RAM_size, ram_offset); |
| 1485 | 1489 | ||
| 1486 | - /* load boot prom */ | ||
| 1487 | - prom_offset = qemu_ram_alloc(PROM_SIZE_MAX); | ||
| 1488 | - cpu_register_physical_memory(hwdef->slavio_base, | ||
| 1489 | - (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & | ||
| 1490 | - TARGET_PAGE_MASK, | ||
| 1491 | - prom_offset | IO_MEM_ROM); | ||
| 1492 | - | ||
| 1493 | - if (bios_name == NULL) | ||
| 1494 | - bios_name = PROM_FILENAME; | ||
| 1495 | - filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); | ||
| 1496 | - if (filename) { | ||
| 1497 | - ret = load_elf(filename, hwdef->slavio_base - PROM_VADDR, | ||
| 1498 | - NULL, NULL, NULL); | ||
| 1499 | - if (ret < 0 || ret > PROM_SIZE_MAX) | ||
| 1500 | - ret = load_image_targphys(filename, hwdef->slavio_base, | ||
| 1501 | - PROM_SIZE_MAX); | ||
| 1502 | - qemu_free(filename); | ||
| 1503 | - } else { | ||
| 1504 | - ret = -1; | ||
| 1505 | - } | ||
| 1506 | - if (ret < 0 || ret > PROM_SIZE_MAX) { | ||
| 1507 | - fprintf(stderr, "qemu: could not load prom '%s'\n", | ||
| 1508 | - filename); | ||
| 1509 | - exit(1); | ||
| 1510 | - } | ||
| 1511 | - | ||
| 1512 | /* set up devices */ | 1490 | /* set up devices */ |
| 1491 | + prom_init(hwdef->slavio_base, bios_name); | ||
| 1492 | + | ||
| 1513 | slavio_intctl = sun4c_intctl_init(hwdef->intctl_base, | 1493 | slavio_intctl = sun4c_intctl_init(hwdef->intctl_base, |
| 1514 | &slavio_irq, cpu_irqs); | 1494 | &slavio_irq, cpu_irqs); |
| 1515 | 1495 |