Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 */
8extern int drm_sched_policy;
9
10#define DRM_SCHED_POLICY_RR 0
11#define DRM_SCHED_POLICY_FIFO 1
12
13void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
14
15void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
16 struct drm_sched_entity *entity);
17void drm_sched_rq_remove_entity(struct drm_sched_rq *rq,
18 struct drm_sched_entity *entity);
19
20void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity,
21 struct drm_sched_rq *rq, ktime_t ts);
22
23void drm_sched_entity_select_rq(struct drm_sched_entity *entity);
24struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity);
25
26struct drm_sched_fence *drm_sched_fence_alloc(struct drm_sched_entity *s_entity,
27 void *owner, u64 drm_client_id);
28void drm_sched_fence_init(struct drm_sched_fence *fence,
29 struct drm_sched_entity *entity);
30void drm_sched_fence_free(struct drm_sched_fence *fence);
31
32void drm_sched_fence_scheduled(struct drm_sched_fence *fence,
33 struct dma_fence *parent);
34void 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 */
45static inline struct drm_sched_job *
46drm_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 */
66static inline struct drm_sched_job *
67drm_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. */
79static inline bool
80drm_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