Commit 4eb70cd3 authored by Qiang Yu's avatar Qiang Yu

drm/lima: always set page directory when switch vm

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: default avatarBhushan Shah <bshah@kde.org>
Reviewed-by: default avatarVasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: default avatarQiang Yu <yuq825@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200421133551.31481-5-yuq825@gmail.com
parent 24943269
...@@ -113,7 +113,6 @@ void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm) ...@@ -113,7 +113,6 @@ void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm)
LIMA_MMU_STATUS, v, LIMA_MMU_STATUS, v,
v & LIMA_MMU_STATUS_STALL_ACTIVE); 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 */ /* flush the TLB */
......
...@@ -200,7 +200,6 @@ static struct dma_fence *lima_sched_run_job(struct drm_sched_job *job) ...@@ -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_sched_pipe *pipe = to_lima_pipe(job->sched);
struct lima_fence *fence; struct lima_fence *fence;
struct dma_fence *ret; struct dma_fence *ret;
struct lima_vm *vm = NULL, *last_vm = NULL;
int i; int i;
/* after GPU reset */ /* after GPU reset */
...@@ -239,21 +238,16 @@ static struct dma_fence *lima_sched_run_job(struct drm_sched_job *job) ...@@ -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++) for (i = 0; i < pipe->num_l2_cache; i++)
lima_l2_cache_flush(pipe->l2_cache[i]); lima_l2_cache_flush(pipe->l2_cache[i]);
if (task->vm != pipe->current_vm) { lima_vm_put(pipe->current_vm);
vm = lima_vm_get(task->vm); pipe->current_vm = lima_vm_get(task->vm);
last_vm = pipe->current_vm;
pipe->current_vm = task->vm;
}
if (pipe->bcast_mmu) if (pipe->bcast_mmu)
lima_mmu_switch_vm(pipe->bcast_mmu, vm); lima_mmu_switch_vm(pipe->bcast_mmu, pipe->current_vm);
else { else {
for (i = 0; i < pipe->num_mmu; i++) 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); trace_lima_task_run(task);
pipe->error = false; pipe->error = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment