18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * SPDX-License-Identifier: MIT
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright © 2018 Intel Corporation
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef _I915_SCHEDULER_H_
88c2ecf20Sopenharmony_ci#define _I915_SCHEDULER_H_
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/bitops.h>
118c2ecf20Sopenharmony_ci#include <linux/list.h>
128c2ecf20Sopenharmony_ci#include <linux/kernel.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include "i915_scheduler_types.h"
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#define priolist_for_each_request(it, plist, idx) \
178c2ecf20Sopenharmony_ci	for (idx = 0; idx < ARRAY_SIZE((plist)->requests); idx++) \
188c2ecf20Sopenharmony_ci		list_for_each_entry(it, &(plist)->requests[idx], sched.link)
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define priolist_for_each_request_consume(it, n, plist, idx) \
218c2ecf20Sopenharmony_ci	for (; \
228c2ecf20Sopenharmony_ci	     (plist)->used ? (idx = __ffs((plist)->used)), 1 : 0; \
238c2ecf20Sopenharmony_ci	     (plist)->used &= ~BIT(idx)) \
248c2ecf20Sopenharmony_ci		list_for_each_entry_safe(it, n, \
258c2ecf20Sopenharmony_ci					 &(plist)->requests[idx], \
268c2ecf20Sopenharmony_ci					 sched.link)
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_civoid i915_sched_node_init(struct i915_sched_node *node);
298c2ecf20Sopenharmony_civoid i915_sched_node_reinit(struct i915_sched_node *node);
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cibool __i915_sched_node_add_dependency(struct i915_sched_node *node,
328c2ecf20Sopenharmony_ci				      struct i915_sched_node *signal,
338c2ecf20Sopenharmony_ci				      struct i915_dependency *dep,
348c2ecf20Sopenharmony_ci				      unsigned long flags);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ciint i915_sched_node_add_dependency(struct i915_sched_node *node,
378c2ecf20Sopenharmony_ci				   struct i915_sched_node *signal,
388c2ecf20Sopenharmony_ci				   unsigned long flags);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_civoid i915_sched_node_fini(struct i915_sched_node *node);
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_civoid i915_schedule(struct i915_request *request,
438c2ecf20Sopenharmony_ci		   const struct i915_sched_attr *attr);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_civoid i915_schedule_bump_priority(struct i915_request *rq, unsigned int bump);
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cistruct list_head *
488c2ecf20Sopenharmony_cii915_sched_lookup_priolist(struct intel_engine_cs *engine, int prio);
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_civoid __i915_priolist_free(struct i915_priolist *p);
518c2ecf20Sopenharmony_cistatic inline void i915_priolist_free(struct i915_priolist *p)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	if (p->priority != I915_PRIORITY_NORMAL)
548c2ecf20Sopenharmony_ci		__i915_priolist_free(p);
558c2ecf20Sopenharmony_ci}
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#endif /* _I915_SCHEDULER_H_ */
58