| From 7330256268664ea0a7dd5b07a3fed363093477dd Mon Sep 17 00:00:00 2001 |
| From: Friedrich Vock <friedrich.vock@gmx.de> |
| Date: Tue, 23 Jan 2024 12:52:03 +0100 |
| Subject: drm/amdgpu: Reset IH OVERFLOW_CLEAR bit |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Friedrich Vock <friedrich.vock@gmx.de> |
| |
| commit 7330256268664ea0a7dd5b07a3fed363093477dd upstream. |
| |
| Allows us to detect subsequent IH ring buffer overflows as well. |
| |
| Cc: Joshua Ashton <joshua@froggi.es> |
| Cc: Alex Deucher <alexander.deucher@amd.com> |
| Cc: Christian König <christian.koenig@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Friedrich Vock <friedrich.vock@gmx.de> |
| Reviewed-by: Christian König <christian.koenig@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/cik_ih.c | 6 ++++++ |
| drivers/gpu/drm/amd/amdgpu/cz_ih.c | 5 +++++ |
| drivers/gpu/drm/amd/amdgpu/iceland_ih.c | 5 +++++ |
| drivers/gpu/drm/amd/amdgpu/ih_v6_0.c | 6 ++++++ |
| drivers/gpu/drm/amd/amdgpu/ih_v6_1.c | 7 +++++++ |
| drivers/gpu/drm/amd/amdgpu/navi10_ih.c | 6 ++++++ |
| drivers/gpu/drm/amd/amdgpu/si_ih.c | 6 ++++++ |
| drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 6 ++++++ |
| drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 6 ++++++ |
| drivers/gpu/drm/amd/amdgpu/vega20_ih.c | 6 ++++++ |
| 10 files changed, 59 insertions(+) |
| |
| --- a/drivers/gpu/drm/amd/amdgpu/cik_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/cik_ih.c |
| @@ -204,6 +204,12 @@ static u32 cik_ih_get_wptr(struct amdgpu |
| tmp = RREG32(mmIH_RB_CNTL); |
| tmp |= IH_RB_CNTL__WPTR_OVERFLOW_CLEAR_MASK; |
| WREG32(mmIH_RB_CNTL, tmp); |
| + |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp &= ~IH_RB_CNTL__WPTR_OVERFLOW_CLEAR_MASK; |
| + WREG32(mmIH_RB_CNTL, tmp); |
| } |
| return (wptr & ih->ptr_mask); |
| } |
| --- a/drivers/gpu/drm/amd/amdgpu/cz_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/cz_ih.c |
| @@ -216,6 +216,11 @@ static u32 cz_ih_get_wptr(struct amdgpu_ |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32(mmIH_RB_CNTL, tmp); |
| |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32(mmIH_RB_CNTL, tmp); |
| |
| out: |
| return (wptr & ih->ptr_mask); |
| --- a/drivers/gpu/drm/amd/amdgpu/iceland_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/iceland_ih.c |
| @@ -215,6 +215,11 @@ static u32 iceland_ih_get_wptr(struct am |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32(mmIH_RB_CNTL, tmp); |
| |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32(mmIH_RB_CNTL, tmp); |
| |
| out: |
| return (wptr & ih->ptr_mask); |
| --- a/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c |
| @@ -418,6 +418,12 @@ static u32 ih_v6_0_get_wptr(struct amdgp |
| tmp = RREG32_NO_KIQ(ih_regs->ih_rb_cntl); |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| + |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| out: |
| return (wptr & ih->ptr_mask); |
| } |
| --- a/drivers/gpu/drm/amd/amdgpu/ih_v6_1.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/ih_v6_1.c |
| @@ -418,6 +418,13 @@ static u32 ih_v6_1_get_wptr(struct amdgp |
| tmp = RREG32_NO_KIQ(ih_regs->ih_rb_cntl); |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| + |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| + |
| out: |
| return (wptr & ih->ptr_mask); |
| } |
| --- a/drivers/gpu/drm/amd/amdgpu/navi10_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/navi10_ih.c |
| @@ -442,6 +442,12 @@ static u32 navi10_ih_get_wptr(struct amd |
| tmp = RREG32_NO_KIQ(ih_regs->ih_rb_cntl); |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| + |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| out: |
| return (wptr & ih->ptr_mask); |
| } |
| --- a/drivers/gpu/drm/amd/amdgpu/si_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/si_ih.c |
| @@ -119,6 +119,12 @@ static u32 si_ih_get_wptr(struct amdgpu_ |
| tmp = RREG32(IH_RB_CNTL); |
| tmp |= IH_RB_CNTL__WPTR_OVERFLOW_CLEAR_MASK; |
| WREG32(IH_RB_CNTL, tmp); |
| + |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp &= ~IH_RB_CNTL__WPTR_OVERFLOW_CLEAR_MASK; |
| + WREG32(IH_RB_CNTL, tmp); |
| } |
| return (wptr & ih->ptr_mask); |
| } |
| --- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c |
| @@ -219,6 +219,12 @@ static u32 tonga_ih_get_wptr(struct amdg |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32(mmIH_RB_CNTL, tmp); |
| |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32(mmIH_RB_CNTL, tmp); |
| + |
| out: |
| return (wptr & ih->ptr_mask); |
| } |
| --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c |
| @@ -373,6 +373,12 @@ static u32 vega10_ih_get_wptr(struct amd |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| + |
| out: |
| return (wptr & ih->ptr_mask); |
| } |
| --- a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c |
| @@ -421,6 +421,12 @@ static u32 vega20_ih_get_wptr(struct amd |
| tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); |
| WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| |
| + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows |
| + * can be detected. |
| + */ |
| + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); |
| + WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); |
| + |
| out: |
| return (wptr & ih->ptr_mask); |
| } |