drm/amdgpu: disentangle runtime pm and vga_switcheroo
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 4 Oct 2019 18:25:37 +0000 (13:25 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Nov 2019 21:42:53 +0000 (16:42 -0500)
Originally we only supported runtime pm on PX/HG laptops
so vga_switcheroo and runtime pm are sort of entangled.

Attempt to logically separate them.

Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index 612c4cc..d472526 100644 (file)
@@ -2743,7 +2743,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
                       uint32_t flags)
 {
        int r, i;
-       bool runtime = false;
+       bool boco = false;
        u32 max_MBps;
 
        adev->shutdown = false;
@@ -2914,11 +2914,14 @@ int amdgpu_device_init(struct amdgpu_device *adev,
        vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode);
 
        if (amdgpu_device_supports_boco(ddev))
-               runtime = true;
-       if (!pci_is_thunderbolt_attached(adev->pdev))
+               boco = true;
+       if (amdgpu_has_atpx() &&
+           (amdgpu_is_atpx_hybrid() ||
+            amdgpu_has_atpx_dgpu_power_cntl()) &&
+           !pci_is_thunderbolt_attached(adev->pdev))
                vga_switcheroo_register_client(adev->pdev,
-                                              &amdgpu_switcheroo_ops, runtime);
-       if (runtime)
+                                              &amdgpu_switcheroo_ops, boco);
+       if (boco)
                vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
 
        if (amdgpu_emu_mode == 1) {
@@ -3102,7 +3105,7 @@ fence_driver_init:
 
 failed:
        amdgpu_vf_error_trans_all(adev);
-       if (runtime)
+       if (boco)
                vga_switcheroo_fini_domain_pm_ops(adev->dev);
 
        return r;
@@ -3150,9 +3153,12 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
 
        kfree(adev->bios);
        adev->bios = NULL;
-       if (!pci_is_thunderbolt_attached(adev->pdev))
+       if (amdgpu_has_atpx() &&
+           (amdgpu_is_atpx_hybrid() ||
+            amdgpu_has_atpx_dgpu_power_cntl()) &&
+           !pci_is_thunderbolt_attached(adev->pdev))
                vga_switcheroo_unregister_client(adev->pdev);
-       if (adev->flags & AMD_IS_PX)
+       if (amdgpu_device_supports_boco(adev->ddev))
                vga_switcheroo_fini_domain_pm_ops(adev->dev);
        vga_client_register(adev->pdev, NULL, NULL, NULL);
        if (adev->rio_mem)