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