Lines Matching refs:sched
34 static void amd_sched_wakeup(struct amd_gpu_scheduler *sched);
118 int amd_sched_entity_init(struct amd_gpu_scheduler *sched, in amd_sched_entity_init() argument
125 if (!(sched && entity && rq)) in amd_sched_entity_init()
131 entity->sched = sched; in amd_sched_entity_init()
155 static bool amd_sched_entity_is_initialized(struct amd_gpu_scheduler *sched, in amd_sched_entity_is_initialized() argument
158 return entity->sched == sched && in amd_sched_entity_is_initialized()
204 void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, in amd_sched_entity_fini() argument
209 if (!amd_sched_entity_is_initialized(sched, entity)) in amd_sched_entity_fini()
216 wait_event(sched->job_scheduled, amd_sched_entity_is_idle(entity)); in amd_sched_entity_fini()
228 amd_sched_wakeup(entity->sched); in amd_sched_entity_wakeup()
233 struct amd_gpu_scheduler *sched = entity->sched; in amd_sched_entity_add_dependency_cb() local
244 if (s_fence && s_fence->sched == sched) { in amd_sched_entity_add_dependency_cb()
269 struct amd_gpu_scheduler *sched = entity->sched; in amd_sched_entity_pop_job() local
275 while ((entity->dependency = sched->ops->dependency(sched_job))) in amd_sched_entity_pop_job()
291 struct amd_gpu_scheduler *sched = sched_job->sched; in amd_sched_entity_in() local
306 amd_sched_wakeup(sched); in amd_sched_entity_in()
323 wait_event(entity->sched->job_scheduled, in amd_sched_entity_push_job()
330 static bool amd_sched_ready(struct amd_gpu_scheduler *sched) in amd_sched_ready() argument
332 return atomic_read(&sched->hw_rq_count) < in amd_sched_ready()
333 sched->hw_submission_limit; in amd_sched_ready()
339 static void amd_sched_wakeup(struct amd_gpu_scheduler *sched) in amd_sched_wakeup() argument
341 if (amd_sched_ready(sched)) in amd_sched_wakeup()
342 wake_up_interruptible(&sched->wake_up_worker); in amd_sched_wakeup()
349 amd_sched_select_entity(struct amd_gpu_scheduler *sched) in amd_sched_select_entity() argument
353 if (!amd_sched_ready(sched)) in amd_sched_select_entity()
357 entity = amd_sched_rq_select_entity(&sched->kernel_rq); in amd_sched_select_entity()
359 entity = amd_sched_rq_select_entity(&sched->sched_rq); in amd_sched_select_entity()
368 struct amd_gpu_scheduler *sched = s_fence->sched; in amd_sched_process_job() local
371 atomic_dec(&sched->hw_rq_count); in amd_sched_process_job()
373 if (sched->timeout != MAX_SCHEDULE_TIMEOUT) { in amd_sched_process_job()
375 spin_lock_irqsave(&sched->fence_list_lock, flags); in amd_sched_process_job()
377 spin_unlock_irqrestore(&sched->fence_list_lock, flags); in amd_sched_process_job()
381 wake_up_interruptible(&sched->wake_up_worker); in amd_sched_process_job()
388 struct amd_gpu_scheduler *sched = s_fence->sched; in amd_sched_fence_work_func() local
392 DRM_ERROR("[%s] scheduler is timeout!\n", sched->name); in amd_sched_fence_work_func()
395 spin_lock_irqsave(&sched->fence_list_lock, flags); in amd_sched_fence_work_func()
396 list_for_each_entry_safe(entity, tmp, &sched->fence_list, list) { in amd_sched_fence_work_func()
402 spin_unlock_irqrestore(&sched->fence_list_lock, flags); in amd_sched_fence_work_func()
408 struct amd_gpu_scheduler *sched = (struct amd_gpu_scheduler *)param; in amd_sched_main() local
411 spin_lock_init(&sched->fence_list_lock); in amd_sched_main()
412 INIT_LIST_HEAD(&sched->fence_list); in amd_sched_main()
422 wait_event_interruptible(sched->wake_up_worker, in amd_sched_main()
423 (entity = amd_sched_select_entity(sched)) || in amd_sched_main()
435 if (sched->timeout != MAX_SCHEDULE_TIMEOUT) { in amd_sched_main()
437 schedule_delayed_work(&s_fence->dwork, sched->timeout); in amd_sched_main()
438 spin_lock_irqsave(&sched->fence_list_lock, flags); in amd_sched_main()
439 list_add_tail(&s_fence->list, &sched->fence_list); in amd_sched_main()
440 spin_unlock_irqrestore(&sched->fence_list_lock, flags); in amd_sched_main()
443 atomic_inc(&sched->hw_rq_count); in amd_sched_main()
444 fence = sched->ops->run_job(sched_job); in amd_sched_main()
462 wake_up(&sched->job_scheduled); in amd_sched_main()
477 int amd_sched_init(struct amd_gpu_scheduler *sched, in amd_sched_init() argument
481 sched->ops = ops; in amd_sched_init()
482 sched->hw_submission_limit = hw_submission; in amd_sched_init()
483 sched->name = name; in amd_sched_init()
484 sched->timeout = timeout; in amd_sched_init()
485 amd_sched_rq_init(&sched->sched_rq); in amd_sched_init()
486 amd_sched_rq_init(&sched->kernel_rq); in amd_sched_init()
488 init_waitqueue_head(&sched->wake_up_worker); in amd_sched_init()
489 init_waitqueue_head(&sched->job_scheduled); in amd_sched_init()
490 atomic_set(&sched->hw_rq_count, 0); in amd_sched_init()
500 sched->thread = kthread_run(amd_sched_main, sched, sched->name); in amd_sched_init()
501 if (IS_ERR(sched->thread)) { in amd_sched_init()
503 return PTR_ERR(sched->thread); in amd_sched_init()
514 void amd_sched_fini(struct amd_gpu_scheduler *sched) in amd_sched_fini() argument
516 if (sched->thread) in amd_sched_fini()
517 kthread_stop(sched->thread); in amd_sched_fini()