From d5295253b0d2baf190180b08c2a531021af91c99 Mon Sep 17 00:00:00 2001 From: bellard Date: Sun, 3 Jul 2005 14:00:51 +0000 Subject: [PATCH] VGA bios support for PowerPC git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1494 c046a42c-6fe2-441c-8c8c-71466251a162 --- Makefile | 3 ++- hw/mips_r4k.c | 2 +- hw/pc.c | 2 +- hw/ppc_chrp.c | 51 ++++++++++++++++++++++++++++++++++++------------ hw/vga.c | 21 +++++++++++++++++--- hw/vga_int.h | 2 ++ pc-bios/video.x | Bin 0 -> 12192 bytes vl.h | 5 +++-- 8 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 pc-bios/video.x diff --git a/Makefile b/Makefile index 11b38d15f1..74b1a94eb9 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,7 @@ install: all mkdir -p "$(datadir)" install -m 644 pc-bios/bios.bin pc-bios/vgabios.bin \ pc-bios/vgabios-cirrus.bin \ - pc-bios/ppc_rom.bin \ + pc-bios/ppc_rom.bin pc-bios/video.x \ pc-bios/proll.elf \ pc-bios/linux_boot.bin "$(datadir)" mkdir -p "$(docdir)" @@ -121,6 +121,7 @@ tarbin: $(datadir)/vgabios.bin \ $(datadir)/vgabios-cirrus.bin \ $(datadir)/ppc_rom.bin \ + $(datadir)/video.x \ $(datadir)/proll.elf \ $(datadir)/linux_boot.bin \ $(docdir)/qemu-doc.html \ diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c index 9ce4a5ac94..ca135ac39b 100644 --- a/hw/mips_r4k.c +++ b/hw/mips_r4k.c @@ -242,7 +242,7 @@ void mips_r4k_init (int ram_size, int vga_ram_size, int boot_device, isa_pic = pic_init(pic_irq_request, cpu_single_env); serial_init(0x3f8, 4, serial_hds[0]); vga_initialize(NULL, ds, phys_ram_base + ram_size, ram_size, - vga_ram_size); + vga_ram_size, 0, 0); isa_ne2000_init(0x300, 9, &nd_table[0]); } diff --git a/hw/pc.c b/hw/pc.c index 696c9192c9..29037db7b5 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -547,7 +547,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, } } else { vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size, - vga_ram_size); + vga_ram_size, 0, 0); } rtc_state = rtc_init(0x70, 8); diff --git a/hw/ppc_chrp.c b/hw/ppc_chrp.c index 515806fbb5..5d20333d73 100644 --- a/hw/ppc_chrp.c +++ b/hw/ppc_chrp.c @@ -24,6 +24,7 @@ #include "vl.h" #define BIOS_FILENAME "ppc_rom.bin" +#define VGABIOS_FILENAME "video.x" #define NVRAM_SIZE 0x2000 #define KERNEL_LOAD_ADDR 0x01000000 @@ -232,12 +233,13 @@ static void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device, void *pic; m48t59_t *nvram; int PPC_io_memory, unin_memory; - int ret, linux_boot, i; - unsigned long bios_offset; + int linux_boot, i; + unsigned long bios_offset, vga_bios_offset; uint32_t kernel_base, kernel_size, initrd_base, initrd_size; ppc_def_t *def; PCIBus *pci_bus; const char *arch_name; + int vga_bios_size, bios_size; linux_boot = (kernel_filename != NULL); @@ -247,15 +249,36 @@ static void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device, /* allocate and load BIOS */ bios_offset = ram_size + vga_ram_size; snprintf(buf, sizeof(buf), "%s/%s", bios_dir, BIOS_FILENAME); - ret = load_image(buf, phys_ram_base + bios_offset); - if (ret != BIOS_SIZE) { - fprintf(stderr, "qemu: could not load PPC PREP bios '%s'\n", buf); + bios_size = load_image(buf, phys_ram_base + bios_offset); + if (bios_size < 0 || bios_size > BIOS_SIZE) { + fprintf(stderr, "qemu: could not load PowerPC bios '%s'\n", buf); exit(1); } - cpu_register_physical_memory((uint32_t)(-BIOS_SIZE), - BIOS_SIZE, bios_offset | IO_MEM_ROM); - cpu_single_env->nip = 0xfffffffc; - + bios_size = (bios_size + 0xfff) & ~0xfff; + cpu_register_physical_memory((uint32_t)(-bios_size), + bios_size, bios_offset | IO_MEM_ROM); + + /* allocate and load VGA BIOS */ + vga_bios_offset = bios_offset + bios_size; + snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); + vga_bios_size = load_image(buf, phys_ram_base + vga_bios_offset + 8); + if (vga_bios_size < 0) { + /* if no bios is present, we can still work */ + fprintf(stderr, "qemu: warning: could not load VGA bios '%s'\n", buf); + vga_bios_size = 0; + } else { + /* set a specific header (XXX: find real Apple format for NDRV + drivers) */ + phys_ram_base[vga_bios_offset] = 'N'; + phys_ram_base[vga_bios_offset + 1] = 'D'; + phys_ram_base[vga_bios_offset + 2] = 'R'; + phys_ram_base[vga_bios_offset + 3] = 'V'; + cpu_to_be32w((uint32_t *)(phys_ram_base + vga_bios_offset + 4), + vga_bios_size); + vga_bios_size += 8; + } + vga_bios_size = (vga_bios_size + 0xfff) & ~0xfff; + if (linux_boot) { kernel_base = KERNEL_LOAD_ADDR; /* now we can load the kernel */ @@ -321,8 +344,9 @@ static void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device, cpu_register_physical_memory(0xfe000000, 0x00200000, PPC_io_memory); /* init basic PC hardware */ - vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size, - vga_ram_size); + vga_initialize(pci_bus, ds, phys_ram_base + ram_size, + ram_size, vga_ram_size, + vga_bios_offset, vga_bios_size); pic = heathrow_pic_init(&heathrow_pic_mem_index); set_irq = heathrow_pic_set_irq; pci_set_pic(pci_bus, set_irq, pic); @@ -363,8 +387,9 @@ static void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device, cpu_register_physical_memory(0xf8000000, 0x00001000, unin_memory); /* init basic PC hardware */ - vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size, - vga_ram_size); + vga_initialize(pci_bus, ds, phys_ram_base + ram_size, + ram_size, vga_ram_size, + vga_bios_offset, vga_bios_size); pic = openpic_init(NULL, &openpic_mem_index, 1); set_irq = openpic_set_irq; pci_set_pic(pci_bus, set_irq, pic); diff --git a/hw/vga.c b/hw/vga.c index 2c425ffe9b..49e5b211f9 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -1654,8 +1654,11 @@ static void vga_map(PCIDevice *pci_dev, int region_num, uint32_t addr, uint32_t size, int type) { VGAState *s = vga_state; - - cpu_register_physical_memory(addr, s->vram_size, s->vram_offset); + if (region_num == PCI_ROM_SLOT) { + cpu_register_physical_memory(addr, s->bios_size, s->bios_offset); + } else { + cpu_register_physical_memory(addr, s->vram_size, s->vram_offset); + } } void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, @@ -1701,7 +1704,8 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, int vga_initialize(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base, - unsigned long vga_ram_offset, int vga_ram_size) + unsigned long vga_ram_offset, int vga_ram_size, + unsigned long vga_bios_offset, int vga_bios_size) { VGAState *s; @@ -1776,6 +1780,17 @@ int vga_initialize(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base, /* XXX: vga_ram_size must be a power of two */ pci_register_io_region(d, 0, vga_ram_size, PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); + if (vga_bios_size != 0) { + unsigned int bios_total_size; + s->bios_offset = vga_bios_offset; + s->bios_size = vga_bios_size; + /* must be a power of two */ + bios_total_size = 1; + while (bios_total_size < vga_bios_size) + bios_total_size <<= 1; + pci_register_io_region(d, PCI_ROM_SLOT, bios_total_size, + PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); + } } else { #ifdef CONFIG_BOCHS_VBE /* XXX: use optimized standard vga accesses */ diff --git a/hw/vga_int.h b/hw/vga_int.h index 2e7fb30efb..621268de4c 100644 --- a/hw/vga_int.h +++ b/hw/vga_int.h @@ -78,6 +78,8 @@ uint8_t *vram_ptr; \ unsigned long vram_offset; \ unsigned int vram_size; \ + unsigned long bios_offset; \ + unsigned int bios_size; \ uint32_t latch; \ uint8_t sr_index; \ uint8_t sr[256]; \ diff --git a/pc-bios/video.x b/pc-bios/video.x new file mode 100644 index 0000000000000000000000000000000000000000..761aa0c9d47fc3648a64ccfe9b9747b2a3af9572 GIT binary patch literal 12192 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