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
152 * struct panthor_scheduler - Object used to manage the scheduler
159 * @wq: Workqueue used by our internal scheduler logic and
162 * Used for the scheduler tick, group update or other kind of FW
173 * blocking the rest of the scheduler if the allocation tries to
197 * FW event processing to the scheduler workqueue.
224 * @lock: Lock protecting access to all the scheduler fields.
296 /** @has_ref: True if the scheduler owns a runtime PM reference. */
360 /** @scheduler: DRM scheduler used for this queue. */
361 struct drm_gpu_scheduler scheduler; member
721 * Grabs a ref and queue a work item to the scheduler workqueue. If
729 if (!queue_work((group)->ptdev->scheduler->wq, &(group)->wname ## _work)) \
734 * sched_queue_work() - Queue a scheduler work.
735 * @sched: Scheduler object.
738 * Conditionally queues a scheduler work if no reset is pending/in-progress.
748 * sched_queue_delayed_work() - Queue a scheduler delayed work.
749 * @sched: Scheduler object.
753 * Conditionally queues a scheduler delayed work if no reset is
895 if (queue->scheduler.ops) in group_free_queue()
896 drm_sched_fini(&queue->scheduler); in group_free_queue()
971 lockdep_assert_held(&ptdev->scheduler->lock); in group_bind_locked()
974 ptdev->scheduler->csg_slots[csg_id].group)) in group_bind_locked()
981 csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in group_bind_locked()
1012 lockdep_assert_held(&ptdev->scheduler->lock); in group_unbind_locked()
1020 slot = &ptdev->scheduler->csg_slots[group->csg_id]; in group_unbind_locked()
1051 struct panthor_queue *queue = ptdev->scheduler->csg_slots[csg_id].group->queues[cs_id]; in cs_slot_prog_locked()
1054 lockdep_assert_held(&ptdev->scheduler->lock); in cs_slot_prog_locked()
1076 drm_sched_resume_timeout(&queue->scheduler, queue->remaining_time); in cs_slot_prog_locked()
1096 struct panthor_group *group = ptdev->scheduler->csg_slots[csg_id].group; in cs_slot_reset_locked()
1099 lockdep_assert_held(&ptdev->scheduler->lock); in cs_slot_reset_locked()
1109 queue->remaining_time = drm_sched_suspend_timeout(&queue->scheduler); in cs_slot_reset_locked()
1129 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_priority_locked()
1132 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_priority_locked()
1149 struct panthor_group *group = ptdev->scheduler->csg_slots[csg_id].group; in cs_slot_sync_queue_state_locked()
1166 &group->ptdev->scheduler->groups.waiting); in cs_slot_sync_queue_state_locked()
1200 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_queues_state_locked()
1204 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_queues_state_locked()
1218 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_state_locked()
1224 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_state_locked()
1296 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_prog_locked()
1304 csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_prog_locked()
1348 struct panthor_scheduler *sched = ptdev->scheduler; in cs_slot_process_fatal_event_locked()
1390 struct panthor_scheduler *sched = ptdev->scheduler; in cs_slot_process_fault_event_locked()
1437 struct panthor_scheduler *sched = ptdev->scheduler; in group_process_tiler_oom()
1469 /* We do the allocation without holding the scheduler lock to avoid in group_process_tiler_oom()
1540 struct panthor_scheduler *sched = ptdev->scheduler; in cs_slot_process_tiler_oom_event_locked()
1565 lockdep_assert_held(&ptdev->scheduler->lock); in cs_slot_process_irq_locked()
1591 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_idle_state_locked()
1594 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_idle_state_locked()
1602 struct panthor_scheduler *sched = ptdev->scheduler; in csg_slot_process_idle_event_locked()
1618 struct panthor_csg_slot *csg_slot = &ptdev->scheduler->csg_slots[csg_id]; in csg_slot_sync_update_locked()
1621 lockdep_assert_held(&ptdev->scheduler->lock); in csg_slot_sync_update_locked()
1626 sched_queue_work(ptdev->scheduler, sync_upd); in csg_slot_sync_update_locked()
1632 struct panthor_scheduler *sched = ptdev->scheduler; in csg_slot_process_progress_timer_event_locked()
1653 lockdep_assert_held(&ptdev->scheduler->lock); in sched_process_csg_irq_locked()
1655 if (drm_WARN_ON(&ptdev->base, csg_id >= ptdev->scheduler->csg_slot_count)) in sched_process_csg_irq_locked()
1711 lockdep_assert_held(&ptdev->scheduler->lock); in sched_process_idle_event_locked()
1715 sched_queue_delayed_work(ptdev->scheduler, tick, 0); in sched_process_idle_event_locked()
1727 lockdep_assert_held(&ptdev->scheduler->lock); in sched_process_global_irq_locked()
1762 * panthor_sched_report_fw_events() - Report FW events to the scheduler.
1766 if (!ptdev->scheduler) in panthor_sched_report_fw_events()
1769 atomic_or(events, &ptdev->scheduler->fw_events); in panthor_sched_report_fw_events()
1770 sched_queue_work(ptdev->scheduler, fw_events); in panthor_sched_report_fw_events()
1807 drm_WARN_ON(&ptdev->base, csg_id >= ptdev->scheduler->csg_slot_count)) in csgs_upd_ctx_queue_reqs()
1818 struct panthor_scheduler *sched = ptdev->scheduler; in csgs_upd_ctx_apply_locked()
1901 return ptdev->scheduler->csg_slots[group->csg_id].idle; in group_is_idle()
2092 sched_queue_work(group->ptdev->scheduler, sync_upd); in group_term_post_processing()
2338 * keep the scheduler ticking, otherwise, we'll just wait for in tick_ctx_update_resched_target()
2536 struct panthor_scheduler *sched = ptdev->scheduler; in group_schedule_locked()
2545 /* All updated queues are blocked, no need to wake up the scheduler. */ in group_schedule_locked()
2573 /* Scheduler is ticking, nothing to do. */ in group_schedule_locked()
2582 /* Scheduler tick was off, recalculate the resched_target based on the in group_schedule_locked()
2583 * last tick event, and queue the scheduler work. in group_schedule_locked()
2597 drm_sched_stop(&queue->scheduler, bad_job ? &bad_job->base : NULL); in queue_stop()
2605 list_for_each_entry(job, &queue->scheduler.pending_list, base.list) in queue_start()
2608 drm_sched_start(&queue->scheduler, 0); in queue_start()
2613 struct panthor_scheduler *sched = group->ptdev->scheduler; in panthor_group_stop()
2626 struct panthor_scheduler *sched = group->ptdev->scheduler; in panthor_group_start()
2628 lockdep_assert_held(&group->ptdev->scheduler->reset.lock); in panthor_group_start()
2649 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_immediate_tick()
2655 * panthor_sched_report_mmu_fault() - Report MMU faults to the scheduler.
2660 if (ptdev->scheduler) in panthor_sched_report_mmu_fault()
2672 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_suspend()
2782 /* We don't bother stopping the scheduler if the group is in panthor_sched_suspend()
2795 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_pre_reset()
2802 /* Cancel all scheduler works. Once this is done, these works can't be in panthor_sched_pre_reset()
2830 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_post_reset()
2846 * kick the scheduler. in panthor_sched_post_reset()
2993 struct panthor_scheduler *sched = ptdev->scheduler; in get_job_cs_params()
3122 struct panthor_scheduler *sched = ptdev->scheduler; in queue_run_job()
3186 queue->remaining_time = drm_sched_suspend_timeout(&queue->scheduler); in queue_run_job()
3221 struct panthor_scheduler *sched = ptdev->scheduler; in queue_timedout_job()
3233 sched_queue_delayed_work(ptdev->scheduler, tick, 0); in queue_timedout_job()
3235 /* Remove from the run queues, so the scheduler can't in queue_timedout_job()
3368 ret = drm_sched_init(&queue->scheduler, &panthor_queue_sched_ops, in group_create_queue()
3369 group->ptdev->scheduler->wq, 1, in group_create_queue()
3377 drm_sched = &queue->scheduler; in group_create_queue()
3418 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_group_create()
3548 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_group_destroy()
3566 /* Remove from the run queues, so the scheduler can't in panthor_group_destroy()
3597 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_group_get_state()
3822 struct panthor_scheduler *sched = ptdev->scheduler; in panthor_sched_unplug()
3876 /* The FW-side scheduler might deadlock if two groups with the same in panthor_sched_init()
3930 * the scheduler because works queued by the scheduler are in in panthor_sched_init()
3955 ptdev->scheduler = sched; in panthor_sched_init()