]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: Fix wait after reset sequence in S4
authorLijo Lazar <lijo.lazar@amd.com>
Fri, 27 Mar 2026 08:59:17 +0000 (14:29 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 30 Mar 2026 20:20:43 +0000 (16:20 -0400)
For a mode-1 reset done at the end of S4 on PSPv11 dGPUs, only check if
TOS is unloaded.

Fixes: 32f73741d6ee ("drm/amdgpu: Wait for bootloader after PSPv11 reset")
Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/4853
Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 2fb4883b884a437d760bd7bdf7695a7e5a60bba3)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c

index 95d26f086d5456eb4d11810a7a7604692ea14325..c91638e6517464482b72cc6c9dd2c5c8f6307854 100644 (file)
@@ -2703,8 +2703,12 @@ static int amdgpu_pmops_freeze(struct device *dev)
        if (r)
                return r;
 
-       if (amdgpu_acpi_should_gpu_reset(adev))
-               return amdgpu_asic_reset(adev);
+       if (amdgpu_acpi_should_gpu_reset(adev)) {
+               amdgpu_device_lock_reset_domain(adev->reset_domain);
+               r = amdgpu_asic_reset(adev);
+               amdgpu_device_unlock_reset_domain(adev->reset_domain);
+               return r;
+       }
        return 0;
 }
 
index 9aa988982304b3b775177dd27664d09da2ff867d..fb7aaf5ae05cfb4cf2905aa02013c39117e446de 100644 (file)
@@ -170,7 +170,8 @@ static int psp_v11_0_wait_for_bootloader(struct psp_context *psp)
        int retry_loop;
 
        /* For a reset done at the end of S3, only wait for TOS to be unloaded */
-       if (adev->in_s3 && !(adev->flags & AMD_IS_APU) && amdgpu_in_reset(adev))
+       if ((adev->in_s4 || adev->in_s3) && !(adev->flags & AMD_IS_APU) &&
+           amdgpu_in_reset(adev))
                return psp_v11_wait_for_tos_unload(psp);
 
        for (retry_loop = 0; retry_loop < 20; retry_loop++) {