diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 1 |
2 files changed, 34 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c index cf2d64bef0df..70ff09d10885 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity); | 33 | static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity); |
34 | static void amd_sched_wakeup(struct amd_gpu_scheduler *sched); | 34 | static void amd_sched_wakeup(struct amd_gpu_scheduler *sched); |
35 | static void amd_sched_process_job(struct fence *f, struct fence_cb *cb); | ||
35 | 36 | ||
36 | struct kmem_cache *sched_fence_slab; | 37 | struct kmem_cache *sched_fence_slab; |
37 | atomic_t sched_fence_slab_ref = ATOMIC_INIT(0); | 38 | atomic_t sched_fence_slab_ref = ATOMIC_INIT(0); |
@@ -395,6 +396,38 @@ void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched) | |||
395 | spin_unlock(&sched->job_list_lock); | 396 | spin_unlock(&sched->job_list_lock); |
396 | } | 397 | } |
397 | 398 | ||
399 | void amd_sched_job_recovery(struct amd_gpu_scheduler *sched) | ||
400 | { | ||
401 | struct amd_sched_job *s_job; | ||
402 | int r; | ||
403 | |||
404 | spin_lock(&sched->job_list_lock); | ||
405 | s_job = list_first_entry_or_null(&sched->ring_mirror_list, | ||
406 | struct amd_sched_job, node); | ||
407 | if (s_job) | ||
408 | schedule_delayed_work(&s_job->work_tdr, sched->timeout); | ||
409 | |||
410 | list_for_each_entry(s_job, &sched->ring_mirror_list, node) { | ||
411 | struct amd_sched_fence *s_fence = s_job->s_fence; | ||
412 | struct fence *fence = sched->ops->run_job(s_job); | ||
413 | if (fence) { | ||
414 | s_fence->parent = fence_get(fence); | ||
415 | r = fence_add_callback(fence, &s_fence->cb, | ||
416 | amd_sched_process_job); | ||
417 | if (r == -ENOENT) | ||
418 | amd_sched_process_job(fence, &s_fence->cb); | ||
419 | else if (r) | ||
420 | DRM_ERROR("fence add callback failed (%d)\n", | ||
421 | r); | ||
422 | fence_put(fence); | ||
423 | } else { | ||
424 | DRM_ERROR("Failed to run job!\n"); | ||
425 | amd_sched_process_job(NULL, &s_fence->cb); | ||
426 | } | ||
427 | } | ||
428 | spin_unlock(&sched->job_list_lock); | ||
429 | } | ||
430 | |||
398 | /** | 431 | /** |
399 | * Submit a job to the job queue | 432 | * Submit a job to the job queue |
400 | * | 433 | * |
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h index fdcd8fbf5e26..7cbbbfb502ef 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | |||
@@ -154,4 +154,5 @@ int amd_sched_job_init(struct amd_sched_job *job, | |||
154 | struct amd_sched_entity *entity, | 154 | struct amd_sched_entity *entity, |
155 | void *owner); | 155 | void *owner); |
156 | void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched); | 156 | void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched); |
157 | void amd_sched_job_recovery(struct amd_gpu_scheduler *sched); | ||
157 | #endif | 158 | #endif |