Commit | Line | Data |
---|---|---|
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 |
17 | struct 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 | 25 | void i915_sched_node_init(struct i915_sched_node *node); |
67a3acaa | 26 | void i915_sched_node_reinit(struct i915_sched_node *node); |
e2f3496e CW |
27 | |
28 | bool __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 | 33 | int 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 | 37 | void i915_sched_node_fini(struct i915_sched_node *node); |
e2f3496e CW |
38 | |
39 | void i915_schedule(struct i915_request *request, | |
40 | const struct i915_sched_attr *attr); | |
41 | ||
42 | struct list_head * | |
d2a31d02 | 43 | i915_sched_lookup_priolist(struct i915_sched_engine *sched_engine, int prio); |
e2f3496e | 44 | |
32eb6bcf CW |
45 | void __i915_priolist_free(struct i915_priolist *p); |
46 | static 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 |
52 | struct i915_sched_engine * |
53 | i915_sched_engine_create(unsigned int subclass); | |
54 | ||
3e28d371 MB |
55 | static inline struct i915_sched_engine * |
56 | i915_sched_engine_get(struct i915_sched_engine *sched_engine) | |
57 | { | |
58 | kref_get(&sched_engine->ref); | |
59 | return sched_engine; | |
60 | } | |
61 | ||
62 | static inline void | |
63 | i915_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 |
68 | static inline bool |
69 | i915_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 |
74 | static inline void |
75 | i915_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 |
81 | static inline void |
82 | i915_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 | ||
88 | static inline void | |
89 | i915_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 |
95 | void 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 |
100 | static inline bool |
101 | i915_sched_engine_disabled(struct i915_sched_engine *sched_engine) | |
102 | { | |
103 | return sched_engine->disabled(sched_engine); | |
104 | } | |
105 | ||
210a0f5c DV |
106 | void i915_scheduler_module_exit(void); |
107 | int i915_scheduler_module_init(void); | |
108 | ||
98ff5c78 | 109 | #endif /* _I915_SCHEDULER_H_ */ |