1 1.6 riastrad /* $NetBSD: i915_sw_fence.h,v 1.6 2021/12/19 11:36:08 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 * i915_sw_fence.h - library routines for N:M synchronisation points 7 1.1 riastrad * 8 1.1 riastrad * Copyright (C) 2016 Intel Corporation 9 1.1 riastrad */ 10 1.1 riastrad 11 1.1 riastrad #ifndef _I915_SW_FENCE_H_ 12 1.1 riastrad #define _I915_SW_FENCE_H_ 13 1.1 riastrad 14 1.1 riastrad #include <linux/dma-fence.h> 15 1.1 riastrad #include <linux/gfp.h> 16 1.1 riastrad #include <linux/kref.h> 17 1.1 riastrad #include <linux/notifier.h> /* for NOTIFY_DONE */ 18 1.1 riastrad #include <linux/wait.h> 19 1.1 riastrad 20 1.1 riastrad struct completion; 21 1.1 riastrad struct dma_resv; 22 1.1 riastrad 23 1.6 riastrad struct i915_sw_fence_waiter { 24 1.6 riastrad struct list_head entry; 25 1.6 riastrad int flags; 26 1.6 riastrad int (*func)(struct i915_sw_fence_waiter *, unsigned, int, void *); 27 1.6 riastrad void *private; 28 1.6 riastrad }; 29 1.6 riastrad 30 1.1 riastrad struct i915_sw_fence { 31 1.6 riastrad struct i915_sw_fence_queue { 32 1.6 riastrad spinlock_t lock; 33 1.6 riastrad struct list_head head; 34 1.6 riastrad } wait; 35 1.1 riastrad unsigned long flags; 36 1.1 riastrad atomic_t pending; 37 1.1 riastrad int error; 38 1.1 riastrad }; 39 1.1 riastrad 40 1.1 riastrad #define I915_SW_FENCE_CHECKED_BIT 0 /* used internally for DAG checking */ 41 1.1 riastrad #define I915_SW_FENCE_PRIVATE_BIT 1 /* available for use by owner */ 42 1.1 riastrad #define I915_SW_FENCE_MASK (~3) 43 1.1 riastrad 44 1.1 riastrad enum i915_sw_fence_notify { 45 1.1 riastrad FENCE_COMPLETE, 46 1.1 riastrad FENCE_FREE 47 1.1 riastrad }; 48 1.1 riastrad 49 1.1 riastrad typedef int (*i915_sw_fence_notify_t)(struct i915_sw_fence *, 50 1.1 riastrad enum i915_sw_fence_notify state); 51 1.1 riastrad #define __i915_sw_fence_call __aligned(4) 52 1.1 riastrad 53 1.1 riastrad void __i915_sw_fence_init(struct i915_sw_fence *fence, 54 1.1 riastrad i915_sw_fence_notify_t fn, 55 1.1 riastrad const char *name, 56 1.1 riastrad struct lock_class_key *key); 57 1.3 riastrad #if IS_ENABLED(CONFIG_LOCKDEP) 58 1.1 riastrad #define i915_sw_fence_init(fence, fn) \ 59 1.1 riastrad do { \ 60 1.1 riastrad static struct lock_class_key __key; \ 61 1.1 riastrad \ 62 1.1 riastrad __i915_sw_fence_init((fence), (fn), #fence, &__key); \ 63 1.1 riastrad } while (0) 64 1.1 riastrad #else 65 1.1 riastrad #define i915_sw_fence_init(fence, fn) \ 66 1.1 riastrad __i915_sw_fence_init((fence), (fn), NULL, NULL) 67 1.1 riastrad #endif 68 1.1 riastrad 69 1.1 riastrad void i915_sw_fence_reinit(struct i915_sw_fence *fence); 70 1.1 riastrad 71 1.1 riastrad void i915_sw_fence_fini(struct i915_sw_fence *fence); 72 1.1 riastrad 73 1.1 riastrad void i915_sw_fence_commit(struct i915_sw_fence *fence); 74 1.1 riastrad 75 1.6 riastrad #ifdef __NetBSD__ 76 1.6 riastrad int i915_sw_fence_await_sw_fence(struct i915_sw_fence *, 77 1.6 riastrad struct i915_sw_fence *, 78 1.6 riastrad struct i915_sw_fence_waiter *); 79 1.6 riastrad #else 80 1.1 riastrad int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence, 81 1.1 riastrad struct i915_sw_fence *after, 82 1.1 riastrad wait_queue_entry_t *wq); 83 1.6 riastrad #endif 84 1.1 riastrad int i915_sw_fence_await_sw_fence_gfp(struct i915_sw_fence *fence, 85 1.1 riastrad struct i915_sw_fence *after, 86 1.1 riastrad gfp_t gfp); 87 1.1 riastrad 88 1.1 riastrad struct i915_sw_dma_fence_cb { 89 1.1 riastrad struct dma_fence_cb base; 90 1.1 riastrad struct i915_sw_fence *fence; 91 1.1 riastrad }; 92 1.1 riastrad 93 1.1 riastrad int __i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence, 94 1.1 riastrad struct dma_fence *dma, 95 1.1 riastrad struct i915_sw_dma_fence_cb *cb); 96 1.1 riastrad int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence, 97 1.1 riastrad struct dma_fence *dma, 98 1.1 riastrad unsigned long timeout, 99 1.1 riastrad gfp_t gfp); 100 1.1 riastrad 101 1.1 riastrad int i915_sw_fence_await_reservation(struct i915_sw_fence *fence, 102 1.1 riastrad struct dma_resv *resv, 103 1.1 riastrad const struct dma_fence_ops *exclude, 104 1.1 riastrad bool write, 105 1.1 riastrad unsigned long timeout, 106 1.1 riastrad gfp_t gfp); 107 1.1 riastrad 108 1.1 riastrad void i915_sw_fence_await(struct i915_sw_fence *fence); 109 1.1 riastrad void i915_sw_fence_complete(struct i915_sw_fence *fence); 110 1.1 riastrad 111 1.1 riastrad static inline bool i915_sw_fence_signaled(const struct i915_sw_fence *fence) 112 1.1 riastrad { 113 1.1 riastrad return atomic_read(&fence->pending) <= 0; 114 1.1 riastrad } 115 1.1 riastrad 116 1.1 riastrad static inline bool i915_sw_fence_done(const struct i915_sw_fence *fence) 117 1.1 riastrad { 118 1.1 riastrad return atomic_read(&fence->pending) < 0; 119 1.1 riastrad } 120 1.1 riastrad 121 1.6 riastrad #ifdef __NetBSD__ 122 1.6 riastrad void i915_sw_fence_wait(struct i915_sw_fence *); 123 1.6 riastrad #else 124 1.1 riastrad static inline void i915_sw_fence_wait(struct i915_sw_fence *fence) 125 1.1 riastrad { 126 1.1 riastrad wait_event(fence->wait, i915_sw_fence_done(fence)); 127 1.1 riastrad } 128 1.6 riastrad #endif 129 1.1 riastrad 130 1.1 riastrad static inline void 131 1.1 riastrad i915_sw_fence_set_error_once(struct i915_sw_fence *fence, int error) 132 1.1 riastrad { 133 1.1 riastrad if (unlikely(error)) 134 1.1 riastrad cmpxchg(&fence->error, 0, error); 135 1.1 riastrad } 136 1.1 riastrad 137 1.1 riastrad #endif /* _I915_SW_FENCE_H_ */ 138