]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/lima: always set page directory when switch vm
authorQiang Yu <yuq825@gmail.com>
Tue, 21 Apr 2020 13:35:45 +0000 (21:35 +0800)
committerQiang Yu <yuq825@gmail.com>
Fri, 24 Apr 2020 12:50:51 +0000 (20:50 +0800)
We need to flush TLB anyway before every task start, and the
page directory will be set to empty vm after suspend/resume,
so always set it to the task vm even no ctx switch happens.

Tested-by: Bhushan Shah <bshah@kde.org>
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200421133551.31481-5-yuq825@gmail.com
drivers/gpu/drm/lima/lima_mmu.c
drivers/gpu/drm/lima/lima_sched.c

index f79d2af427e77cc173b6377118d5176b53f88360..c26b751b0f9db4a3ff799bc97be93cdd74cc192c 100644 (file)
@@ -113,8 +113,7 @@ void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm)
                              LIMA_MMU_STATUS, v,
                              v & LIMA_MMU_STATUS_STALL_ACTIVE);
 
-       if (vm)
-               mmu_write(LIMA_MMU_DTE_ADDR, vm->pd.dma);
+       mmu_write(LIMA_MMU_DTE_ADDR, vm->pd.dma);
 
        /* flush the TLB */
        mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_ZAP_CACHE);
index 3ac5797e31fcf98f9591cfdaef17edfa3629f83d..eb46db0717cd66b1931c0d7761c715db33011ac4 100644 (file)
@@ -200,7 +200,6 @@ static struct dma_fence *lima_sched_run_job(struct drm_sched_job *job)
        struct lima_sched_pipe *pipe = to_lima_pipe(job->sched);
        struct lima_fence *fence;
        struct dma_fence *ret;
-       struct lima_vm *vm = NULL, *last_vm = NULL;
        int i;
 
        /* after GPU reset */
@@ -239,21 +238,16 @@ static struct dma_fence *lima_sched_run_job(struct drm_sched_job *job)
        for (i = 0; i < pipe->num_l2_cache; i++)
                lima_l2_cache_flush(pipe->l2_cache[i]);
 
-       if (task->vm != pipe->current_vm) {
-               vm = lima_vm_get(task->vm);
-               last_vm = pipe->current_vm;
-               pipe->current_vm = task->vm;
-       }
+       lima_vm_put(pipe->current_vm);
+       pipe->current_vm = lima_vm_get(task->vm);
 
        if (pipe->bcast_mmu)
-               lima_mmu_switch_vm(pipe->bcast_mmu, vm);
+               lima_mmu_switch_vm(pipe->bcast_mmu, pipe->current_vm);
        else {
                for (i = 0; i < pipe->num_mmu; i++)
-                       lima_mmu_switch_vm(pipe->mmu[i], vm);
+                       lima_mmu_switch_vm(pipe->mmu[i], pipe->current_vm);
        }
 
-       lima_vm_put(last_vm);
-
        trace_lima_task_run(task);
 
        pipe->error = false;