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 | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c index 02ca5dd978f6..6c343a933182 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c @@ -485,7 +485,6 @@ 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; @@ -500,7 +499,6 @@ 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;  } @@ -562,17 +560,25 @@ static bool amdgpu_atpx_detect(void)  	struct pci_dev *pdev = NULL;  	bool has_atpx = false;  	int vga_count = 0; +	bool d3_supported = false; +	struct pci_dev *parent_pdev;  	while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {  		vga_count++;  		has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); + +		parent_pdev = pci_upstream_bridge(pdev); +		d3_supported |= parent_pdev && parent_pdev->bridge_d3;  	}  	while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {  		vga_count++;  		has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); + +		parent_pdev = pci_upstream_bridge(pdev); +		d3_supported |= parent_pdev && parent_pdev->bridge_d3;  	}  	if (has_atpx && vga_count == 2) { @@ -580,6 +586,7 @@ static bool amdgpu_atpx_detect(void)  		printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",  		       acpi_method_name);  		amdgpu_atpx_priv.atpx_detected = true; +		amdgpu_atpx_priv.bridge_pm_usable = d3_supported;  		amdgpu_atpx_init();  		return true;  	}  | 
