Commit 1baffa46ed7f63e4066da37b0ca136c87d7c798c

Authored by Blue Swirl
1 parent daa65491

Sparc64: convert boot prom to qdev

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing 1 changed file with 62 additions and 29 deletions
hw/sun4u.c
@@ -32,6 +32,7 @@ @@ -32,6 +32,7 @@
32 #include "boards.h" 32 #include "boards.h"
33 #include "firmware_abi.h" 33 #include "firmware_abi.h"
34 #include "fw_cfg.h" 34 #include "fw_cfg.h"
  35 +#include "sysbus.h"
35 36
36 //#define DEBUG_IRQ 37 //#define DEBUG_IRQ
37 38
@@ -342,6 +343,64 @@ static void pci_ebus_register(void) @@ -342,6 +343,64 @@ static void pci_ebus_register(void)
342 343
343 device_init(pci_ebus_register); 344 device_init(pci_ebus_register);
344 345
  346 +/* Boot PROM (OpenBIOS) */
  347 +static void prom_init(target_phys_addr_t addr, const char *bios_name)
  348 +{
  349 + DeviceState *dev;
  350 + SysBusDevice *s;
  351 + char *filename;
  352 + int ret;
  353 +
  354 + dev = qdev_create(NULL, "openprom");
  355 + qdev_init(dev);
  356 + s = sysbus_from_qdev(dev);
  357 +
  358 + sysbus_mmio_map(s, 0, addr);
  359 +
  360 + /* load boot prom */
  361 + if (bios_name == NULL) {
  362 + bios_name = PROM_FILENAME;
  363 + }
  364 + filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
  365 + if (filename) {
  366 + ret = load_elf(filename, addr - PROM_VADDR, NULL, NULL, NULL);
  367 + if (ret < 0 || ret > PROM_SIZE_MAX) {
  368 + ret = load_image_targphys(filename, addr, PROM_SIZE_MAX);
  369 + }
  370 + qemu_free(filename);
  371 + } else {
  372 + ret = -1;
  373 + }
  374 + if (ret < 0 || ret > PROM_SIZE_MAX) {
  375 + fprintf(stderr, "qemu: could not load prom '%s'\n", bios_name);
  376 + exit(1);
  377 + }
  378 +}
  379 +
  380 +static void prom_init1(SysBusDevice *dev)
  381 +{
  382 + ram_addr_t prom_offset;
  383 +
  384 + prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
  385 + sysbus_init_mmio(dev, PROM_SIZE_MAX, prom_offset | IO_MEM_ROM);
  386 +}
  387 +
  388 +static SysBusDeviceInfo prom_info = {
  389 + .init = prom_init1,
  390 + .qdev.name = "openprom",
  391 + .qdev.size = sizeof(SysBusDevice),
  392 + .qdev.props = (Property[]) {
  393 + {/* end of property list */}
  394 + }
  395 +};
  396 +
  397 +static void prom_register_devices(void)
  398 +{
  399 + sysbus_register_withprop(&prom_info);
  400 +}
  401 +
  402 +device_init(prom_register_devices);
  403 +
345 static void sun4uv_init(ram_addr_t RAM_size, 404 static void sun4uv_init(ram_addr_t RAM_size,
346 const char *boot_devices, 405 const char *boot_devices,
347 const char *kernel_filename, const char *kernel_cmdline, 406 const char *kernel_filename, const char *kernel_cmdline,
@@ -349,11 +408,10 @@ static void sun4uv_init(ram_addr_t RAM_size, @@ -349,11 +408,10 @@ static void sun4uv_init(ram_addr_t RAM_size,
349 const struct hwdef *hwdef) 408 const struct hwdef *hwdef)
350 { 409 {
351 CPUState *env; 410 CPUState *env;
352 - char *filename;  
353 m48t59_t *nvram; 411 m48t59_t *nvram;
354 - int ret, linux_boot; 412 + int linux_boot;
355 unsigned int i; 413 unsigned int i;
356 - ram_addr_t ram_offset, prom_offset; 414 + ram_addr_t ram_offset;
357 long initrd_size, kernel_size; 415 long initrd_size, kernel_size;
358 PCIBus *pci_bus, *pci_bus2, *pci_bus3; 416 PCIBus *pci_bus, *pci_bus2, *pci_bus3;
359 QEMUBH *bh; 417 QEMUBH *bh;
@@ -400,32 +458,7 @@ static void sun4uv_init(ram_addr_t RAM_size, @@ -400,32 +458,7 @@ static void sun4uv_init(ram_addr_t RAM_size,
400 ram_offset = qemu_ram_alloc(RAM_size); 458 ram_offset = qemu_ram_alloc(RAM_size);
401 cpu_register_physical_memory(0, RAM_size, ram_offset); 459 cpu_register_physical_memory(0, RAM_size, ram_offset);
402 460
403 - prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);  
404 - cpu_register_physical_memory(hwdef->prom_addr,  
405 - (PROM_SIZE_MAX + TARGET_PAGE_SIZE) &  
406 - TARGET_PAGE_MASK,  
407 - prom_offset | IO_MEM_ROM);  
408 -  
409 - if (bios_name == NULL)  
410 - bios_name = PROM_FILENAME;  
411 - filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);  
412 - if (filename) {  
413 - ret = load_elf(filename, hwdef->prom_addr - PROM_VADDR,  
414 - NULL, NULL, NULL);  
415 - if (ret < 0) {  
416 - ret = load_image_targphys(filename, hwdef->prom_addr,  
417 - (PROM_SIZE_MAX + TARGET_PAGE_SIZE) &  
418 - TARGET_PAGE_MASK);  
419 - }  
420 - qemu_free(filename);  
421 - } else {  
422 - ret = -1;  
423 - }  
424 - if (ret < 0) {  
425 - fprintf(stderr, "qemu: could not load prom '%s'\n",  
426 - bios_name);  
427 - exit(1);  
428 - } 461 + prom_init(hwdef->prom_addr, bios_name);
429 462
430 kernel_size = 0; 463 kernel_size = 0;
431 initrd_size = 0; 464 initrd_size = 0;