diff options
author | Emil Velikov <emil.l.velikov@gmail.com> | 2013-10-09 08:25:16 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-11-08 16:02:47 +1000 |
commit | 4c60fac111961e7eb71a08928c22b43cff55f1fb (patch) | |
tree | 84c677306b4ca1c9d07a4805255219028233cad4 /drivers/gpu/drm/nouveau/nouveau_acpi.c | |
parent | 4a15cdffa96bdd19d6233a25d394d0c50ab4d539 (diff) | |
download | linux-stable-4c60fac111961e7eb71a08928c22b43cff55f1fb.tar.gz linux-stable-4c60fac111961e7eb71a08928c22b43cff55f1fb.tar.bz2 linux-stable-4c60fac111961e7eb71a08928c22b43cff55f1fb.zip |
drm/nouveau: consider CLASS_DISPLAY_3D devices while detecting dsm/optimus
The present code assumes that optimus is present whenever two
VGA (PCI_CLASS_DISPLAY_VGA) devices are present. This does not
seem to be the case of newer laptops with optimus, in which
case the nvidia gpu is a PCI_CLASS_DISPLAY_3D device.
Rework the logic so that we count both VGA and 3D devices,
when contemplating if optimus is present on the platform.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=70208
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_acpi.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_acpi.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index dd7d2e182719..f9a2df29a593 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c @@ -317,6 +317,16 @@ static bool nouveau_dsm_detect(void) has_optimus = 1; } + while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_3D << 8, pdev)) != NULL) { + vga_count++; + + retval = nouveau_dsm_pci_probe(pdev); + if (retval & NOUVEAU_DSM_HAS_MUX) + has_dsm |= 1; + if (retval & NOUVEAU_DSM_HAS_OPT) + has_optimus = 1; + } + /* find the optimus DSM or the old v1 DSM */ if (has_optimus == 1) { acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME, |