| From bedf2a65c1aa8fb29ba8527fd00c0f68ec1f55f1 Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Wed, 2 Mar 2016 12:10:20 -0500 |
| Subject: drm/amdgpu: disable runtime pm on PX laptops without dGPU power control |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Alex Deucher <alexander.deucher@amd.com> |
| |
| 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> |
| |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | 8 ++++---- |
| drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 8 +++++++- |
| 2 files changed, 11 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
| @@ -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( |
| */ |
| 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; |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
| @@ -61,6 +61,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; |
| @@ -1469,7 +1475,7 @@ int amdgpu_device_init(struct amdgpu_dev |
| |
| 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) |