2018-04-18 19:40:50 +01:00
/*
* SPDX - License - Identifier : MIT
*
* Copyright © 2018 Intel Corporation
*/
# ifndef _I915_SCHEDULER_H_
# define _I915_SCHEDULER_H_
# include <linux/bitops.h>
# include <uapi/drm/i915_drm.h>
enum {
I915_PRIORITY_MIN = I915_CONTEXT_MIN_USER_PRIORITY - 1 ,
I915_PRIORITY_NORMAL = I915_CONTEXT_DEFAULT_PRIORITY ,
I915_PRIORITY_MAX = I915_CONTEXT_MAX_USER_PRIORITY + 1 ,
I915_PRIORITY_INVALID = INT_MIN
} ;
2018-04-18 19:40:52 +01:00
struct i915_sched_attr {
/**
* @ priority : execution and service priority
*
* All clients are equal , but some are more equal than others !
*
* Requests from a context with a greater ( more positive ) value of
* @ priority will be executed before those with a lower @ priority
* value , forming a simple QoS .
*
* The & drm_i915_private . kernel_context is assigned the lowest priority .
*/
int priority ;
} ;
2018-04-18 19:40:50 +01:00
/*
* " People assume that time is a strict progression of cause to effect, but
* actually , from a nonlinear , non - subjective viewpoint , it ' s more like a big
* ball of wibbly - wobbly , timey - wimey . . . stuff . " -The Doctor, 2015
*
* Requests exist in a complex web of interdependencies . Each request
* has to wait for some other request to complete before it is ready to be run
* ( e . g . we have to wait until the pixels have been rendering into a texture
* before we can copy from it ) . We track the readiness of a request in terms
* of fences , but we also need to keep the dependency tree for the lifetime
* of the request ( beyond the life of an individual fence ) . We use the tree
* at various points to reorder the requests whilst keeping the requests
* in order with respect to their various dependencies .
*
* There is no active component to the " scheduler " . As we know the dependency
* DAG of each request , we are able to insert it into a sorted queue when it
* is ready , and are able to reorder its portion of the graph to accommodate
* dynamic priority changes .
*/
2018-04-18 19:40:51 +01:00
struct i915_sched_node {
2018-04-18 19:40:50 +01:00
struct list_head signalers_list ; /* those before us, we depend upon */
struct list_head waiters_list ; /* those after us, they depend upon us */
struct list_head link ;
2018-04-18 19:40:52 +01:00
struct i915_sched_attr attr ;
2018-04-18 19:40:50 +01:00
} ;
struct i915_dependency {
2018-04-18 19:40:51 +01:00
struct i915_sched_node * signaler ;
2018-04-18 19:40:50 +01:00
struct list_head signal_link ;
struct list_head wait_link ;
struct list_head dfs_link ;
unsigned long flags ;
# define I915_DEPENDENCY_ALLOC BIT(0)
} ;
# endif /* _I915_SCHEDULER_H_ */