From c3fa87856608463f14dddb03346c31054f3137c9 Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Mon, 10 Feb 2020 11:44:39 -0500 Subject: drm/etnaviv: Always execute sched stop and start. During job timeout always stop and restart the scheduler even if no HW resetis taking place. Signed-off-by: Andrey Grodzovsky --- drivers/gpu/drm/etnaviv/etnaviv_sched.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_sched.c b/drivers/gpu/drm/etnaviv/etnaviv_sched.c index 4e3e95d..270caa8 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c @@ -89,12 +89,17 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job) u32 dma_addr; int change; + + + /* block scheduler */ + drm_sched_stop(&gpu->sched, sched_job); + /* * If the GPU managed to complete this jobs fence, the timout is * spurious. Bail out. */ if (dma_fence_is_signaled(submit->out_fence)) - return; + goto skip_hw_reset; /* * If the GPU is still making forward progress on the front-end (which @@ -105,12 +110,9 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job) change = dma_addr - gpu->hangcheck_dma_addr; if (change < 0 || change > 16) { gpu->hangcheck_dma_addr = dma_addr; - return; + goto skip_hw_reset; } - /* block scheduler */ - drm_sched_stop(&gpu->sched, sched_job); - if(sched_job) drm_sched_increase_karma(sched_job); @@ -120,6 +122,9 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job) drm_sched_resubmit_jobs(&gpu->sched); + +skip_hw_reset: + /* restart scheduler after GPU is usable again */ drm_sched_start(&gpu->sched, true); } -- 2.7.4