With commit 20cde694027e boot video device detection was moved from efifb to x86 and ia64 pci/fixup.c. For dual-GPU Apple computers above above change represents a regression as code in efifb did forcefully override vga_default_device while the merge did not (changed ordering of actions). This stops setting default_vga_device when applying IORESOURCE_ROM_SHADOW (only doing so for the detected boot GPU) and updates logging of boot video device selection, in vgaarb which covers VGA text-mode booting and first half of pci_fixup_video which covers framebuffer mode (EFI, VESA). By setting IORESOURCE_ROM_SHADOW only on effective boot GPU we also corrects a longstanding complaint from intel driver as reported by Andreas: > Does setting the ROM_SHADOW flag on (possibly) the wrong device > have any effect? Yes it does. Removing the line changes a long standing i915 0000:00:02.0: Invalid ROM contents into a i915 0000:00:02.0: BAR 6: can't assign [??? 0x00000000 flags 0x20000000] (bogus alignment). The first is logged at KERN_ERR while the second is at KERN_INFO. Reported-By: Andreas Noever <andreas.noever@xxxxxxxxx> Signed-off-by: Bruno Prémont <bonbons@xxxxxxxxxxxxxxxxx> CC: Matthew Garrett <matthew.garrett@xxxxxxxxxx> CC: stable@xxxxxxxxxxxxxxx # v3.5+ --- Must be applied to stable when upstream commit 20cde694027e7477cc532833e38ab9fcaa83fb64, which is marked for stable, gets applied. Can be applied without patch 1/2 from this series though dropped #ifndefs will cause this patch not to apply cleanly. arch/ia64/pci/fixup.c | 9 +++++---- arch/x86/pci/fixup.c | 9 +++++---- drivers/gpu/vga/vgaarb.c | 4 +++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/arch/ia64/pci/fixup.c b/arch/ia64/pci/fixup.c index ec73b2c..05198f8 100644 --- a/arch/ia64/pci/fixup.c +++ b/arch/ia64/pci/fixup.c @@ -54,8 +54,10 @@ static void pci_fixup_video(struct pci_dev *pdev) continue; if (screen_info.lfb_base >= start && - (screen_info.lfb_base + screen_info.lfb_size) < end) + (screen_info.lfb_base + screen_info.lfb_size) < end) { + dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); vga_set_default_device(pdev); + } } } @@ -79,12 +81,11 @@ static void pci_fixup_video(struct pci_dev *pdev) } bus = bus->parent; } - if (!vga_default_device() || pdev == vga_default_device()) { + if (pdev == vga_default_device()) { 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; - dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); - vga_set_default_device(pdev); + dev_printk(KERN_DEBUG, &pdev->dev, "Video device with shadowed ROM\n"); } } } diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index c61ea57..5b392d2 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c @@ -342,8 +342,10 @@ static void pci_fixup_video(struct pci_dev *pdev) continue; if (screen_info.lfb_base >= start && - (screen_info.lfb_base + screen_info.lfb_size) < end) + (screen_info.lfb_base + screen_info.lfb_size) < end) { + dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); vga_set_default_device(pdev); + } } } @@ -367,12 +369,11 @@ static void pci_fixup_video(struct pci_dev *pdev) } bus = bus->parent; } - if (!vga_default_device() || pdev == vga_default_device()) { + if (pdev == vga_default_device()) { 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; - dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); - vga_set_default_device(pdev); + dev_printk(KERN_DEBUG, &pdev->dev, "Video device with shadowed ROM\n"); } } } diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index 257674d..c6eeed5 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c @@ -580,8 +580,10 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev) * by default if arch doesn't have it's own hook */ if (vga_default == NULL && - ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) + ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) { + pr_info("vgaarb: Boot video device: PCI:%s\n", pci_name(pdev)); vga_set_default_device(pdev); + } vga_arbiter_check_bridge_sharing(vgadev); -- 1.8.5.5 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel