1 1.1 riastrad /* $NetBSD: intel_context.h,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * SPDX-License-Identifier: MIT 5 1.1 riastrad * 6 1.1 riastrad * Copyright 2019 Intel Corporation 7 1.1 riastrad */ 8 1.1 riastrad 9 1.1 riastrad #ifndef __INTEL_CONTEXT_H__ 10 1.1 riastrad #define __INTEL_CONTEXT_H__ 11 1.1 riastrad 12 1.1 riastrad #include <linux/bitops.h> 13 1.1 riastrad #include <linux/lockdep.h> 14 1.1 riastrad #include <linux/types.h> 15 1.1 riastrad 16 1.1 riastrad #include "i915_active.h" 17 1.1 riastrad #include "intel_context_types.h" 18 1.1 riastrad #include "intel_engine_types.h" 19 1.1 riastrad #include "intel_ring_types.h" 20 1.1 riastrad #include "intel_timeline_types.h" 21 1.1 riastrad 22 1.1 riastrad #define CE_TRACE(ce, fmt, ...) do { \ 23 1.1 riastrad const struct intel_context *ce__ = (ce); \ 24 1.1 riastrad ENGINE_TRACE(ce__->engine, "context:%llx " fmt, \ 25 1.1 riastrad ce__->timeline->fence_context, \ 26 1.1 riastrad ##__VA_ARGS__); \ 27 1.1 riastrad } while (0) 28 1.1 riastrad 29 1.1 riastrad void intel_context_init(struct intel_context *ce, 30 1.1 riastrad struct intel_engine_cs *engine); 31 1.1 riastrad void intel_context_fini(struct intel_context *ce); 32 1.1 riastrad 33 1.1 riastrad struct intel_context * 34 1.1 riastrad intel_context_create(struct intel_engine_cs *engine); 35 1.1 riastrad 36 1.1 riastrad int intel_context_alloc_state(struct intel_context *ce); 37 1.1 riastrad 38 1.1 riastrad void intel_context_free(struct intel_context *ce); 39 1.1 riastrad 40 1.1 riastrad /** 41 1.1 riastrad * intel_context_lock_pinned - Stablises the 'pinned' status of the HW context 42 1.1 riastrad * @ce - the context 43 1.1 riastrad * 44 1.1 riastrad * Acquire a lock on the pinned status of the HW context, such that the context 45 1.1 riastrad * can neither be bound to the GPU or unbound whilst the lock is held, i.e. 46 1.1 riastrad * intel_context_is_pinned() remains stable. 47 1.1 riastrad */ 48 1.1 riastrad static inline int intel_context_lock_pinned(struct intel_context *ce) 49 1.1 riastrad __acquires(ce->pin_mutex) 50 1.1 riastrad { 51 1.1 riastrad return mutex_lock_interruptible(&ce->pin_mutex); 52 1.1 riastrad } 53 1.1 riastrad 54 1.1 riastrad /** 55 1.1 riastrad * intel_context_is_pinned - Reports the 'pinned' status 56 1.1 riastrad * @ce - the context 57 1.1 riastrad * 58 1.1 riastrad * While in use by the GPU, the context, along with its ring and page 59 1.1 riastrad * tables is pinned into memory and the GTT. 60 1.1 riastrad * 61 1.1 riastrad * Returns: true if the context is currently pinned for use by the GPU. 62 1.1 riastrad */ 63 1.1 riastrad static inline bool 64 1.1 riastrad intel_context_is_pinned(struct intel_context *ce) 65 1.1 riastrad { 66 1.1 riastrad return atomic_read(&ce->pin_count); 67 1.1 riastrad } 68 1.1 riastrad 69 1.1 riastrad /** 70 1.1 riastrad * intel_context_unlock_pinned - Releases the earlier locking of 'pinned' status 71 1.1 riastrad * @ce - the context 72 1.1 riastrad * 73 1.1 riastrad * Releases the lock earlier acquired by intel_context_unlock_pinned(). 74 1.1 riastrad */ 75 1.1 riastrad static inline void intel_context_unlock_pinned(struct intel_context *ce) 76 1.1 riastrad __releases(ce->pin_mutex) 77 1.1 riastrad { 78 1.1 riastrad mutex_unlock(&ce->pin_mutex); 79 1.1 riastrad } 80 1.1 riastrad 81 1.1 riastrad int __intel_context_do_pin(struct intel_context *ce); 82 1.1 riastrad 83 1.1 riastrad static inline bool intel_context_pin_if_active(struct intel_context *ce) 84 1.1 riastrad { 85 1.1 riastrad return atomic_inc_not_zero(&ce->pin_count); 86 1.1 riastrad } 87 1.1 riastrad 88 1.1 riastrad static inline int intel_context_pin(struct intel_context *ce) 89 1.1 riastrad { 90 1.1 riastrad if (likely(intel_context_pin_if_active(ce))) 91 1.1 riastrad return 0; 92 1.1 riastrad 93 1.1 riastrad return __intel_context_do_pin(ce); 94 1.1 riastrad } 95 1.1 riastrad 96 1.1 riastrad static inline void __intel_context_pin(struct intel_context *ce) 97 1.1 riastrad { 98 1.1 riastrad GEM_BUG_ON(!intel_context_is_pinned(ce)); 99 1.1 riastrad atomic_inc(&ce->pin_count); 100 1.1 riastrad } 101 1.1 riastrad 102 1.1 riastrad void intel_context_unpin(struct intel_context *ce); 103 1.1 riastrad 104 1.1 riastrad void intel_context_enter_engine(struct intel_context *ce); 105 1.1 riastrad void intel_context_exit_engine(struct intel_context *ce); 106 1.1 riastrad 107 1.1 riastrad static inline void intel_context_enter(struct intel_context *ce) 108 1.1 riastrad { 109 1.1 riastrad lockdep_assert_held(&ce->timeline->mutex); 110 1.1 riastrad if (!ce->active_count++) 111 1.1 riastrad ce->ops->enter(ce); 112 1.1 riastrad } 113 1.1 riastrad 114 1.1 riastrad static inline void intel_context_mark_active(struct intel_context *ce) 115 1.1 riastrad { 116 1.1 riastrad lockdep_assert_held(&ce->timeline->mutex); 117 1.1 riastrad ++ce->active_count; 118 1.1 riastrad } 119 1.1 riastrad 120 1.1 riastrad static inline void intel_context_exit(struct intel_context *ce) 121 1.1 riastrad { 122 1.1 riastrad lockdep_assert_held(&ce->timeline->mutex); 123 1.1 riastrad GEM_BUG_ON(!ce->active_count); 124 1.1 riastrad if (!--ce->active_count) 125 1.1 riastrad ce->ops->exit(ce); 126 1.1 riastrad } 127 1.1 riastrad 128 1.1 riastrad static inline struct intel_context *intel_context_get(struct intel_context *ce) 129 1.1 riastrad { 130 1.1 riastrad kref_get(&ce->ref); 131 1.1 riastrad return ce; 132 1.1 riastrad } 133 1.1 riastrad 134 1.1 riastrad static inline void intel_context_put(struct intel_context *ce) 135 1.1 riastrad { 136 1.1 riastrad kref_put(&ce->ref, ce->ops->destroy); 137 1.1 riastrad } 138 1.1 riastrad 139 1.1 riastrad static inline struct intel_timeline *__must_check 140 1.1 riastrad intel_context_timeline_lock(struct intel_context *ce) 141 1.1 riastrad __acquires(&ce->timeline->mutex) 142 1.1 riastrad { 143 1.1 riastrad struct intel_timeline *tl = ce->timeline; 144 1.1 riastrad int err; 145 1.1 riastrad 146 1.1 riastrad err = mutex_lock_interruptible(&tl->mutex); 147 1.1 riastrad if (err) 148 1.1 riastrad return ERR_PTR(err); 149 1.1 riastrad 150 1.1 riastrad return tl; 151 1.1 riastrad } 152 1.1 riastrad 153 1.1 riastrad static inline void intel_context_timeline_unlock(struct intel_timeline *tl) 154 1.1 riastrad __releases(&tl->mutex) 155 1.1 riastrad { 156 1.1 riastrad mutex_unlock(&tl->mutex); 157 1.1 riastrad } 158 1.1 riastrad 159 1.1 riastrad int intel_context_prepare_remote_request(struct intel_context *ce, 160 1.1 riastrad struct i915_request *rq); 161 1.1 riastrad 162 1.1 riastrad struct i915_request *intel_context_create_request(struct intel_context *ce); 163 1.1 riastrad 164 1.1 riastrad static inline struct intel_ring *__intel_context_ring_size(u64 sz) 165 1.1 riastrad { 166 1.1 riastrad return u64_to_ptr(struct intel_ring, sz); 167 1.1 riastrad } 168 1.1 riastrad 169 1.1 riastrad static inline bool intel_context_is_barrier(const struct intel_context *ce) 170 1.1 riastrad { 171 1.1 riastrad return test_bit(CONTEXT_BARRIER_BIT, &ce->flags); 172 1.1 riastrad } 173 1.1 riastrad 174 1.1 riastrad static inline bool intel_context_use_semaphores(const struct intel_context *ce) 175 1.1 riastrad { 176 1.1 riastrad return test_bit(CONTEXT_USE_SEMAPHORES, &ce->flags); 177 1.1 riastrad } 178 1.1 riastrad 179 1.1 riastrad static inline void intel_context_set_use_semaphores(struct intel_context *ce) 180 1.1 riastrad { 181 1.1 riastrad set_bit(CONTEXT_USE_SEMAPHORES, &ce->flags); 182 1.1 riastrad } 183 1.1 riastrad 184 1.1 riastrad static inline void intel_context_clear_use_semaphores(struct intel_context *ce) 185 1.1 riastrad { 186 1.1 riastrad clear_bit(CONTEXT_USE_SEMAPHORES, &ce->flags); 187 1.1 riastrad } 188 1.1 riastrad 189 1.1 riastrad static inline bool intel_context_is_banned(const struct intel_context *ce) 190 1.1 riastrad { 191 1.1 riastrad return test_bit(CONTEXT_BANNED, &ce->flags); 192 1.1 riastrad } 193 1.1 riastrad 194 1.1 riastrad static inline bool intel_context_set_banned(struct intel_context *ce) 195 1.1 riastrad { 196 1.1 riastrad return test_and_set_bit(CONTEXT_BANNED, &ce->flags); 197 1.1 riastrad } 198 1.1 riastrad 199 1.1 riastrad static inline bool 200 1.1 riastrad intel_context_force_single_submission(const struct intel_context *ce) 201 1.1 riastrad { 202 1.1 riastrad return test_bit(CONTEXT_FORCE_SINGLE_SUBMISSION, &ce->flags); 203 1.1 riastrad } 204 1.1 riastrad 205 1.1 riastrad static inline void 206 1.1 riastrad intel_context_set_single_submission(struct intel_context *ce) 207 1.1 riastrad { 208 1.1 riastrad __set_bit(CONTEXT_FORCE_SINGLE_SUBMISSION, &ce->flags); 209 1.1 riastrad } 210 1.1 riastrad 211 1.1 riastrad static inline bool 212 1.1 riastrad intel_context_nopreempt(const struct intel_context *ce) 213 1.1 riastrad { 214 1.1 riastrad return test_bit(CONTEXT_NOPREEMPT, &ce->flags); 215 1.1 riastrad } 216 1.1 riastrad 217 1.1 riastrad static inline void 218 1.1 riastrad intel_context_set_nopreempt(struct intel_context *ce) 219 1.1 riastrad { 220 1.1 riastrad set_bit(CONTEXT_NOPREEMPT, &ce->flags); 221 1.1 riastrad } 222 1.1 riastrad 223 1.1 riastrad static inline void 224 1.1 riastrad intel_context_clear_nopreempt(struct intel_context *ce) 225 1.1 riastrad { 226 1.1 riastrad clear_bit(CONTEXT_NOPREEMPT, &ce->flags); 227 1.1 riastrad } 228 1.1 riastrad 229 1.1 riastrad #endif /* __INTEL_CONTEXT_H__ */ 230