| From e3e4bf58bad1576ac732a1429f53e3d4bfb82b4b Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Wed, 14 Aug 2024 10:28:24 -0400 |
| Subject: drm/amdgpu/sdma5.2: limit wptr workaround to sdma 5.2.1 |
| |
| From: Alex Deucher <alexander.deucher@amd.com> |
| |
| commit e3e4bf58bad1576ac732a1429f53e3d4bfb82b4b upstream. |
| |
| The workaround seems to cause stability issues on other |
| SDMA 5.2.x IPs. |
| |
| Fixes: a03ebf116303 ("drm/amdgpu/sdma5.2: Update wptr registers as well as doorbell") |
| Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3556 |
| Acked-by: Ruijing Dong <ruijing.dong@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| (cherry picked from commit 2dc3851ef7d9c5439ea8e9623fc36878f3b40649) |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 18 ++++++++++-------- |
| 1 file changed, 10 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c |
| @@ -176,14 +176,16 @@ static void sdma_v5_2_ring_set_wptr(stru |
| DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n", |
| ring->doorbell_index, ring->wptr << 2); |
| WDOORBELL64(ring->doorbell_index, ring->wptr << 2); |
| - /* SDMA seems to miss doorbells sometimes when powergating kicks in. |
| - * Updating the wptr directly will wake it. This is only safe because |
| - * we disallow gfxoff in begin_use() and then allow it again in end_use(). |
| - */ |
| - WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), |
| - lower_32_bits(ring->wptr << 2)); |
| - WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), |
| - upper_32_bits(ring->wptr << 2)); |
| + if (amdgpu_ip_version(adev, SDMA0_HWIP, 0) == IP_VERSION(5, 2, 1)) { |
| + /* SDMA seems to miss doorbells sometimes when powergating kicks in. |
| + * Updating the wptr directly will wake it. This is only safe because |
| + * we disallow gfxoff in begin_use() and then allow it again in end_use(). |
| + */ |
| + WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), |
| + lower_32_bits(ring->wptr << 2)); |
| + WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), |
| + upper_32_bits(ring->wptr << 2)); |
| + } |
| } else { |
| DRM_DEBUG("Not using doorbell -- " |
| "mmSDMA%i_GFX_RB_WPTR == 0x%08x " |