Commit 2311720a authored by Rob Clark's avatar Rob Clark Committed by Dmitry Baryshkov
Browse files

drm/msm: Fix fence rollover issue



And while we are at it, let's start the fence counter close to the
rollover point so that if issues slip in, they are more obvious.

Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Fixes: fde5de6c ("drm/msm: move fence code to it's own file")
Fixes: 5f3aee4c ("drm/msm: Handle fence rollover")
Patchwork: https://patchwork.freedesktop.org/patch/489619/
Link: https://lore.kernel.org/r/20220615162435.3011793-1-robdclark@gmail.com


[DB: fixed the conflict while applying the patch]
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
parent 4400c3a1
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -28,6 +28,14 @@ msm_fence_context_alloc(struct drm_device *dev, volatile uint32_t *fenceptr,
	fctx->fenceptr = fenceptr;
	spin_lock_init(&fctx->spinlock);

	/*
	 * Start out close to the 32b fence rollover point, so we can
	 * catch bugs with fence comparisons.
	 */
	fctx->last_fence = 0xffffff00;
	fctx->completed_fence = fctx->last_fence;
	*fctx->fenceptr = fctx->last_fence;

	return fctx;
}

@@ -52,7 +60,8 @@ void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence)
	unsigned long flags;

	spin_lock_irqsave(&fctx->spinlock, flags);
	fctx->completed_fence = max(fence, fctx->completed_fence);
	if (fence_after(fence, fctx->completed_fence))
		fctx->completed_fence = fence;
	spin_unlock_irqrestore(&fctx->spinlock, flags);
}