]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: drop volatile from ring buffer
authorChristian König <christian.koenig@amd.com>
Tue, 8 Oct 2024 15:23:22 +0000 (17:23 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 28 Oct 2024 20:32:03 +0000 (16:32 -0400)
Volatile only prevents the compiler from re-ordering reads and writes.
Since we always only modify the ring buffer from one CPU thread and have
an explicit barrier before signaling the HW this should have no effect at
all and just prevents compiler optimisations.

While at it drop the local variables as well.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Sunil Khatri <sunil.khatri@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h

index 42f616c05f504e59610c11b6c7df5e02d405a2e0..a6e28fe3f8d66b8e521292335a726baef3dba742 100644 (file)
@@ -109,21 +109,17 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned int ndw)
 void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
        uint32_t occupied, chunk1, chunk2;
-       uint32_t *dst;
 
        occupied = ring->wptr & ring->buf_mask;
-       dst = (void *)&ring->ring[occupied];
        chunk1 = ring->buf_mask + 1 - occupied;
        chunk1 = (chunk1 >= count) ? count : chunk1;
        chunk2 = count - chunk1;
 
        if (chunk1)
-               memset32(dst, ring->funcs->nop, chunk1);
+               memset32(&ring->ring[occupied], ring->funcs->nop, chunk1);
 
-       if (chunk2) {
-               dst = (void *)ring->ring;
-               memset32(dst, ring->funcs->nop, chunk2);
-       }
+       if (chunk2)
+               memset32(ring->ring, ring->funcs->nop, chunk2);
 
        ring->wptr += count;
        ring->wptr &= ring->ptr_mask;
index 574336d6714af3660b679002ac8d31b3f0622637..36fc9578c53c03433226bd36f6c0d9af20777bd5 100644 (file)
@@ -246,7 +246,7 @@ struct amdgpu_ring {
        struct drm_gpu_scheduler        sched;
 
        struct amdgpu_bo        *ring_obj;
-       volatile uint32_t       *ring;
+       uint32_t                *ring;
        unsigned                rptr_offs;
        u64                     rptr_gpu_addr;
        volatile u32            *rptr_cpu_addr;
@@ -288,7 +288,7 @@ struct amdgpu_ring {
        u64                     cond_exe_gpu_addr;
        volatile u32            *cond_exe_cpu_addr;
        unsigned int            set_q_mode_offs;
-       volatile u32            *set_q_mode_ptr;
+       u32                     *set_q_mode_ptr;
        u64                     set_q_mode_token;
        unsigned                vm_hub;
        unsigned                vm_inv_eng;
@@ -386,10 +386,8 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring,
                                              void *src, int count_dw)
 {
        unsigned occupied, chunk1, chunk2;
-       void *dst;
 
        occupied = ring->wptr & ring->buf_mask;
-       dst = (void *)&ring->ring[occupied];
        chunk1 = ring->buf_mask + 1 - occupied;
        chunk1 = (chunk1 >= count_dw) ? count_dw : chunk1;
        chunk2 = count_dw - chunk1;
@@ -397,12 +395,11 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring,
        chunk2 <<= 2;
 
        if (chunk1)
-               memcpy(dst, src, chunk1);
+               memcpy(&ring->ring[occupied], src, chunk1);
 
        if (chunk2) {
                src += chunk1;
-               dst = (void *)ring->ring;
-               memcpy(dst, src, chunk2);
+               memcpy(ring->ring, src, chunk2);
        }
 
        ring->wptr += count_dw;