Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/PCI: Set IORESOURCE_ROM_SHADOW only for the default VGA device

Setting the IORESOURCE_ROM_SHADOW flag on a VGA card other than the primary
prevents it from reading its own ROM. It will get the content of the
shadow ROM at C000 instead, which is of the primary VGA card and the driver
of the secondary card will bail out.

Fix this by checking if the arch code or vga-arbitration has already
determined the vga_default_device, if so only apply the fix to this primary
video device and let the comment reflect this.

[bhelgaas: add subject, split x86 & ia64 into separate patches]
Signed-off-by: Sander Eikelenboom <linux@eikelenboom.it>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

authored by

Sander Eikelenboom and committed by
Bjorn Helgaas
d8801e4d 5ee09efe

+10 -8
+10 -8
arch/x86/pci/fixup.c
··· 313 313 * IORESOURCE_ROM_SHADOW is used to associate the boot video 314 314 * card with this copy. On laptops this copy has to be used since 315 315 * the main ROM may be compressed or combined with another image. 316 - * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW 317 - * is marked here since the boot video device will be the only enabled 318 - * video device at this point. 316 + * See pci_map_rom() for use of this flag. Before marking the device 317 + * with IORESOURCE_ROM_SHADOW check if a vga_default_device is already set 318 + * by either arch cde or vga-arbitration, if so only apply the fixup to this 319 + * already determined primary video card. 319 320 */ 320 321 321 322 static void pci_fixup_video(struct pci_dev *pdev) ··· 347 346 } 348 347 bus = bus->parent; 349 348 } 350 - pci_read_config_word(pdev, PCI_COMMAND, &config); 351 - if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { 352 - pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; 353 - dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); 354 - if (!vga_default_device()) 349 + if (!vga_default_device() || pdev == vga_default_device()) { 350 + pci_read_config_word(pdev, PCI_COMMAND, &config); 351 + if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { 352 + pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; 353 + dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); 355 354 vga_set_default_device(pdev); 355 + } 356 356 } 357 357 } 358 358 DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,