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