164d6c500SChris Wilson /* 264d6c500SChris Wilson * SPDX-License-Identifier: MIT 364d6c500SChris Wilson * 464d6c500SChris Wilson * Copyright © 2019 Intel Corporation 564d6c500SChris Wilson */ 664d6c500SChris Wilson 764d6c500SChris Wilson #ifndef _I915_ACTIVE_TYPES_H_ 864d6c500SChris Wilson #define _I915_ACTIVE_TYPES_H_ 964d6c500SChris Wilson 1012c255b5SChris Wilson #include <linux/atomic.h> 112850748eSChris Wilson #include <linux/dma-fence.h> 12ce476c80SChris Wilson #include <linux/llist.h> 1312c255b5SChris Wilson #include <linux/mutex.h> 1464d6c500SChris Wilson #include <linux/rbtree.h> 1521950ee7SChris Wilson #include <linux/rcupdate.h> 1664d6c500SChris Wilson 1764d6c500SChris Wilson struct drm_i915_private; 1821950ee7SChris Wilson struct i915_active_request; 1921950ee7SChris Wilson struct i915_request; 2021950ee7SChris Wilson 2121950ee7SChris Wilson typedef void (*i915_active_retire_fn)(struct i915_active_request *, 2221950ee7SChris Wilson struct i915_request *); 2321950ee7SChris Wilson 2421950ee7SChris Wilson struct i915_active_request { 2521950ee7SChris Wilson struct i915_request __rcu *request; 2621950ee7SChris Wilson struct list_head link; 2721950ee7SChris Wilson i915_active_retire_fn retire; 2825ffd4b1SChris Wilson #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) 2925ffd4b1SChris Wilson /* 3025ffd4b1SChris Wilson * Incorporeal! 3125ffd4b1SChris Wilson * 3225ffd4b1SChris Wilson * Updates to the i915_active_request must be serialised under a lock 3325ffd4b1SChris Wilson * to ensure that the timeline is ordered. Normally, this is the 3425ffd4b1SChris Wilson * timeline->mutex, but another mutex may be used so long as it is 3525ffd4b1SChris Wilson * done so consistently. 3625ffd4b1SChris Wilson * 3725ffd4b1SChris Wilson * For lockdep tracking of the above, we store the lock we intend 3825ffd4b1SChris Wilson * to always use for updates of this i915_active_request during 3925ffd4b1SChris Wilson * construction and assert that is held on every update. 4025ffd4b1SChris Wilson */ 4125ffd4b1SChris Wilson struct mutex *lock; 4225ffd4b1SChris Wilson #endif 4321950ee7SChris Wilson }; 4464d6c500SChris Wilson 4512c255b5SChris Wilson struct active_node; 4612c255b5SChris Wilson 4764d6c500SChris Wilson struct i915_active { 4864d6c500SChris Wilson struct drm_i915_private *i915; 4964d6c500SChris Wilson 5012c255b5SChris Wilson struct active_node *cache; 5164d6c500SChris Wilson struct rb_root tree; 5212c255b5SChris Wilson struct mutex mutex; 5312c255b5SChris Wilson atomic_t count; 5464d6c500SChris Wilson 552850748eSChris Wilson /* Preallocated "exclusive" node */ 562850748eSChris Wilson struct dma_fence __rcu *excl; 572850748eSChris Wilson struct dma_fence_cb excl_cb; 582850748eSChris Wilson 5979c7a28eSChris Wilson unsigned long flags; 6079c7a28eSChris Wilson #define I915_ACTIVE_GRAB_BIT 0 6179c7a28eSChris Wilson 6212c255b5SChris Wilson int (*active)(struct i915_active *ref); 6364d6c500SChris Wilson void (*retire)(struct i915_active *ref); 64ce476c80SChris Wilson 65d8af05ffSChris Wilson struct llist_head preallocated_barriers; 6664d6c500SChris Wilson }; 6764d6c500SChris Wilson 6864d6c500SChris Wilson #endif /* _I915_ACTIVE_TYPES_H_ */ 69