Linux 6.12-rc1
[linux-block.git] / drivers / gpu / drm / i915 / i915_scheduler.h
CommitLineData
98ff5c78
CW
1/*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright © 2018 Intel Corporation
5 */
6
7#ifndef _I915_SCHEDULER_H_
8#define _I915_SCHEDULER_H_
9
10#include <linux/bitops.h>
3a891a62 11#include <linux/list.h>
e2f3496e 12#include <linux/kernel.h>
98ff5c78 13
3a891a62 14#include "i915_scheduler_types.h"
330c1b31 15#include "i915_tasklet.h"
32eb6bcf 16
da7ac715
TU
17struct drm_printer;
18
2867ff6c
CW
19#define priolist_for_each_request(it, plist) \
20 list_for_each_entry(it, &(plist)->requests, sched.link)
32eb6bcf 21
2867ff6c
CW
22#define priolist_for_each_request_consume(it, n, plist) \
23 list_for_each_entry_safe(it, n, &(plist)->requests, sched.link)
32eb6bcf 24
e2f3496e 25void i915_sched_node_init(struct i915_sched_node *node);
67a3acaa 26void i915_sched_node_reinit(struct i915_sched_node *node);
e2f3496e
CW
27
28bool __i915_sched_node_add_dependency(struct i915_sched_node *node,
29 struct i915_sched_node *signal,
30 struct i915_dependency *dep,
31 unsigned long flags);
32
32eb6bcf 33int i915_sched_node_add_dependency(struct i915_sched_node *node,
a9d094dc
CW
34 struct i915_sched_node *signal,
35 unsigned long flags);
e2f3496e 36
32eb6bcf 37void i915_sched_node_fini(struct i915_sched_node *node);
e2f3496e
CW
38
39void i915_schedule(struct i915_request *request,
40 const struct i915_sched_attr *attr);
41
42struct list_head *
d2a31d02 43i915_sched_lookup_priolist(struct i915_sched_engine *sched_engine, int prio);
e2f3496e 44
32eb6bcf
CW
45void __i915_priolist_free(struct i915_priolist *p);
46static inline void i915_priolist_free(struct i915_priolist *p)
47{
48 if (p->priority != I915_PRIORITY_NORMAL)
49 __i915_priolist_free(p);
50}
51
3e28d371
MB
52struct i915_sched_engine *
53i915_sched_engine_create(unsigned int subclass);
54
3e28d371
MB
55static inline struct i915_sched_engine *
56i915_sched_engine_get(struct i915_sched_engine *sched_engine)
57{
58 kref_get(&sched_engine->ref);
59 return sched_engine;
60}
61
62static inline void
63i915_sched_engine_put(struct i915_sched_engine *sched_engine)
64{
27466222 65 kref_put(&sched_engine->ref, sched_engine->destroy);
3e28d371
MB
66}
67
074bb195
MB
68static inline bool
69i915_sched_engine_is_empty(struct i915_sched_engine *sched_engine)
70{
71 return RB_EMPTY_ROOT(&sched_engine->queue.rb_root);
72}
73
c4fd7d8c
MB
74static inline void
75i915_sched_engine_reset_on_empty(struct i915_sched_engine *sched_engine)
76{
77 if (i915_sched_engine_is_empty(sched_engine))
78 sched_engine->no_priolist = false;
79}
80
22916bad
MB
81static inline void
82i915_sched_engine_active_lock_bh(struct i915_sched_engine *sched_engine)
83{
84 local_bh_disable(); /* prevent local softirq and lock recursion */
85 tasklet_lock(&sched_engine->tasklet);
86}
87
88static inline void
89i915_sched_engine_active_unlock_bh(struct i915_sched_engine *sched_engine)
90{
91 tasklet_unlock(&sched_engine->tasklet);
92 local_bh_enable(); /* restore softirq, and kick ksoftirqd! */
93}
94
da7ac715
TU
95void i915_request_show_with_schedule(struct drm_printer *m,
96 const struct i915_request *rq,
97 const char *prefix,
98 int indent);
99
c41ee287
MB
100static inline bool
101i915_sched_engine_disabled(struct i915_sched_engine *sched_engine)
102{
103 return sched_engine->disabled(sched_engine);
104}
105
210a0f5c
DV
106void i915_scheduler_module_exit(void);
107int i915_scheduler_module_init(void);
108
98ff5c78 109#endif /* _I915_SCHEDULER_H_ */