[PATCH 2/3] drm/amdgpu: stop freeing PSP buffers during suspend

Christian König ckoenig.leichtzumerken at gmail.com
Wed Nov 16 16:01:10 UTC 2022


That the PSP code tries to free the memory during suspend is quite
broken and leads to problems during resume.

Signed-off-by: Christian König <christian.koenig at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 30 ++++++++++---------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 0a8c30475dda..470cd660c450 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -511,11 +511,10 @@ static int psp_sw_fini(void *handle)
 	kfree(cmd);
 	cmd = NULL;
 
-	if (psp->km_ring.ring_mem)
-		amdgpu_bo_free_kernel(&adev->firmware.rbuf,
-				      &psp->km_ring.ring_mem_mc_addr,
-				      (void **)&psp->km_ring.ring_mem);
-
+	psp_free_shared_bufs(psp);
+	amdgpu_bo_free_kernel(&adev->firmware.rbuf,
+			      &psp->km_ring.ring_mem_mc_addr,
+			      (void **)&psp->km_ring.ring_mem);
 	amdgpu_bo_free_kernel(&psp->fw_pri_bo,
 			      &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
 	amdgpu_bo_free_kernel(&psp->fence_buf_bo,
@@ -2635,8 +2634,6 @@ static int psp_hw_fini(void *handle)
 
 	psp_ring_destroy(psp, PSP_RING_TYPE__KM);
 
-	psp_free_shared_bufs(psp);
-
 	return 0;
 }
 
@@ -2651,7 +2648,7 @@ static int psp_suspend(void *handle)
 		ret = psp_xgmi_terminate(psp);
 		if (ret) {
 			DRM_ERROR("Failed to terminate xgmi ta\n");
-			goto out;
+			return ret;
 		}
 	}
 
@@ -2659,40 +2656,40 @@ static int psp_suspend(void *handle)
 		ret = psp_ras_terminate(psp);
 		if (ret) {
 			DRM_ERROR("Failed to terminate ras ta\n");
-			goto out;
+			return ret;
 		}
 		ret = psp_hdcp_terminate(psp);
 		if (ret) {
 			DRM_ERROR("Failed to terminate hdcp ta\n");
-			goto out;
+			return ret;
 		}
 		ret = psp_dtm_terminate(psp);
 		if (ret) {
 			DRM_ERROR("Failed to terminate dtm ta\n");
-			goto out;
+			return ret;
 		}
 		ret = psp_rap_terminate(psp);
 		if (ret) {
 			DRM_ERROR("Failed to terminate rap ta\n");
-			goto out;
+			return ret;
 		}
 		ret = psp_securedisplay_terminate(psp);
 		if (ret) {
 			DRM_ERROR("Failed to terminate securedisplay ta\n");
-			goto out;
+			return ret;
 		}
 	}
 
 	ret = psp_asd_terminate(psp);
 	if (ret) {
 		DRM_ERROR("Failed to terminate asd\n");
-		goto out;
+		return ret;
 	}
 
 	ret = psp_tmr_terminate(psp);
 	if (ret) {
 		DRM_ERROR("Failed to terminate tmr\n");
-		goto out;
+		return ret;
 	}
 
 	ret = psp_ring_stop(psp, PSP_RING_TYPE__KM);
@@ -2700,9 +2697,6 @@ static int psp_suspend(void *handle)
 		DRM_ERROR("PSP ring stop failed\n");
 	}
 
-out:
-	psp_free_shared_bufs(psp);
-
 	return ret;
 }
 
-- 
2.34.1



More information about the amd-gfx mailing list