Change-Id: Ia0378640962eef362569e0bbe090aea1ca083a55 Signed-off-by: Chunming Zhou <David1.Zhou at amd.com> --- drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 24 ++++++++++++++++++++++++ drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c index f96aa82..71b5f1a 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c @@ -110,6 +110,26 @@ amd_sched_rq_select_entity(struct amd_sched_rq *rq) } /** + * block all entity of this run queue + * + * @rq The run queue to check. + * + */ +int amd_sched_rq_block_entity(struct amd_sched_rq *rq, bool block) +{ + struct amd_sched_entity *entity; + + spin_lock(&rq->lock); + + list_for_each_entry(entity, &rq->entities, list) + entity->block = block; + + spin_unlock(&rq->lock); + + return 0; +} + +/** * Init a context entity used by scheduler when submit to HW ring. * * @sched The pointer to the scheduler @@ -134,6 +154,7 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched, INIT_LIST_HEAD(&entity->list); entity->rq = rq; entity->sched = sched; + entity->block = false; spin_lock_init(&entity->queue_lock); r = kfifo_alloc(&entity->job_queue, jobs * sizeof(void *), GFP_KERNEL); @@ -186,6 +207,9 @@ static bool amd_sched_entity_is_idle(struct amd_sched_entity *entity) */ static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity) { + if (entity->block) + return false; + if (kfifo_is_empty(&entity->job_queue)) return false; diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h index 7cbbbfb..a1c0073 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h @@ -52,6 +52,8 @@ struct amd_sched_entity { struct fence *dependency; struct fence_cb cb; + + bool block; }; /** @@ -155,4 +157,5 @@ int amd_sched_job_init(struct amd_sched_job *job, void *owner); void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched); void amd_sched_job_recovery(struct amd_gpu_scheduler *sched); +int amd_sched_rq_block_entity(struct amd_sched_rq *rq, bool block); #endif -- 1.9.1