From: Jon Smirl <jonsmirl@gmail.com> When detecting the boot video device, allow for the case of multiple cards on the same bus. Check each candidate to make sure that the card is active. Signed-off-by: Jon Smirl <jonsmirl@gmail.com> Signed-off-by: Andrew Morton <akpm@osdl.org> --- 25-akpm/arch/i386/pci/fixup.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) diff -puN arch/i386/pci/fixup.c~handle-multiple-video-cards-on-the-same-bus arch/i386/pci/fixup.c --- 25/arch/i386/pci/fixup.c~handle-multiple-video-cards-on-the-same-bus 2005-03-17 15:46:54.000000000 -0800 +++ 25-akpm/arch/i386/pci/fixup.c 2005-03-17 15:48:37.000000000 -0800 @@ -343,7 +343,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN /* * Fixup to mark boot BIOS video selected by BIOS before it changes * - * From information provided by "Jon Smirl" <jonsmirl@yahoo.com> + * From information provided by "Jon Smirl" <jonsmirl@gmail.com> * * The standard boot ROM sequence for an x86 machine uses the BIOS * to select an initial video card for boot display. This boot video @@ -354,12 +354,13 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW * is marked here since the boot video device will be the only enabled * video device at this point. - * - */static void __devinit pci_fixup_video(struct pci_dev *pdev) + */ + +static void __devinit pci_fixup_video(struct pci_dev *pdev) { struct pci_dev *bridge; struct pci_bus *bus; - u16 l; + u16 config; if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) return; @@ -369,12 +370,17 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN while (bus) { bridge = bus->self; if (bridge) { - pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &l); - if (!(l & PCI_BRIDGE_CTL_VGA)) + pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, + &config); + if (!(config & PCI_BRIDGE_CTL_VGA)) return; } bus = bus->parent; } - pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; + pci_read_config_word(pdev, PCI_COMMAND, &config); + if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { + pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; + printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); + } } DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); _