vgaarb: Don't default exclusively to first video device with mem+io
authorBruno Prémont <bonbons@linux-vserver.org>
Sun, 24 Aug 2014 21:09:53 +0000 (23:09 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 16 Sep 2014 19:06:18 +0000 (13:06 -0600)
commit86fd887b7fe350819dae5b55e7fef05b511c8656
tree73888d1d65e169f1eb18316faf98df372f5557b3
parent52addcf9d6669fa439387610bc65c92fa0980cef
vgaarb: Don't default exclusively to first video device with mem+io

Commit 20cde694027e ("x86, ia64: Move EFI_FB vga_default_device()
initialization to pci_vga_fixup()") moved boot video device detection from
efifb to x86 and ia64 pci/fixup.c.

For dual-GPU Apple computers above change represents a regression as code
in efifb did forcefully override vga_default_device while the merge did not
(vgaarb happens prior to PCI fixup).

To improve on initial device selection by vgaarb (it cannot know if PCI
device not behind bridges see/decode legacy VGA I/O or not), move the
screen_info based check from pci_video_fixup() to vgaarb's init function and
use it to refine/override decision taken while adding the individual PCI
VGA devices.  This way PCI fixup has no reason to adjust vga_default_device
anymore but can depend on its value for flagging shadowed VBIOS.

This has the nice benefit of removing duplicated code but does introduce a
#if defined() block in vgaarb.  Not all architectures have screen_info and
would cause compile to fail without it.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=84461
Reported-and-Tested-By: Andreas Noever <andreas.noever@gmail.com>
Signed-off-by: Bruno Prémont <bonbons@linux-vserver.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
CC: Matthew Garrett <matthew.garrett@nebula.com>
CC: stable@vger.kernel.org # v3.5+
arch/ia64/pci/fixup.c
arch/x86/pci/fixup.c
drivers/gpu/vga/vgaarb.c