17f4dd379Sjsg /*
27f4dd379Sjsg * SPDX-License-Identifier: MIT
37f4dd379Sjsg *
47f4dd379Sjsg * Copyright © 2018 Intel Corporation
57f4dd379Sjsg */
67f4dd379Sjsg
77f4dd379Sjsg #ifndef _I915_SCHEDULER_H_
87f4dd379Sjsg #define _I915_SCHEDULER_H_
97f4dd379Sjsg
107f4dd379Sjsg #include <linux/bitops.h>
11c349dbc7Sjsg #include <linux/list.h>
12c349dbc7Sjsg #include <linux/kernel.h>
137f4dd379Sjsg
14c349dbc7Sjsg #include "i915_scheduler_types.h"
15*1bb76ff1Sjsg #include "i915_tasklet.h"
167f4dd379Sjsg
175ca02815Sjsg struct drm_printer;
187f4dd379Sjsg
195ca02815Sjsg #define priolist_for_each_request(it, plist) \
205ca02815Sjsg list_for_each_entry(it, &(plist)->requests, sched.link)
215ca02815Sjsg
225ca02815Sjsg #define priolist_for_each_request_consume(it, n, plist) \
235ca02815Sjsg list_for_each_entry_safe(it, n, &(plist)->requests, sched.link)
247f4dd379Sjsg
25c349dbc7Sjsg void i915_sched_node_init(struct i915_sched_node *node);
26c349dbc7Sjsg void i915_sched_node_reinit(struct i915_sched_node *node);
277f4dd379Sjsg
28c349dbc7Sjsg bool __i915_sched_node_add_dependency(struct i915_sched_node *node,
29c349dbc7Sjsg struct i915_sched_node *signal,
30c349dbc7Sjsg struct i915_dependency *dep,
31c349dbc7Sjsg unsigned long flags);
327f4dd379Sjsg
33c349dbc7Sjsg int i915_sched_node_add_dependency(struct i915_sched_node *node,
34c349dbc7Sjsg struct i915_sched_node *signal,
35c349dbc7Sjsg unsigned long flags);
36c349dbc7Sjsg
37c349dbc7Sjsg void i915_sched_node_fini(struct i915_sched_node *node);
38c349dbc7Sjsg
39c349dbc7Sjsg void i915_schedule(struct i915_request *request,
40c349dbc7Sjsg const struct i915_sched_attr *attr);
41c349dbc7Sjsg
42c349dbc7Sjsg struct list_head *
435ca02815Sjsg i915_sched_lookup_priolist(struct i915_sched_engine *sched_engine, int prio);
44c349dbc7Sjsg
45c349dbc7Sjsg void __i915_priolist_free(struct i915_priolist *p);
i915_priolist_free(struct i915_priolist * p)46c349dbc7Sjsg static inline void i915_priolist_free(struct i915_priolist *p)
47c349dbc7Sjsg {
48c349dbc7Sjsg if (p->priority != I915_PRIORITY_NORMAL)
49c349dbc7Sjsg __i915_priolist_free(p);
50c349dbc7Sjsg }
517f4dd379Sjsg
525ca02815Sjsg struct i915_sched_engine *
535ca02815Sjsg i915_sched_engine_create(unsigned int subclass);
545ca02815Sjsg
555ca02815Sjsg static inline struct i915_sched_engine *
i915_sched_engine_get(struct i915_sched_engine * sched_engine)565ca02815Sjsg i915_sched_engine_get(struct i915_sched_engine *sched_engine)
575ca02815Sjsg {
585ca02815Sjsg kref_get(&sched_engine->ref);
595ca02815Sjsg return sched_engine;
605ca02815Sjsg }
615ca02815Sjsg
625ca02815Sjsg static inline void
i915_sched_engine_put(struct i915_sched_engine * sched_engine)635ca02815Sjsg i915_sched_engine_put(struct i915_sched_engine *sched_engine)
645ca02815Sjsg {
655ca02815Sjsg kref_put(&sched_engine->ref, sched_engine->destroy);
665ca02815Sjsg }
675ca02815Sjsg
685ca02815Sjsg static inline bool
i915_sched_engine_is_empty(struct i915_sched_engine * sched_engine)695ca02815Sjsg i915_sched_engine_is_empty(struct i915_sched_engine *sched_engine)
705ca02815Sjsg {
715ca02815Sjsg return RB_EMPTY_ROOT(&sched_engine->queue.rb_root);
725ca02815Sjsg }
735ca02815Sjsg
745ca02815Sjsg static inline void
i915_sched_engine_reset_on_empty(struct i915_sched_engine * sched_engine)755ca02815Sjsg i915_sched_engine_reset_on_empty(struct i915_sched_engine *sched_engine)
765ca02815Sjsg {
775ca02815Sjsg if (i915_sched_engine_is_empty(sched_engine))
785ca02815Sjsg sched_engine->no_priolist = false;
795ca02815Sjsg }
805ca02815Sjsg
815ca02815Sjsg static inline void
i915_sched_engine_active_lock_bh(struct i915_sched_engine * sched_engine)825ca02815Sjsg i915_sched_engine_active_lock_bh(struct i915_sched_engine *sched_engine)
835ca02815Sjsg {
845ca02815Sjsg local_bh_disable(); /* prevent local softirq and lock recursion */
855ca02815Sjsg tasklet_lock(&sched_engine->tasklet);
865ca02815Sjsg }
875ca02815Sjsg
885ca02815Sjsg static inline void
i915_sched_engine_active_unlock_bh(struct i915_sched_engine * sched_engine)895ca02815Sjsg i915_sched_engine_active_unlock_bh(struct i915_sched_engine *sched_engine)
905ca02815Sjsg {
915ca02815Sjsg tasklet_unlock(&sched_engine->tasklet);
925ca02815Sjsg local_bh_enable(); /* restore softirq, and kick ksoftirqd! */
935ca02815Sjsg }
945ca02815Sjsg
955ca02815Sjsg void i915_request_show_with_schedule(struct drm_printer *m,
965ca02815Sjsg const struct i915_request *rq,
975ca02815Sjsg const char *prefix,
985ca02815Sjsg int indent);
995ca02815Sjsg
1005ca02815Sjsg static inline bool
i915_sched_engine_disabled(struct i915_sched_engine * sched_engine)1015ca02815Sjsg i915_sched_engine_disabled(struct i915_sched_engine *sched_engine)
1025ca02815Sjsg {
1035ca02815Sjsg return sched_engine->disabled(sched_engine);
1045ca02815Sjsg }
1055ca02815Sjsg
1065ca02815Sjsg void i915_scheduler_module_exit(void);
1075ca02815Sjsg int i915_scheduler_module_init(void);
1085ca02815Sjsg
1097f4dd379Sjsg #endif /* _I915_SCHEDULER_H_ */
110