drm/amdgpu: Don't register Thunderbolt eGPU with vga_switcheroo
authorLukas Wunner <lukas@wunner.de>
Fri, 10 Mar 2017 20:23:45 +0000 (21:23 +0100)
committerLukas Wunner <lukas@wunner.de>
Thu, 30 Mar 2017 20:42:30 +0000 (22:42 +0200)
An external Thunderbolt GPU can neither drive the laptop's panel nor be
powered off by the platform, so there's no point in registering it with
vga_switcheroo.  In fact, when the external GPU is runtime suspended,
vga_switcheroo will cut power to the internal discrete GPU, resulting in
a lockup.  Moreover AMD's Windows driver special-cases Thunderbolt as
well.

Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Link: http://patchwork.freedesktop.org/patch/msgid/701a8e89ce8ac39734736ab779558b6a4042a19e.1489145162.git.lukas@wunner.de
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c

index a3a105e..2996549 100644 (file)
@@ -1763,7 +1763,9 @@ int amdgpu_device_init(struct amdgpu_device *adev,
                runtime = true;
        if (amdgpu_device_is_px(ddev))
                runtime = true;
-       vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
+       if (!pci_is_thunderbolt_attached(adev->pdev))
+               vga_switcheroo_register_client(adev->pdev,
+                                              &amdgpu_switcheroo_ops, runtime);
        if (runtime)
                vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
 
@@ -1926,7 +1928,8 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
        amdgpu_atombios_fini(adev);
        kfree(adev->bios);
        adev->bios = NULL;
-       vga_switcheroo_unregister_client(adev->pdev);
+       if (!pci_is_thunderbolt_attached(adev->pdev))
+               vga_switcheroo_unregister_client(adev->pdev);
        if (adev->flags & AMD_IS_PX)
                vga_switcheroo_fini_domain_pm_ops(adev->dev);
        vga_client_register(adev->pdev, NULL, NULL, NULL);
index 61d94c7..2f3b236 100644 (file)
@@ -103,7 +103,8 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
            amdgpu_has_atpx() &&
            (amdgpu_is_atpx_hybrid() ||
             amdgpu_has_atpx_dgpu_power_cntl()) &&
-           ((flags & AMD_IS_APU) == 0))
+           ((flags & AMD_IS_APU) == 0) &&
+           !pci_is_thunderbolt_attached(dev->pdev))
                flags |= AMD_IS_PX;
 
        /* amdgpu_device_init should report only fatal error