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 11b38d15f1a..74b1a94eb99 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 9ce4a5ac940..ca135ac39bf 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 696c9192c90..29037db7b5b 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 515806fbb5d..5d20333d738 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 2c425ffe9bb..49e5b211f9b 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 2e7fb30efb5..621268de4c5 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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 Bf7Jj0 literal 0 Hc-jL100001 diff --git a/vl.h b/vl.h index 6f6aba75b86..85d0cf47330 100644 --- a/vl.h +++ b/vl.h @@ -137,7 +137,7 @@ extern int win2k_install_hack; /* XXX: make it dynamic */ #if defined (TARGET_PPC) -#define BIOS_SIZE (512 * 1024) +#define BIOS_SIZE ((512 + 32) * 1024) #elif defined(TARGET_MIPS) #define BIOS_SIZE (128 * 1024) #else @@ -596,7 +596,8 @@ static inline void dpy_resize(DisplayState *s, int w, int h) } 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); void vga_update_display(void); void vga_invalidate_display(void); void vga_screen_dump(const char *filename); -- 2.39.5