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> 16274cbf20SChris Wilson #include <linux/workqueue.h> 17274cbf20SChris Wilson 18274cbf20SChris Wilson #include "i915_utils.h" 1964d6c500SChris Wilson 20b1e3177bSChris Wilson struct i915_active_fence { 21b1e3177bSChris Wilson struct dma_fence __rcu *fence; 22b1e3177bSChris Wilson struct dma_fence_cb cb; 2325ffd4b1SChris Wilson #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) 2425ffd4b1SChris Wilson /* 2525ffd4b1SChris Wilson * Incorporeal! 2625ffd4b1SChris Wilson * 2725ffd4b1SChris Wilson * Updates to the i915_active_request must be serialised under a lock 2825ffd4b1SChris Wilson * to ensure that the timeline is ordered. Normally, this is the 2925ffd4b1SChris Wilson * timeline->mutex, but another mutex may be used so long as it is 3025ffd4b1SChris Wilson * done so consistently. 3125ffd4b1SChris Wilson * 3225ffd4b1SChris Wilson * For lockdep tracking of the above, we store the lock we intend 3325ffd4b1SChris Wilson * to always use for updates of this i915_active_request during 3425ffd4b1SChris Wilson * construction and assert that is held on every update. 3525ffd4b1SChris Wilson */ 3625ffd4b1SChris Wilson struct mutex *lock; 3725ffd4b1SChris Wilson #endif 3821950ee7SChris Wilson }; 3964d6c500SChris Wilson 4012c255b5SChris Wilson struct active_node; 4112c255b5SChris Wilson 42274cbf20SChris Wilson #define I915_ACTIVE_MAY_SLEEP BIT(0) 43274cbf20SChris Wilson 44274cbf20SChris Wilson #define __i915_active_call __aligned(4) 45274cbf20SChris Wilson #define i915_active_may_sleep(fn) ptr_pack_bits(&(fn), I915_ACTIVE_MAY_SLEEP, 2) 46274cbf20SChris Wilson 4764d6c500SChris Wilson struct i915_active { 48b1e3177bSChris Wilson atomic_t count; 49b1e3177bSChris Wilson struct mutex mutex; 5064d6c500SChris Wilson 5112c255b5SChris Wilson struct active_node *cache; 5264d6c500SChris Wilson struct rb_root tree; 5364d6c500SChris Wilson 542850748eSChris Wilson /* Preallocated "exclusive" node */ 55b1e3177bSChris Wilson struct i915_active_fence excl; 562850748eSChris Wilson 5779c7a28eSChris Wilson unsigned long flags; 58274cbf20SChris Wilson #define I915_ACTIVE_RETIRE_SLEEPS BIT(0) 5979c7a28eSChris Wilson 6012c255b5SChris Wilson int (*active)(struct i915_active *ref); 6164d6c500SChris Wilson void (*retire)(struct i915_active *ref); 62ce476c80SChris Wilson 63274cbf20SChris Wilson struct work_struct work; 64274cbf20SChris Wilson 65d8af05ffSChris Wilson struct llist_head preallocated_barriers; 6664d6c500SChris Wilson }; 6764d6c500SChris Wilson 6864d6c500SChris Wilson #endif /* _I915_ACTIVE_TYPES_H_ */ 69