[PATCH] drm/amdgpu: Modify register write via PSP

Ahmad Rehman Ahmad.Rehman at amd.com
Fri Apr 4 18:41:59 UTC 2025


This patch enables the logic where if PSP ring has
initialized then submit the register write command
via ring.

Signed-off-by: Ahmad Rehman <Ahmad.Rehman at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 17 ++++++++++++-----
 drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c |  2 +-
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index dbc3313fc141..8f34a277c821 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -1189,15 +1189,22 @@ int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg,
 	if (reg >= PSP_REG_LAST)
 		return -EINVAL;
 
-	cmd = acquire_psp_cmd_buf(psp);
+	/* Check if psp ring has initialized */
+	if (psp->km_ring.ring_mem && psp->km_ring.ring_size) {
+		cmd = acquire_psp_cmd_buf(psp);
+
+		psp_prep_reg_prog_cmd_buf(cmd, reg, value);
+		ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
+
+		release_psp_cmd_buf(psp);
+	} else {
+		/* Program reg without ring via registers */
+		ret = psp_reg_program_no_ring(psp, value, reg);
+	}
 
-	psp_prep_reg_prog_cmd_buf(cmd, reg, value);
-	ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
 	if (ret)
 		dev_err(psp->adev->dev, "PSP failed to program reg id %d\n", reg);
 
-	release_psp_cmd_buf(psp);
-
 	return ret;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c
index 4a43c9ab95a2..05935b2c99b6 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c
+++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c
@@ -208,7 +208,7 @@ static void mmhub_v1_8_init_tlb_regs(struct amdgpu_device *adev)
 				    MTYPE, MTYPE_UC);/* XXX for emulation. */
 		tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
 
-		psp_reg_program_no_ring(&adev->psp, tmp, PSP_REG_MMHUB_L1_TLB_CNTL);
+		psp_reg_program(&adev->psp, PSP_REG_MMHUB_L1_TLB_CNTL, tmp);
 	} else {
 		inst_mask = adev->aid_mask;
 		for_each_inst(i, inst_mask) {
-- 
2.34.1



More information about the amd-gfx mailing list