|
@@ -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;
|
|
|
}
|
|
|
|