Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/nouveau/acpi: use DSM if bridge does not support D3cold

Even if PR3 support is available on the bridge, it will not be used if
the PCI layer considers it unavailable (i.e. on all laptops from 2013
and 2014). Ensure that this condition is checked to allow a fallback to
the Optimus DSM for device poweroff.

Initially I wanted to call pci_d3cold_enable before checking bridge_d3
(in case the user changed d3cold_allowed), but that is such an unlikely
case and likely fragile anyway. The current patch is suggested by Mika
in http://www.spinics.net/lists/linux-pci/msg52599.html

Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Peter Wu <peter@lekensteyn.nl>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Peter Wu and committed by
Dave Airlie
279cf3f2 3eab887a

+11
+11
drivers/gpu/drm/nouveau/nouveau_acpi.c
··· 225 225 if (!parent_pdev) 226 226 return false; 227 227 228 + if (!parent_pdev->bridge_d3) { 229 + /* 230 + * Parent PCI bridge is currently not power managed. 231 + * Since userspace can change these afterwards to be on 232 + * the safe side we stick with _DSM and prevent usage of 233 + * _PR3 from the bridge. 234 + */ 235 + pci_d3cold_disable(pdev); 236 + return false; 237 + } 238 + 228 239 parent_adev = ACPI_COMPANION(&parent_pdev->dev); 229 240 if (!parent_adev) 230 241 return false;