Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84c8b22e authored by Lukas Wunner's avatar Lukas Wunner
Browse files

drm/amdgpu: Don't register Thunderbolt eGPU with vga_switcheroo



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: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
Link: http://patchwork.freedesktop.org/patch/msgid/701a8e89ce8ac39734736ab779558b6a4042a19e.1489145162.git.lukas@wunner.de
parent 7ffb0ce3
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -1763,7 +1763,9 @@ int amdgpu_device_init(struct amdgpu_device *adev,
		runtime = true;
		runtime = true;
	if (amdgpu_device_is_px(ddev))
	if (amdgpu_device_is_px(ddev))
		runtime = true;
		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)
	if (runtime)
		vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
		vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);


@@ -1926,6 +1928,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
	amdgpu_atombios_fini(adev);
	amdgpu_atombios_fini(adev);
	kfree(adev->bios);
	kfree(adev->bios);
	adev->bios = NULL;
	adev->bios = NULL;
	if (!pci_is_thunderbolt_attached(adev->pdev))
		vga_switcheroo_unregister_client(adev->pdev);
		vga_switcheroo_unregister_client(adev->pdev);
	if (adev->flags & AMD_IS_PX)
	if (adev->flags & AMD_IS_PX)
		vga_switcheroo_fini_domain_pm_ops(adev->dev);
		vga_switcheroo_fini_domain_pm_ops(adev->dev);
+2 −1
Original line number Original line Diff line number Diff line
@@ -103,7 +103,8 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
	    amdgpu_has_atpx() &&
	    amdgpu_has_atpx() &&
	    (amdgpu_is_atpx_hybrid() ||
	    (amdgpu_is_atpx_hybrid() ||
	     amdgpu_has_atpx_dgpu_power_cntl()) &&
	     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;
		flags |= AMD_IS_PX;


	/* amdgpu_device_init should report only fatal error
	/* amdgpu_device_init should report only fatal error