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: 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
This commit is contained in:
parent
24943269e5
commit
4eb70cd3f2
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user