diff options
| author | Perry Yuan <perry.yuan@amd.com> | 2026-02-23 23:20:50 +0800 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2026-05-11 15:55:56 -0400 |
| commit | caefb4bc93e45ec4702bc6cfec8b74b34c978e13 (patch) | |
| tree | 61f1d9bb5b5924d9881a6bb529d829ca236b8782 /drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | |
| parent | c13ff096437c6d470edf754c78e0cb83d24505fa (diff) | |
| download | lwn-caefb4bc93e45ec4702bc6cfec8b74b34c978e13.tar.gz lwn-caefb4bc93e45ec4702bc6cfec8b74b34c978e13.zip | |
drm/amdgpu: add SPI idle check for GC 9.4.4 in gfx_v9_4_3_is_idle()
GC 9.4.4 uses SPI busy status for idle detection instead of GRBM GUI_ACTIVE.
Add version check to use SPI_BUSY for 9.4.4 while keeping GRBM_STATUS
GUI_ACTIVE check for other GC versions.
v2: move this check into amdgpu_ptl_perf_monitor_ctrl(Lijo)
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Yifan Zhang <yifan1.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index ad76074d54aa..5f8f0026483b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -1276,8 +1276,9 @@ static int psp_ptl_invoke(struct psp_context *psp, u32 req_code, */ if (cmd->resp.status) { dev_err(psp->adev->dev, - "PTL command 0x%x failed, PSP response status: 0x%X\n", - req_code, cmd->resp.status); + "PTL command 0x%x failed, PSP response status: 0x%X fw resp=0x%X\n", + req_code, cmd->resp.status, + cmd->resp.uresp.perf_hw_info.resp); ret = -EIO; goto out; } @@ -1310,6 +1311,7 @@ int amdgpu_ptl_perf_monitor_ctrl(struct amdgpu_device *adev, u32 req_code, uint32_t ptl_fmt1, ptl_fmt2; struct psp_context *psp; struct amdgpu_ptl *ptl; + int ret; if (!adev || !ptl_state || !fmt1 || !fmt2) return -EINVAL; @@ -1356,6 +1358,16 @@ int amdgpu_ptl_perf_monitor_ctrl(struct amdgpu_device *adev, u32 req_code, } } + /* Wait for GFX engine idle before PTL state transition */ + if (req_code == PSP_PTL_PERF_MON_SET) { + ret = amdgpu_device_ip_wait_for_idle(adev, + AMD_IP_BLOCK_TYPE_GFX); + if (ret) { + dev_err(adev->dev, "GFX not idle before PTL operation (%d)\n", ret); + return ret; + } + } + return psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2); } |
