vgaarb: Add support for setting the default video device (v2)
authorMatthew Garrett <mjg@redhat.com>
Mon, 16 Apr 2012 20:26:02 +0000 (16:26 -0400)
committerDave Airlie <airlied@redhat.com>
Tue, 24 Apr 2012 08:50:15 +0000 (09:50 +0100)
The default VGA device is a somewhat fluid concept on platforms with
multiple GPUs. Add support for setting it so switching code can update
things appropriately, and make sure that the sysfs code returns the right
device if it's changed.

v2: Updated to fix builds when __ARCH_HAS_VGA_DEFAULT_DEVICE is false.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Acked-by: H. Peter Anvin <hpa@zytor.com>
Acked-by: benh@kernel.crashing.org
Cc: airlied@redhat.com
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/vga/vgaarb.c
drivers/pci/pci-sysfs.c
include/linux/vgaarb.h

index 111d956d8e7d0d919d088405ddeaf3b341c87092..e223b96fa6a041fcb6502bfae244225235906c3b 100644 (file)
@@ -136,6 +136,11 @@ struct pci_dev *vga_default_device(void)
 {
        return vga_default;
 }
+
+void vga_set_default_device(struct pci_dev *pdev)
+{
+       vga_default = pdev;
+}
 #endif
 
 static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
@@ -605,10 +610,12 @@ static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
                goto bail;
        }
 
+#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
        if (vga_default == pdev) {
                pci_dev_put(vga_default);
                vga_default = NULL;
        }
+#endif
 
        if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
                vga_decode_count--;
index a55e248618cd00e7de495a078c3bb59d177123f4..86c63fe45d11bf22225afffd1317777edefcc8c7 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/security.h>
 #include <linux/pci-aspm.h>
 #include <linux/slab.h>
+#include <linux/vgaarb.h>
 #include "pci.h"
 
 static int sysfs_initialized;  /* = 0 */
@@ -417,6 +418,10 @@ static ssize_t
 boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
+       struct pci_dev *vga_dev = vga_default_device();
+
+       if (vga_dev)
+               return sprintf(buf, "%u\n", (pdev == vga_dev));
 
        return sprintf(buf, "%u\n",
                !!(pdev->resource[PCI_ROM_RESOURCE].flags &
index 9c3120dca294ddc41d2a131540d8135cf001de89..759a25ba05396eab73a29554f1afce917cac7ec7 100644 (file)
@@ -31,6 +31,7 @@
 #ifndef LINUX_VGA_H
 #define LINUX_VGA_H
 
+#include <video/vga.h>
 
 /* Legacy VGA regions */
 #define VGA_RSRC_NONE         0x00
@@ -181,6 +182,7 @@ extern void vga_put(struct pci_dev *pdev, unsigned int rsrc);
 
 #ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
 extern struct pci_dev *vga_default_device(void);
+extern void vga_set_default_device(struct pci_dev *pdev);
 #endif
 
 /**