]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/msm/a5xx: properly clear preemption records on resume
authorVladimir Lypak <vladimir.lypak@gmail.com>
Sun, 1 Sep 2024 13:54:01 +0000 (13:54 +0000)
committerRob Clark <robdclark@chromium.org>
Sun, 1 Sep 2024 15:17:53 +0000 (08:17 -0700)
Two fields of preempt_record which are used by CP aren't reset on
resume: "data" and "info". This is the reason behind faults which happen
when we try to switch to the ring that was active last before suspend.
In addition those faults can't be recovered from because we use suspend
and resume to do so (keeping values of those fields again).

Fixes: b1fc2839d2f9 ("drm/msm: Implement preemption for A5XX targets")
Signed-off-by: Vladimir Lypak <vladimir.lypak@gmail.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/612043/
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/adreno/a5xx_preempt.c

index f58dd564d122badde91a998b8f8f476849d533d5..67a8ef4adf6b62bd7a440c7e495504df61963c50 100644 (file)
@@ -204,6 +204,8 @@ void a5xx_preempt_hw_init(struct msm_gpu *gpu)
                return;
 
        for (i = 0; i < gpu->nr_rings; i++) {
+               a5xx_gpu->preempt[i]->data = 0;
+               a5xx_gpu->preempt[i]->info = 0;
                a5xx_gpu->preempt[i]->wptr = 0;
                a5xx_gpu->preempt[i]->rptr = 0;
                a5xx_gpu->preempt[i]->rbase = gpu->rb[i]->iova;