diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index f6c3853e4ca2..9d0c2604d7e4 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -858,8 +858,7 @@ static void dispatcher_handle_jobs_list(struct adreno_device *adreno_dev, llist_for_each_entry_safe(job, next, list, node) { int ret; - if (adreno_gpu_stopped(adreno_dev) || - adreno_drawctxt_bad(job->drawctxt)) { + if (adreno_drawctxt_bad(job->drawctxt)) { kgsl_context_put(&job->drawctxt->base); kmem_cache_free(jobs_cache, job); continue; @@ -879,6 +878,16 @@ static void dispatcher_handle_jobs_list(struct adreno_device *adreno_dev, continue; } + /* + * If gpu is in fault or dispatcher is halted, add back the jobs + * so that they are processed after recovery or when dispatcher + * is resumed. + */ + if (adreno_gpu_stopped(adreno_dev)) { + llist_add(&job->node, &dispatcher->jobs[id]); + continue; + } + ret = dispatcher_context_sendcmds(adreno_dev, job->drawctxt); /*