Lines Matching full:scheduler
37 * DOC: Scheduler
64 * FW-scheduler, we use the 1:1 entity:scheduler mode, such that each
65 * entity has its own job scheduler. When a job is ready to be executed
149 * struct panthor_scheduler - Object used to manage the scheduler
156 * @wq: Workqueue used by our internal scheduler logic and
159 * Used for the scheduler tick, group update or other kind of FW
170 * blocking the rest of the scheduler if the allocation tries to
194 * FW event processing to the scheduler workqueue.
221 * @lock: Lock protecting access to all the scheduler fields.
293 /** @has_ref: True if the scheduler owns a runtime PM reference. */
357 /** @scheduler: DRM scheduler used for this queue. */
358 struct drm_gpu_scheduler scheduler; member
718 * Grabs a ref and queue a work item to the scheduler workqueue. If
726 if (!queue_work((group)->ptdev->scheduler->wq, &(group)->wname ## _work)) \
731 * sched_queue_work() - Queue a scheduler work.
732 * @sched: Scheduler object.
735 * Conditionally queues a scheduler work if no reset is pending/in-progress.
745 * sched_queue_delayed_work() - Queue a scheduler delayed work.
746 * @sched: Scheduler object.
750 * Conditionally queues a scheduler delayed work if no reset is
892 if (queue->scheduler.ops) in group_free_queue()
893 drm_sched_fini(&queue->scheduler); in group_free_queue()
968 lockdep_assert_held(&ptdev->scheduler->lock); in group_bind_locked()
971 ptdev->scheduler->csg_slots[csg_id].group)) in group_bind_locked()
978 csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in group_bind_locked()
1009 lockdep_assert_held(&ptdev->scheduler->lock); in group_unbind_locked()
1017 slot = &ptdev->scheduler->csg_slots[group->csg_id]; in group_unbind_locked()
1048 struct panthor_queue *queue = ptdev->scheduler->csg_slots[csg_id].group->queues[cs_id]; in cs_slot_prog_locked()
1051 lockdep_assert_held(&ptdev->scheduler->lock); in cs_slot_prog_locked()
1073 drm_sched_resume_timeout(&queue->scheduler, queue->remaining_time); in cs_slot_prog_locked()
1093 struct panthor_group *group = ptdev->scheduler->csg_slots[csg_id].group; in cs_slot_reset_locked()
1096 lockdep_assert_held(&ptdev->scheduler->lock); in cs_slot_reset_locked()
1106 queue->remaining_time = drm_sched_suspend_timeout(&queue->scheduler); in cs_slot_reset_locked()
1126 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_priority_locked()
1129 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_priority_locked()
1146 struct panthor_group *group = ptdev->scheduler->csg_slots[csg_id].group; in cs_slot_sync_queue_state_locked()
1163 &group->ptdev->scheduler->groups.waiting); in cs_slot_sync_queue_state_locked()
1197 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_queues_state_locked()
1201 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_queues_state_locked()
1215 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_state_locked()
1221 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_state_locked()
1293 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_prog_locked()
1301 csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_prog_locked()
1345 struct panthor_scheduler *sched = ptdev->scheduler; in cs_slot_process_fatal_event_locked()
1387 struct panthor_scheduler *sched = ptdev->scheduler; in cs_slot_process_fault_event_locked()
1434 struct panthor_scheduler *sched = ptdev->scheduler; in group_process_tiler_oom()
1466 /* We do the allocation without holding the scheduler lock to avoid in group_process_tiler_oom()
1537 struct panthor_scheduler *sched = ptdev->scheduler; in cs_slot_process_tiler_oom_event_locked()
1562 lockdep_assert_held(&ptdev->scheduler->lock); in cs_slot_process_irq_locked()
1588 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_idle_state_locked()
1591 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_idle_state_locked()
1599 struct panthor_scheduler *sched = ptdev->scheduler; in csg_slot_process_idle_event_locked()
1615 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_update_locked()
1618 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_update_locked()
1623 sched_queue_work(ptdev->scheduler, sync_upd); in csg_slot_sync_update_locked()
1629 struct panthor_scheduler *sched = ptdev->scheduler; in csg_slot_process_progress_timer_event_locked()
1650 lockdep_assert_held(&ptdev->scheduler->lock); in sched_process_csg_irq_locked()
1652 if (drm_WARN_ON(&ptdev->base, csg_id >= ptdev->scheduler->csg_slot_count)) in sched_process_csg_irq_locked()
1708 lockdep_assert_held(&ptdev->scheduler->lock); in sched_process_idle_event_locked()
1712 sched_queue_delayed_work(ptdev->scheduler, tick, 0); in sched_process_idle_event_locked()
1724 lockdep_assert_held(&ptdev->scheduler->lock); in sched_process_global_irq_locked()
1759 * panthor_sched_report_fw_events() - Report FW events to the scheduler.
1763 if (!ptdev->scheduler) in panthor_sched_report_fw_events()
1766 atomic_or(events, &ptdev->scheduler->fw_events); in panthor_sched_report_fw_events()
1767 sched_queue_work(ptdev->scheduler, fw_events); in panthor_sched_report_fw_events()
1804 drm_WARN_ON(&ptdev->base, csg_id >= ptdev->scheduler->csg_slot_count)) in csgs_upd_ctx_queue_reqs()
1815 struct panthor_scheduler *sched = ptdev->scheduler; in csgs_upd_ctx_apply_locked()
1898 return ptdev->scheduler->csg_slots[group->csg_id].idle; in group_is_idle()
2089 sched_queue_work(group->ptdev->scheduler, sync_upd); in group_term_post_processing()
2335 * keep the scheduler ticking, otherwise, we'll just wait for in tick_ctx_update_resched_target()
2533 struct panthor_scheduler *sched = ptdev->scheduler; in group_schedule_locked()
2542 /* All updated queues are blocked, no need to wake up the scheduler. */ in group_schedule_locked()
2570 /* Scheduler is ticking, nothing to do. */ in group_schedule_locked()
2579 /* Scheduler tick was off, recalculate the resched_target based on the in group_schedule_locked()
2580 * last tick event, and queue the scheduler work. in group_schedule_locked()
2594 drm_sched_stop(&queue->scheduler, bad_job ? &bad_job->base : NULL); in queue_stop()
2602 list_for_each_entry(job, &queue->scheduler.pending_list, base.list) in queue_start()
2605 drm_sched_start(&queue->scheduler, 0); in queue_start()
2610 struct panthor_scheduler *sched = group->ptdev->scheduler; in panthor_group_stop()
2623 struct panthor_scheduler *sched = group->ptdev->scheduler; in panthor_group_start()
2625 lockdep_assert_held(&group->ptdev->scheduler->reset.lock); in panthor_group_start()
2646 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_immediate_tick()
2652 * panthor_sched_report_mmu_fault() - Report MMU faults to the scheduler.
2657 if (ptdev->scheduler) in panthor_sched_report_mmu_fault()
2669 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_suspend()
2779 /* We don't bother stopping the scheduler if the group is in panthor_sched_suspend()
2792 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_pre_reset()
2799 /* Cancel all scheduler works. Once this is done, these works can't be in panthor_sched_pre_reset()
2827 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_post_reset()
2843 * kick the scheduler. in panthor_sched_post_reset()
2990 struct panthor_scheduler *sched = ptdev->scheduler; in get_job_cs_params()
3119 struct panthor_scheduler *sched = ptdev->scheduler; in queue_run_job()
3183 queue->remaining_time = drm_sched_suspend_timeout(&queue->scheduler); in queue_run_job()
3218 struct panthor_scheduler *sched = ptdev->scheduler; in queue_timedout_job()
3230 sched_queue_delayed_work(ptdev->scheduler, tick, 0); in queue_timedout_job()
3232 /* Remove from the run queues, so the scheduler can't in queue_timedout_job()
3292 .submit_wq = group->ptdev->scheduler->wq, in group_create_queue()
3376 ret = drm_sched_init(&queue->scheduler, &sched_args); in group_create_queue()
3380 drm_sched = &queue->scheduler; in group_create_queue()
3421 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_group_create()
3551 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_group_destroy()
3569 /* Remove from the run queues, so the scheduler can't in panthor_group_destroy()
3600 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_group_get_state()
3825 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_unplug()
3879 /* The FW-side scheduler might deadlock if two groups with the same in panthor_sched_init()
3933 * the scheduler because works queued by the scheduler are in in panthor_sched_init()
3958 ptdev->scheduler = sched; in panthor_sched_init()