diff mbox series

[1/2] drm/msm/a6xx: Clear shadow on suspend

Message ID 20201110184401.282982-1-robdclark@gmail.com
State New
Headers show
Series [1/2] drm/msm/a6xx: Clear shadow on suspend | expand

Commit Message

Rob Clark Nov. 10, 2020, 6:43 p.m. UTC
From: Rob Clark <robdclark@chromium.org>

Clear the shadow rptr on suspend.  Otherwise, when we resume, we can
have a stale value until CP_WHERE_AM_I executes.  If we suspend near
the ringbuffer wraparound point, this can lead to a chicken/egg
situation where we are waiting for ringbuffer space to write the
CP_WHERE_AM_I (or CP_INIT) packet, because we mistakenly believe that
the ringbuffer is full (due to stale rptr value in the shadow).

Fixes errors like:

  [drm:adreno_wait_ring [msm]] *ERROR* timeout waiting for space in ringbuffer 0

in the resume path.

Fixes: d3a569fccfa0 ("drm/msm: a6xx: Use WHERE_AM_I for eligible targets")
Signed-off-by: Rob Clark <robdclark@chromium.org>
---
 drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

patchwork-bot+linux-arm-msm@kernel.org Dec. 29, 2020, 8:15 p.m. UTC | #1
Hello:

This series was applied to qcom/linux.git (refs/heads/for-next):

On Tue, 10 Nov 2020 10:43:59 -0800 you wrote:
> From: Rob Clark <robdclark@chromium.org>

> 

> Clear the shadow rptr on suspend.  Otherwise, when we resume, we can

> have a stale value until CP_WHERE_AM_I executes.  If we suspend near

> the ringbuffer wraparound point, this can lead to a chicken/egg

> situation where we are waiting for ringbuffer space to write the

> CP_WHERE_AM_I (or CP_INIT) packet, because we mistakenly believe that

> the ringbuffer is full (due to stale rptr value in the shadow).

> 

> [...]


Here is the summary with links:
  - [1/2] drm/msm/a6xx: Clear shadow on suspend
    https://git.kernel.org/qcom/c/e8b0b994c3a5
  - [2/2] drm/msm/a5xx: Clear shadow on suspend
    https://git.kernel.org/qcom/c/5771de5d5b3b

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index 2f236aadfa9c..fcb0aabbc985 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -1043,12 +1043,21 @@  static int a6xx_pm_suspend(struct msm_gpu *gpu)
 {
 	struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
 	struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
+	int i, ret;
 
 	trace_msm_gpu_suspend(0);
 
 	devfreq_suspend_device(gpu->devfreq.devfreq);
 
-	return a6xx_gmu_stop(a6xx_gpu);
+	ret = a6xx_gmu_stop(a6xx_gpu);
+	if (ret)
+		return ret;
+
+	if (adreno_gpu->base.hw_apriv || a6xx_gpu->has_whereami)
+		for (i = 0; i < gpu->nr_rings; i++)
+			a6xx_gpu->shadow[i] = 0;
+
+	return 0;
 }
 
 static int a6xx_get_timestamp(struct msm_gpu *gpu, uint64_t *value)