From 4c1410d59c6d02882b97ded8c3144bfbd039e0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Wed, 12 Mar 2014 18:43:01 +0100 Subject: prep: Update ppc_rom.bin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This increases file size from 512 KiB to 1 MiB. Signed-off-by: Andreas Färber --- pc-bios/ppc_rom.bin | Bin 524288 -> 1048576 bytes roms/openhackware | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pc-bios/ppc_rom.bin b/pc-bios/ppc_rom.bin index d378d9a95e..e7f769328b 100644 Binary files a/pc-bios/ppc_rom.bin and b/pc-bios/ppc_rom.bin differ diff --git a/roms/openhackware b/roms/openhackware index e9829b5584..1af7e55425 160000 --- a/roms/openhackware +++ b/roms/openhackware @@ -1 +1 @@ -Subproject commit e9829b5584169ad14df2ca8776b87f4985aa9f06 +Subproject commit 1af7e55425e58a6dcb5133b092fcf16f8c654fb9 -- cgit v1.2.1 From d0b25425749d5525b2ba6d9d966d8800a5643b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Tue, 5 Nov 2013 00:09:45 +0100 Subject: raven: Move BIOS loading from board code to PCI host MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Raven datasheet explains where firmware lives in system memory, so do it there instead of in board code. Other boards using the same PCI host will not have to copy the firmware loading code. Signed-off-by: Hervé Poussineau [AF: Drop BIOS size workaround in favor of replacing our firmware blob] Signed-off-by: Andreas Färber --- hw/pci-host/prep.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ hw/ppc/prep.c | 46 ++++++---------------------------------------- 2 files changed, 57 insertions(+), 40 deletions(-) diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c index 0c948e2c30..94fdffa777 100644 --- a/hw/pci-host/prep.c +++ b/hw/pci-host/prep.c @@ -28,7 +28,9 @@ #include "hw/pci/pci_bus.h" #include "hw/pci/pci_host.h" #include "hw/i386/pc.h" +#include "hw/loader.h" #include "exec/address-spaces.h" +#include "elf.h" #define TYPE_RAVEN_PCI_DEVICE "raven" #define TYPE_RAVEN_PCI_HOST_BRIDGE "raven-pcihost" @@ -38,6 +40,10 @@ typedef struct RavenPCIState { PCIDevice dev; + + uint32_t elf_machine; + char *bios_name; + MemoryRegion bios; } RavenPCIState; #define RAVEN_PCI_HOST_BRIDGE(obj) \ @@ -52,6 +58,8 @@ typedef struct PRePPCIState { RavenPCIState pci_dev; } PREPPCIState; +#define BIOS_SIZE (1024 * 1024) + static inline uint32_t PPC_PCIIO_config(hwaddr addr) { int i; @@ -169,10 +177,45 @@ static void raven_pcihost_initfn(Object *obj) static int raven_init(PCIDevice *d) { + RavenPCIState *s = RAVEN_PCI_DEVICE(d); + char *filename; + int bios_size = -1; + d->config[0x0C] = 0x08; // cache_line_size d->config[0x0D] = 0x10; // latency_timer d->config[0x34] = 0x00; // capabilities_pointer + memory_region_init_ram(&s->bios, OBJECT(s), "bios", BIOS_SIZE); + memory_region_set_readonly(&s->bios, true); + memory_region_add_subregion(get_system_memory(), (uint32_t)(-BIOS_SIZE), + &s->bios); + vmstate_register_ram_global(&s->bios); + if (s->bios_name) { + filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, s->bios_name); + if (filename) { + if (s->elf_machine != EM_NONE) { + bios_size = load_elf(filename, NULL, NULL, NULL, + NULL, NULL, 1, s->elf_machine, 0); + } + if (bios_size < 0) { + bios_size = get_image_size(filename); + if (bios_size > 0 && bios_size <= BIOS_SIZE) { + hwaddr bios_addr; + bios_size = (bios_size + 0xfff) & ~0xfff; + bios_addr = (uint32_t)(-BIOS_SIZE); + bios_size = load_image_targphys(filename, bios_addr, + bios_size); + } + } + } + if (bios_size < 0 || bios_size > BIOS_SIZE) { + hw_error("qemu: could not load bios image '%s'\n", s->bios_name); + } + if (filename) { + g_free(filename); + } + } + return 0; } @@ -212,12 +255,20 @@ static const TypeInfo raven_info = { .class_init = raven_class_init, }; +static Property raven_pcihost_properties[] = { + DEFINE_PROP_UINT32("elf-machine", PREPPCIState, pci_dev.elf_machine, + EM_NONE), + DEFINE_PROP_STRING("bios-name", PREPPCIState, pci_dev.bios_name), + DEFINE_PROP_END_OF_LIST() +}; + static void raven_pcihost_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); dc->realize = raven_pcihost_realizefn; + dc->props = raven_pcihost_properties; dc->fw_name = "pci"; } diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c index 9f8538cd20..81e13cb4ac 100644 --- a/hw/ppc/prep.c +++ b/hw/ppc/prep.c @@ -456,7 +456,6 @@ static void ppc_prep_init(QEMUMachineInitArgs *args) MemoryRegion *sysmem = get_system_memory(); PowerPCCPU *cpu = NULL; CPUPPCState *env = NULL; - char *filename; nvram_t nvram; M48t59State *m48t59; MemoryRegion *PPC_io_memory = g_new(MemoryRegion, 1); @@ -464,9 +463,8 @@ static void ppc_prep_init(QEMUMachineInitArgs *args) #if 0 MemoryRegion *xcsr = g_new(MemoryRegion, 1); #endif - int linux_boot, i, nb_nics1, bios_size; + int linux_boot, i, nb_nics1; MemoryRegion *ram = g_new(MemoryRegion, 1); - MemoryRegion *bios = g_new(MemoryRegion, 1); uint32_t kernel_base, initrd_base; long kernel_size, initrd_size; DeviceState *dev; @@ -509,43 +507,6 @@ static void ppc_prep_init(QEMUMachineInitArgs *args) vmstate_register_ram_global(ram); memory_region_add_subregion(sysmem, 0, ram); - /* allocate and load BIOS */ - memory_region_init_ram(bios, NULL, "ppc_prep.bios", BIOS_SIZE); - memory_region_set_readonly(bios, true); - memory_region_add_subregion(sysmem, (uint32_t)(-BIOS_SIZE), bios); - vmstate_register_ram_global(bios); - if (bios_name == NULL) - bios_name = BIOS_FILENAME; - filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); - if (filename) { - bios_size = load_elf(filename, NULL, NULL, NULL, - NULL, NULL, 1, ELF_MACHINE, 0); - if (bios_size < 0) { - bios_size = get_image_size(filename); - if (bios_size > 0 && bios_size <= BIOS_SIZE) { - hwaddr bios_addr; - bios_size = (bios_size + 0xfff) & ~0xfff; - bios_addr = (uint32_t)(-bios_size); - bios_size = load_image_targphys(filename, bios_addr, bios_size); - } - if (bios_size > BIOS_SIZE) { - fprintf(stderr, "qemu: PReP bios '%s' is too large (0x%x)\n", - bios_name, bios_size); - exit(1); - } - } - } else { - bios_size = -1; - } - if (bios_size < 0 && !qtest_enabled()) { - fprintf(stderr, "qemu: could not load PPC PReP bios '%s'\n", - bios_name); - exit(1); - } - if (filename) { - g_free(filename); - } - if (linux_boot) { kernel_base = KERNEL_LOAD_ADDR; /* now we can load the kernel */ @@ -593,6 +554,11 @@ static void ppc_prep_init(QEMUMachineInitArgs *args) } dev = qdev_create(NULL, "raven-pcihost"); + if (bios_name == NULL) { + bios_name = BIOS_FILENAME; + } + qdev_prop_set_string(dev, "bios-name", bios_name); + qdev_prop_set_uint32(dev, "elf-machine", ELF_MACHINE); pcihost = PCI_HOST_BRIDGE(dev); object_property_add_child(qdev_get_machine(), "raven", OBJECT(dev), NULL); qdev_init_nofail(dev); -- cgit v1.2.1