In case no VGA device was found look for other display devices, in both pci initialization and in vgabios rom scan.
Signed-off-by: Gerd Hoffmann kraxel@redhat.com --- src/fw/pciinit.c | 15 +++++++++++---- src/optionroms.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c index 3a2f747984..e9518741b5 100644 --- a/src/fw/pciinit.c +++ b/src/fw/pciinit.c @@ -431,6 +431,7 @@ static void pci_bios_init_devices(void) static void pci_enable_default_vga(void) { struct pci_device *pci; + int is_vga = 1;
foreachpci(pci) { if (is_pci_vga(pci)) { @@ -441,16 +442,22 @@ static void pci_enable_default_vga(void)
pci = pci_find_class(PCI_CLASS_DISPLAY_VGA); if (!pci) { - dprintf(1, "PCI: No VGA devices found\n"); - return; + dprintf(1, "PCI: No VGA devices found, trying other display devices\n"); + pci = pci_find_class(PCI_CLASS_DISPLAY_OTHER); + if (!pci) { + dprintf(1, "PCI: No other display devices found\n"); + return; + } + is_vga = 0; }
- dprintf(1, "PCI: Enabling %pP for primary VGA\n", pci); + dprintf(1, "PCI: Enabling %pP for primary %s\n", pci + , is_vga ? "VGA" : "display");
pci_config_maskw(pci->bdf, PCI_COMMAND, 0, PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
- while (pci->parent) { + while (is_vga && pci->parent) { pci = pci->parent;
dprintf(1, "PCI: Setting VGA enable on bridge %pP\n", pci); diff --git a/src/optionroms.c b/src/optionroms.c index 092393a56c..7febd7fcf8 100644 --- a/src/optionroms.c +++ b/src/optionroms.c @@ -224,6 +224,17 @@ is_pci_vga(struct pci_device *pci) return 1; }
+int +is_pci_display_other(struct pci_device *pci) +{ + if (pci->class != PCI_CLASS_DISPLAY_OTHER) + return 0; + u16 cmd = pci_config_readw(pci->bdf, PCI_COMMAND); + if (!(cmd & PCI_COMMAND_IO && cmd & PCI_COMMAND_MEMORY)) + return 0; + return 1; +} + // Copy a rom to its permanent location below 1MiB static struct rom_header * copy_rom(struct rom_header *rom) @@ -350,7 +361,9 @@ optionrom_setup(void) // Find and deploy PCI roms. struct pci_device *pci; foreachpci(pci) { - if (pci->class == PCI_CLASS_DISPLAY_VGA || pci->have_driver) + if (pci->class == PCI_CLASS_DISPLAY_VGA || + pci->class == PCI_CLASS_DISPLAY_OTHER || + pci->have_driver) continue; init_pcirom(pci, 0, sources); } @@ -404,6 +417,8 @@ struct rom_header *VgaROM; void vgarom_setup(void) { + int have_vga = 0; + if (! CONFIG_OPTIONROMS) return;
@@ -425,8 +440,20 @@ vgarom_setup(void) continue; vgahook_setup(pci); init_pcirom(pci, 1, NULL); + have_vga = 1; break; } + if (!have_vga) { + // no VGA, try fallback to display + dprintf(1, "no vga, try display\n"); + foreachpci(pci) { + if (!is_pci_display_other(pci)) + continue; + vgahook_setup(pci); + init_pcirom(pci, 1, NULL); + break; + } + }
// Find and deploy CBFS vga-style roms not associated with a device. run_file_roms("vgaroms/", 1, NULL);