| /* SPDX-License-Identifier: MIT */ |
| |
| #ifndef _DRM_GPU_SCHEDULER_INTERNAL_H_ |
| #define _DRM_GPU_SCHEDULER_INTERNAL_H_ |
| |
| |
| /* Used to choose between FIFO and RR job-scheduling */ |
| extern int drm_sched_policy; |
| |
| #define DRM_SCHED_POLICY_RR 0 |
| #define DRM_SCHED_POLICY_FIFO 1 |
| |
| void drm_sched_wakeup(struct drm_gpu_scheduler *sched); |
| |
| void drm_sched_rq_add_entity(struct drm_sched_rq *rq, |
| struct drm_sched_entity *entity); |
| void drm_sched_rq_remove_entity(struct drm_sched_rq *rq, |
| struct drm_sched_entity *entity); |
| |
| void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity, |
| struct drm_sched_rq *rq, ktime_t ts); |
| |
| void drm_sched_entity_select_rq(struct drm_sched_entity *entity); |
| struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity); |
| |
| struct drm_sched_fence *drm_sched_fence_alloc(struct drm_sched_entity *s_entity, |
| void *owner); |
| void drm_sched_fence_init(struct drm_sched_fence *fence, |
| struct drm_sched_entity *entity); |
| void drm_sched_fence_free(struct drm_sched_fence *fence); |
| |
| void drm_sched_fence_scheduled(struct drm_sched_fence *fence, |
| struct dma_fence *parent); |
| void drm_sched_fence_finished(struct drm_sched_fence *fence, int result); |
| |
| /** |
| * drm_sched_entity_queue_pop - Low level helper for popping queued jobs |
| * |
| * @entity: scheduler entity |
| * |
| * Low level helper for popping queued jobs. |
| * |
| * Returns: The job dequeued or NULL. |
| */ |
| static inline struct drm_sched_job * |
| drm_sched_entity_queue_pop(struct drm_sched_entity *entity) |
| { |
| struct spsc_node *node; |
| |
| node = spsc_queue_pop(&entity->job_queue); |
| if (!node) |
| return NULL; |
| |
| return container_of(node, struct drm_sched_job, queue_node); |
| } |
| |
| /** |
| * drm_sched_entity_queue_peek - Low level helper for peeking at the job queue |
| * |
| * @entity: scheduler entity |
| * |
| * Low level helper for peeking at the job queue |
| * |
| * Returns: The job at the head of the queue or NULL. |
| */ |
| static inline struct drm_sched_job * |
| drm_sched_entity_queue_peek(struct drm_sched_entity *entity) |
| { |
| struct spsc_node *node; |
| |
| node = spsc_queue_peek(&entity->job_queue); |
| if (!node) |
| return NULL; |
| |
| return container_of(node, struct drm_sched_job, queue_node); |
| } |
| |
| /* Return true if entity could provide a job. */ |
| static inline bool |
| drm_sched_entity_is_ready(struct drm_sched_entity *entity) |
| { |
| if (!spsc_queue_count(&entity->job_queue)) |
| return false; |
| |
| if (READ_ONCE(entity->dependency)) |
| return false; |
| |
| return true; |
| } |
| |
| #endif |