drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts
authorjsg <jsg@openbsd.org>
Thu, 12 Sep 2024 23:34:57 +0000 (23:34 +0000)
committerjsg <jsg@openbsd.org>
Thu, 12 Sep 2024 23:34:57 +0000 (23:34 +0000)
From Danijel Slivka
2521ba3cfa1d1c541e1ba1a32d1b43ad5a8e412f in linux-6.6.y/6.6.51
afbf7955ff01e952dbdd465fa25a2ba92d00291c in mainline linux

sys/dev/pci/drm/amd/amdgpu/ih_v6_0.c

index f432dc7..725b1a5 100644 (file)
@@ -135,6 +135,34 @@ static int ih_v6_0_toggle_ring_interrupts(struct amdgpu_device *adev,
 
        tmp = RREG32(ih_regs->ih_rb_cntl);
        tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_ENABLE, (enable ? 1 : 0));
+
+       if (enable) {
+               /* Unset the CLEAR_OVERFLOW bit to make sure the next step
+                * is switching the bit from 0 to 1
+                */
+               tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0);
+               if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) {
+                       if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp))
+                               return -ETIMEDOUT;
+               } else {
+                       WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp);
+               }
+
+               /* Clear RB_OVERFLOW bit */
+               tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1);
+               if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) {
+                       if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp))
+                               return -ETIMEDOUT;
+               } else {
+                       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);
+       }
+
        /* enable_intr field is only valid in ring0 */
        if (ih == &adev->irq.ih)
                tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, ENABLE_INTR, (enable ? 1 : 0));