[SeaBIOS] [PATCH 2/5] bochsvga: handle vmware vga.
Gerd Hoffmann
kraxel at redhat.com
Mon Jan 23 12:30:31 CET 2012
The vmware vga emulated by qemu has a I/O region in pci bar 0.
The framebuffer is in pci bar 1. Handle that by checking the
type of bar 0 in case it is a I/O bar use bar 1 instead.
Also make bochsbios report lfb size in debug output.
Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
---
vgasrc/bochsvga.c | 18 +++++++++++++-----
1 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c
index 82629b9..274c93b 100644
--- a/vgasrc/bochsvga.c
+++ b/vgasrc/bochsvga.c
@@ -124,10 +124,17 @@ bochsvga_init(void)
dispi_write(VBE_DISPI_INDEX_ID, VBE_DISPI_ID5);
u32 lfb_addr;
- if (CONFIG_VGA_PCI)
- lfb_addr = (pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_0)
- & PCI_BASE_ADDRESS_MEM_MASK);
- else
+ if (CONFIG_VGA_PCI) {
+ u32 bar = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_0);
+ if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) {
+ lfb_addr = bar & PCI_BASE_ADDRESS_MEM_MASK;
+ dprintf(1, "VBE DISPI: bdf %x, bar 0\n", GET_GLOBAL(VgaBDF));
+ } else {
+ bar = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_1);
+ lfb_addr = bar & PCI_BASE_ADDRESS_MEM_MASK;
+ dprintf(1, "VBE DISPI: bdf %x, bar 1\n", GET_GLOBAL(VgaBDF));
+ }
+ } else
lfb_addr = VBE_DISPI_LFB_PHYSICAL_ADDRESS;
SET_VGA(VBE_framebuffer, lfb_addr);
@@ -135,7 +142,8 @@ bochsvga_init(void)
SET_VGA(VBE_total_memory, totalmem * 64 * 1024);
SET_VGA(VBE_capabilities, VBE_CAPABILITY_8BIT_DAC);
- dprintf(1, "VBE DISPI detected. lfb_addr=%x\n", lfb_addr);
+ dprintf(1, "VBE DISPI: lfb_addr=%x, size %d MB\n",
+ lfb_addr, totalmem / 16);
return 0;
}
--
1.7.1
More information about the SeaBIOS
mailing list