On 2026-07-02 06:23, Christian König wrote:
On 7/1/26 18:17, Timur Kristóf wrote:
The doorbell is not working on Navi 31.
Use the IH_RETRY_CAM_ACK register.
Signed-off-by: Timur Kristóf <[email protected]>
Acked-by: Christian König <[email protected]>
I still haven't found any explanation why we use a doorbell for the CAM in the
first place? Lijo, Alex, Felix does anybody know that?
Why are we using doorbells to update WPTRs instead of writing to the
registers directly? I was assuming that using doorbells for the IH CAM
had similar reasons. I think register writes can be problematic with
certain power saving modes and virtualization. I'm not sure if there is
a difference in terms of CPU overhead between writing a doorbell or
writing an MMIO register.
If doorbells aren't working, it's probably some configuration issue. I'd
rather fix those issues than throw away use of doorbells altogether.
Regards,
Felix
Thanks,
Christian.
---
drivers/gpu/drm/amd/amdgpu/ih_v6_0.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c
b/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c
index 65e5d21753f9..a97c85b0cb99 100644
--- a/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c
@@ -307,6 +307,11 @@ static int ih_v6_0_enable_ring(struct amdgpu_device *adev,
return 0;
}
+static void ih_v6_0_retry_cam_ack(struct amdgpu_device *adev, u32 cam_index)
+{
+ WREG32_SOC15(OSSSYS, 0, regIH_RETRY_CAM_ACK, cam_index);
+}
+
/**
* ih_v6_0_irq_init - init and enable the interrupt ring
*
@@ -807,7 +812,8 @@ static const struct amdgpu_ih_funcs ih_v6_0_funcs = {
.get_wptr = ih_v6_0_get_wptr,
.decode_iv = amdgpu_ih_decode_iv_helper,
.decode_iv_ts = amdgpu_ih_decode_iv_ts_helper,
- .set_rptr = ih_v6_0_set_rptr
+ .set_rptr = ih_v6_0_set_rptr,
+ .retry_cam_ack = ih_v6_0_retry_cam_ack,
};
static void ih_v6_0_set_interrupt_funcs(struct amdgpu_device *adev)