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