Le 30/01/2026 à 18:30, Alex Deucher a écrit :
Add a helper to calculate the distance in DWs between
two wptrs.

Signed-off-by: Alex Deucher <[email protected]>

Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]>

---
  drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 18 ++++++++++++------
  1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index ce095427611fb..e196ffbdd1f3a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -523,6 +523,17 @@ static inline void amdgpu_ring_write_multiple(struct 
amdgpu_ring *ring,
        ring->count_dw -= count_dw;
  }
+static inline unsigned int amdgpu_ring_get_dw_distance(struct amdgpu_ring *ring,
+                                                      u64 start_wptr, u64 
end_wptr)
+{
+       unsigned int start = start_wptr & ring->buf_mask;
+       unsigned int end = end_wptr & ring->buf_mask;
+
+       if (end < start)
+               end += ring->ring_size >> 2;
+       return end - start;
+}
+
  /**
   * amdgpu_ring_patch_cond_exec - patch dw count of conditional execute
   * @ring: amdgpu_ring structure
@@ -533,18 +544,13 @@ static inline void amdgpu_ring_write_multiple(struct 
amdgpu_ring *ring,
  static inline void amdgpu_ring_patch_cond_exec(struct amdgpu_ring *ring,
                                               unsigned int offset)
  {
-       unsigned cur;
-
        if (!ring->funcs->init_cond_exec)
                return;
WARN_ON(offset > ring->buf_mask);
        WARN_ON(ring->ring[offset] != 0);
- cur = (ring->wptr - 1) & ring->buf_mask;
-       if (cur < offset)
-               cur += ring->ring_size >> 2;
-       ring->ring[offset] = cur - offset;
+       ring->ring[offset] = amdgpu_ring_get_dw_distance(ring, offset, 
ring->wptr - 1);
  }
int amdgpu_ring_test_helper(struct amdgpu_ring *ring);

Reply via email to