drm/i915: Recognise non-VGA display devices

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>
Cc: stable@kernel.org
This commit is contained in:
Chris Wilson 2011-01-20 13:09:12 +00:00
Родитель 076e2c0eb8
Коммит 934f992c76
3 изменённых файлов: 10 добавлений и 4 удалений

Просмотреть файл

@ -1215,9 +1215,15 @@ static int i915_load_modeset_init(struct drm_device *dev)
if (ret) if (ret)
DRM_INFO("failed to find VBIOS tables\n"); 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); ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
if (ret) if (ret && ret != -ENODEV)
goto cleanup_ringbuffer; goto cleanup_ringbuffer;
intel_register_dsm_handler(); intel_register_dsm_handler();

Просмотреть файл

@ -60,7 +60,7 @@ extern int intel_agp_enabled;
#define INTEL_VGA_DEVICE(id, info) { \ #define INTEL_VGA_DEVICE(id, info) { \
.class = PCI_CLASS_DISPLAY_VGA << 8, \ .class = PCI_CLASS_DISPLAY_VGA << 8, \
.class_mask = 0xffff00, \ .class_mask = 0xff0000, \
.vendor = 0x8086, \ .vendor = 0x8086, \
.device = id, \ .device = id, \
.subvendor = PCI_ANY_ID, \ .subvendor = PCI_ANY_ID, \

Просмотреть файл

@ -636,7 +636,7 @@ int vga_client_register(struct pci_dev *pdev, void *cookie,
void (*irq_set_state)(void *cookie, bool state), void (*irq_set_state)(void *cookie, bool state),
unsigned int (*set_vga_decode)(void *cookie, bool decode)) unsigned int (*set_vga_decode)(void *cookie, bool decode))
{ {
int ret = -1; int ret = -ENODEV;
struct vga_device *vgadev; struct vga_device *vgadev;
unsigned long flags; unsigned long flags;