diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c index dae35a96a694..02ca5dd978f6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c @@ -34,6 +34,7 @@ struct amdgpu_atpx {  static struct amdgpu_atpx_priv {  	bool atpx_detected; +	bool bridge_pm_usable;  	/* handle for device - and atpx */  	acpi_handle dhandle;  	acpi_handle other_handle; @@ -205,7 +206,11 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)  	atpx->is_hybrid = false;  	if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {  		printk("ATPX Hybrid Graphics\n"); -		atpx->functions.power_cntl = false; +		/* +		 * Disable legacy PM methods only when pcie port PM is usable, +		 * otherwise the device might fail to power off or power on. +		 */ +		atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable;  		atpx->is_hybrid = true;  	} @@ -480,6 +485,7 @@ static int amdgpu_atpx_power_state(enum vga_switcheroo_client_id id,   */  static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)  { +	struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);  	acpi_handle dhandle, atpx_handle;  	acpi_status status; @@ -494,6 +500,7 @@ static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)  	}  	amdgpu_atpx_priv.dhandle = dhandle;  	amdgpu_atpx_priv.atpx.handle = atpx_handle; +	amdgpu_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3;  	return true;  }  | 
