1 /* SPDX-License-Identifier: MIT */ 2 3 #ifndef _DRM_GPU_SCHEDULER_INTERNAL_H_ 4 #define _DRM_GPU_SCHEDULER_INTERNAL_H_ 5 6 7 /* Used to choose between FIFO and RR job-scheduling */ 8 extern int drm_sched_policy; 9 10 #define DRM_SCHED_POLICY_RR 0 11 #define DRM_SCHED_POLICY_FIFO 1 12 13 void drm_sched_wakeup(struct drm_gpu_scheduler *sched); 14 15 void drm_sched_rq_add_entity(struct drm_sched_rq *rq, 16 struct drm_sched_entity *entity); 17 void drm_sched_rq_remove_entity(struct drm_sched_rq *rq, 18 struct drm_sched_entity *entity); 19 20 void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity, 21 struct drm_sched_rq *rq, ktime_t ts); 22 23 void drm_sched_entity_select_rq(struct drm_sched_entity *entity); 24 struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity); 25 26 struct drm_sched_fence *drm_sched_fence_alloc(struct drm_sched_entity *s_entity, 27 void *owner); 28 void drm_sched_fence_init(struct drm_sched_fence *fence, 29 struct drm_sched_entity *entity); 30 void drm_sched_fence_free(struct drm_sched_fence *fence); 31 32 void drm_sched_fence_scheduled(struct drm_sched_fence *fence, 33 struct dma_fence *parent); 34 void drm_sched_fence_finished(struct drm_sched_fence *fence, int result); 35 36 /** 37 * drm_sched_entity_queue_pop - Low level helper for popping queued jobs 38 * 39 * @entity: scheduler entity 40 * 41 * Low level helper for popping queued jobs. 42 * 43 * Returns: The job dequeued or NULL. 44 */ 45 static inline struct drm_sched_job * 46 drm_sched_entity_queue_pop(struct drm_sched_entity *entity) 47 { 48 struct spsc_node *node; 49 50 node = spsc_queue_pop(&entity->job_queue); 51 if (!node) 52 return NULL; 53 54 return container_of(node, struct drm_sched_job, queue_node); 55 } 56 57 /** 58 * drm_sched_entity_queue_peek - Low level helper for peeking at the job queue 59 * 60 * @entity: scheduler entity 61 * 62 * Low level helper for peeking at the job queue 63 * 64 * Returns: The job at the head of the queue or NULL. 65 */ 66 static inline struct drm_sched_job * 67 drm_sched_entity_queue_peek(struct drm_sched_entity *entity) 68 { 69 struct spsc_node *node; 70 71 node = spsc_queue_peek(&entity->job_queue); 72 if (!node) 73 return NULL; 74 75 return container_of(node, struct drm_sched_job, queue_node); 76 } 77 78 /* Return true if entity could provide a job. */ 79 static inline bool 80 drm_sched_entity_is_ready(struct drm_sched_entity *entity) 81 { 82 if (!spsc_queue_count(&entity->job_queue)) 83 return false; 84 85 if (READ_ONCE(entity->dependency)) 86 return false; 87 88 return true; 89 } 90 91 #endif 92