Add a helper to calculate the distance in DWs between
two wptrs.

Signed-off-by: Alex Deucher <[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);
-- 
2.52.0

Reply via email to