]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/i915: Recognise non-VGA display devices
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 20 Jan 2011 13:09:12 +0000 (13:09 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 17 Feb 2011 22:47:31 +0000 (14:47 -0800)
commit 934f992c763ae1e5eefcce8af769c16444085df7 upstream.

Starting with SandyBridge (though possible with earlier hacked BIOSes),
the BIOS may initialise the IGFX as secondary to a discrete GPU. Prior,
it would simply disable the integrated GPU. So we adjust our PCI class
mask to match any DISPLAY_CLASS device.

In such a configuration, the IGFX is not a primary VGA controller and
so should not take part in VGA arbitration, and the error return from
vga_client_register() is expected.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/vga/vgaarb.c

index c836b886b35775a547c587cd86216f9355780732..e6fc48ea55a9bbd8a58d8f4b7531f0b431f9b4f7 100644 (file)
@@ -1419,9 +1419,15 @@ static int i915_load_modeset_init(struct drm_device *dev,
        if (ret)
                DRM_INFO("failed to find VBIOS tables\n");
 
-       /* if we have > 1 VGA cards, then disable the radeon VGA resources */
+       /* If we have > 1 VGA cards, then we need to arbitrate access
+        * to the common VGA resources.
+        *
+        * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA),
+        * then we do not take part in VGA arbitration and the
+        * vga_client_register() fails with -ENODEV.
+        */
        ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
-       if (ret)
+       if (ret && ret != -ENODEV)
                goto cleanup_ringbuffer;
 
        ret = vga_switcheroo_register_client(dev->pdev,
index 6dbe14cc4f7474aa57221c46fa59286caf362b9f..f09d1cb3fc3770fea5c06f5631ba8815a983f53d 100644 (file)
@@ -53,7 +53,7 @@ extern int intel_agp_enabled;
 
 #define INTEL_VGA_DEVICE(id, info) {           \
        .class = PCI_CLASS_DISPLAY_VGA << 8,    \
-       .class_mask = 0xffff00,                 \
+       .class_mask = 0xff0000,                 \
        .vendor = 0x8086,                       \
        .device = id,                           \
        .subvendor = PCI_ANY_ID,                \
index f366f968155a3ed913ce770a60ca30cbf2f97981..d7def1790b41b680c4a823e5f8bcc1b5f0e4bd90 100644 (file)
@@ -636,7 +636,7 @@ int vga_client_register(struct pci_dev *pdev, void *cookie,
                        void (*irq_set_state)(void *cookie, bool state),
                        unsigned int (*set_vga_decode)(void *cookie, bool decode))
 {
-       int ret = -1;
+       int ret = -ENODEV;
        struct vga_device *vgadev;
        unsigned long flags;