162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * SPDX-License-Identifier: MIT
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright © 2018 Intel Corporation
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef _I915_SCHEDULER_H_
862306a36Sopenharmony_ci#define _I915_SCHEDULER_H_
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/bitops.h>
1162306a36Sopenharmony_ci#include <linux/list.h>
1262306a36Sopenharmony_ci#include <linux/kernel.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "i915_scheduler_types.h"
1562306a36Sopenharmony_ci#include "i915_tasklet.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct drm_printer;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define priolist_for_each_request(it, plist) \
2062306a36Sopenharmony_ci	list_for_each_entry(it, &(plist)->requests, sched.link)
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define priolist_for_each_request_consume(it, n, plist) \
2362306a36Sopenharmony_ci	list_for_each_entry_safe(it, n, &(plist)->requests, sched.link)
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_civoid i915_sched_node_init(struct i915_sched_node *node);
2662306a36Sopenharmony_civoid i915_sched_node_reinit(struct i915_sched_node *node);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cibool __i915_sched_node_add_dependency(struct i915_sched_node *node,
2962306a36Sopenharmony_ci				      struct i915_sched_node *signal,
3062306a36Sopenharmony_ci				      struct i915_dependency *dep,
3162306a36Sopenharmony_ci				      unsigned long flags);
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciint i915_sched_node_add_dependency(struct i915_sched_node *node,
3462306a36Sopenharmony_ci				   struct i915_sched_node *signal,
3562306a36Sopenharmony_ci				   unsigned long flags);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_civoid i915_sched_node_fini(struct i915_sched_node *node);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_civoid i915_schedule(struct i915_request *request,
4062306a36Sopenharmony_ci		   const struct i915_sched_attr *attr);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct list_head *
4362306a36Sopenharmony_cii915_sched_lookup_priolist(struct i915_sched_engine *sched_engine, int prio);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_civoid __i915_priolist_free(struct i915_priolist *p);
4662306a36Sopenharmony_cistatic inline void i915_priolist_free(struct i915_priolist *p)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	if (p->priority != I915_PRIORITY_NORMAL)
4962306a36Sopenharmony_ci		__i915_priolist_free(p);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct i915_sched_engine *
5362306a36Sopenharmony_cii915_sched_engine_create(unsigned int subclass);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic inline struct i915_sched_engine *
5662306a36Sopenharmony_cii915_sched_engine_get(struct i915_sched_engine *sched_engine)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	kref_get(&sched_engine->ref);
5962306a36Sopenharmony_ci	return sched_engine;
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline void
6362306a36Sopenharmony_cii915_sched_engine_put(struct i915_sched_engine *sched_engine)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	kref_put(&sched_engine->ref, sched_engine->destroy);
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic inline bool
6962306a36Sopenharmony_cii915_sched_engine_is_empty(struct i915_sched_engine *sched_engine)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	return RB_EMPTY_ROOT(&sched_engine->queue.rb_root);
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic inline void
7562306a36Sopenharmony_cii915_sched_engine_reset_on_empty(struct i915_sched_engine *sched_engine)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	if (i915_sched_engine_is_empty(sched_engine))
7862306a36Sopenharmony_ci		sched_engine->no_priolist = false;
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline void
8262306a36Sopenharmony_cii915_sched_engine_active_lock_bh(struct i915_sched_engine *sched_engine)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	local_bh_disable(); /* prevent local softirq and lock recursion */
8562306a36Sopenharmony_ci	tasklet_lock(&sched_engine->tasklet);
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic inline void
8962306a36Sopenharmony_cii915_sched_engine_active_unlock_bh(struct i915_sched_engine *sched_engine)
9062306a36Sopenharmony_ci{
9162306a36Sopenharmony_ci	tasklet_unlock(&sched_engine->tasklet);
9262306a36Sopenharmony_ci	local_bh_enable(); /* restore softirq, and kick ksoftirqd! */
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_civoid i915_request_show_with_schedule(struct drm_printer *m,
9662306a36Sopenharmony_ci				     const struct i915_request *rq,
9762306a36Sopenharmony_ci				     const char *prefix,
9862306a36Sopenharmony_ci				     int indent);
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistatic inline bool
10162306a36Sopenharmony_cii915_sched_engine_disabled(struct i915_sched_engine *sched_engine)
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	return sched_engine->disabled(sched_engine);
10462306a36Sopenharmony_ci}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_civoid i915_scheduler_module_exit(void);
10762306a36Sopenharmony_ciint i915_scheduler_module_init(void);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci#endif /* _I915_SCHEDULER_H_ */
110