xref: /openbsd/sys/dev/pci/drm/i915/i915_scheduler.h (revision 1bb76ff1)
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