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,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