Home | History | Annotate | Line # | Download | only in gt
      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