Commit f48f656949894aa4d440f4f2a5e5bf7b34106785

Authored by Blue Swirl
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 422  
423 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 483 static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
426 484 const char *boot_device,
427 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 495 qemu_irq *esp_reset, *le_reset;
438 496 qemu_irq fdc_tc;
439 497 qemu_irq *cpu_halt;
440   - ram_addr_t ram_offset, prom_offset;
  498 + ram_addr_t ram_offset;
441 499 unsigned long kernel_size;
442   - int ret;
443   - char *filename;
444 500 BlockDriverState *fd[MAX_FD];
445 501 int drive_index;
446 502 void *fw_cfg;
... ... @@ -482,33 +538,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
482 538 ram_offset = qemu_ram_alloc(RAM_size);
483 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 541 /* set up devices */
  542 + prom_init(hwdef->slavio_base, bios_name);
  543 +
512 544 slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
513 545 hwdef->intctl_base + 0x10000ULL,
514 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 1259 qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq,
1228 1260 espdma_irq, ledma_irq;
1229 1261 qemu_irq *esp_reset, *le_reset;
1230   - ram_addr_t ram_offset, prom_offset;
  1262 + ram_addr_t ram_offset;
1231 1263 unsigned long kernel_size;
1232   - int ret;
1233   - char *filename;
1234 1264 void *fw_cfg;
1235 1265  
1236 1266 /* init CPUs */
... ... @@ -1269,33 +1299,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1269 1299 ram_offset = qemu_ram_alloc(RAM_size);
1270 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 1302 /* set up devices */
  1303 + prom_init(hwdef->slavio_base, bios_name);
  1304 +
1299 1305 sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs);
1300 1306  
1301 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 1454 qemu_irq *cpu_irqs, *slavio_irq, espdma_irq, ledma_irq;
1449 1455 qemu_irq *esp_reset, *le_reset;
1450 1456 qemu_irq fdc_tc;
1451   - ram_addr_t ram_offset, prom_offset;
  1457 + ram_addr_t ram_offset;
1452 1458 unsigned long kernel_size;
1453   - int ret;
1454   - char *filename;
1455 1459 BlockDriverState *fd[MAX_FD];
1456 1460 int drive_index;
1457 1461 void *fw_cfg;
... ... @@ -1483,33 +1487,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1483 1487 ram_offset = qemu_ram_alloc(RAM_size);
1484 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 1490 /* set up devices */
  1491 + prom_init(hwdef->slavio_base, bios_name);
  1492 +
1513 1493 slavio_intctl = sun4c_intctl_init(hwdef->intctl_base,
1514 1494 &slavio_irq, cpu_irqs);
1515 1495  
... ...