drm/amdgpu/sdma4: set wptr shadow atomically (v2)
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 27 Jul 2017 19:28:14 +0000 (15:28 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Aug 2017 18:46:02 +0000 (14:46 -0400)
No functional change until wptr polling uses this
location (future patch).

v2: use WRITE_ONCE

Cc: Frank Min <Frank.Min@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c

index 7cb5320d2424d9f782e49dcbb2108883c50abe7f..f970a4a6b666354fb63f274419df2dbc89f88719 100644 (file)
@@ -293,6 +293,8 @@ static void sdma_v4_0_ring_set_wptr(struct amdgpu_ring *ring)
 
        DRM_DEBUG("Setting write pointer\n");
        if (ring->use_doorbell) {
+               u64 *wb = (u64 *)&adev->wb.wb[ring->wptr_offs];
+
                DRM_DEBUG("Using doorbell -- "
                                "wptr_offs == 0x%08x "
                                "lower_32_bits(ring->wptr) << 2 == 0x%08x "
@@ -301,8 +303,7 @@ static void sdma_v4_0_ring_set_wptr(struct amdgpu_ring *ring)
                                lower_32_bits(ring->wptr << 2),
                                upper_32_bits(ring->wptr << 2));
                /* XXX check if swapping is necessary on BE */
-               adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr << 2);
-               adev->wb.wb[ring->wptr_offs + 1] = upper_32_bits(ring->wptr << 2);
+               WRITE_ONCE(*wb, (ring->wptr << 2));
                DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n",
                                ring->doorbell_index, ring->wptr << 2);