]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
drm/amdgpu: disable runtime pm on PX laptops without dGPU power control
authorAlex Deucher <alexander.deucher@amd.com>
Wed, 2 Mar 2016 17:10:20 +0000 (12:10 -0500)
committerTim Gardner <tim.gardner@canonical.com>
Thu, 21 Apr 2016 12:53:29 +0000 (06:53 -0600)
BugLink: http://bugs.launchpad.net/bugs/1572722
commit bedf2a65c1aa8fb29ba8527fd00c0f68ec1f55f1 upstream.

Some PX laptops don't provide an ACPI method to control dGPU power.  On
those systems, the driver is responsible for handling the dGPU power
state.  Disable runtime PM on them until support for this is implemented.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index 3c895863fcf50e9d4cbe15cd23d51b10b8da6f3c..81dc6b65436f70d867f1cf8d23c6c1399252ae8f 100644 (file)
@@ -63,6 +63,10 @@ bool amdgpu_has_atpx(void) {
        return amdgpu_atpx_priv.atpx_detected;
 }
 
+bool amdgpu_has_atpx_dgpu_power_cntl(void) {
+       return amdgpu_atpx_priv.atpx.functions.power_cntl;
+}
+
 /**
  * amdgpu_atpx_call - call an ATPX method
  *
@@ -142,10 +146,6 @@ static void amdgpu_atpx_parse_functions(struct amdgpu_atpx_functions *f, u32 mas
  */
 static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)
 {
-       /* make sure required functions are enabled */
-       /* dGPU power control is required */
-       atpx->functions.power_cntl = true;
-
        if (atpx->functions.px_params) {
                union acpi_object *info;
                struct atpx_px_params output;
index 51bfc114584ed5e2fcd086efed40b57f344d2c4f..d6c68d00cbb08f0fe0929013fa3df83c19c5ef54 100644 (file)
@@ -62,6 +62,12 @@ static const char *amdgpu_asic_name[] = {
        "LAST",
 };
 
+#if defined(CONFIG_VGA_SWITCHEROO)
+bool amdgpu_has_atpx_dgpu_power_cntl(void);
+#else
+static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; }
+#endif
+
 bool amdgpu_device_is_px(struct drm_device *dev)
 {
        struct amdgpu_device *adev = dev->dev_private;
@@ -1511,7 +1517,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 
        if (amdgpu_runtime_pm == 1)
                runtime = true;
-       if (amdgpu_device_is_px(ddev))
+       if (amdgpu_device_is_px(ddev) && amdgpu_has_atpx_dgpu_power_cntl())
                runtime = true;
        vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
        if (runtime)