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 *
drm_sched_entity_queue_pop(struct drm_sched_entity * entity)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 *
drm_sched_entity_queue_peek(struct drm_sched_entity * entity)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
drm_sched_entity_is_ready(struct drm_sched_entity * entity)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