0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _I915_SW_FENCE_H_
0010 #define _I915_SW_FENCE_H_
0011
0012 #include <linux/dma-fence.h>
0013 #include <linux/gfp.h>
0014 #include <linux/kref.h>
0015 #include <linux/notifier.h> /* for NOTIFY_DONE */
0016 #include <linux/wait.h>
0017
0018 struct completion;
0019 struct dma_resv;
0020 struct i915_sw_fence;
0021
0022 enum i915_sw_fence_notify {
0023 FENCE_COMPLETE,
0024 FENCE_FREE
0025 };
0026
0027 typedef int (*i915_sw_fence_notify_t)(struct i915_sw_fence *,
0028 enum i915_sw_fence_notify state);
0029
0030 struct i915_sw_fence {
0031 wait_queue_head_t wait;
0032 i915_sw_fence_notify_t fn;
0033 #ifdef CONFIG_DRM_I915_SW_FENCE_CHECK_DAG
0034 unsigned long flags;
0035 #endif
0036 atomic_t pending;
0037 int error;
0038 };
0039
0040 #define I915_SW_FENCE_CHECKED_BIT 0
0041
0042 void __i915_sw_fence_init(struct i915_sw_fence *fence,
0043 i915_sw_fence_notify_t fn,
0044 const char *name,
0045 struct lock_class_key *key);
0046 #ifdef CONFIG_LOCKDEP
0047 #define i915_sw_fence_init(fence, fn) \
0048 do { \
0049 static struct lock_class_key __key; \
0050 \
0051 __i915_sw_fence_init((fence), (fn), #fence, &__key); \
0052 } while (0)
0053 #else
0054 #define i915_sw_fence_init(fence, fn) \
0055 __i915_sw_fence_init((fence), (fn), NULL, NULL)
0056 #endif
0057
0058 void i915_sw_fence_reinit(struct i915_sw_fence *fence);
0059
0060 #ifdef CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS
0061 void i915_sw_fence_fini(struct i915_sw_fence *fence);
0062 #else
0063 static inline void i915_sw_fence_fini(struct i915_sw_fence *fence) {}
0064 #endif
0065
0066 void i915_sw_fence_commit(struct i915_sw_fence *fence);
0067
0068 int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
0069 struct i915_sw_fence *after,
0070 wait_queue_entry_t *wq);
0071 int i915_sw_fence_await_sw_fence_gfp(struct i915_sw_fence *fence,
0072 struct i915_sw_fence *after,
0073 gfp_t gfp);
0074
0075 struct i915_sw_dma_fence_cb {
0076 struct dma_fence_cb base;
0077 struct i915_sw_fence *fence;
0078 };
0079
0080 int __i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
0081 struct dma_fence *dma,
0082 struct i915_sw_dma_fence_cb *cb);
0083 int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
0084 struct dma_fence *dma,
0085 unsigned long timeout,
0086 gfp_t gfp);
0087
0088 int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
0089 struct dma_resv *resv,
0090 const struct dma_fence_ops *exclude,
0091 bool write,
0092 unsigned long timeout,
0093 gfp_t gfp);
0094
0095 bool i915_sw_fence_await(struct i915_sw_fence *fence);
0096 void i915_sw_fence_complete(struct i915_sw_fence *fence);
0097
0098 static inline bool i915_sw_fence_signaled(const struct i915_sw_fence *fence)
0099 {
0100 return atomic_read(&fence->pending) <= 0;
0101 }
0102
0103 static inline bool i915_sw_fence_done(const struct i915_sw_fence *fence)
0104 {
0105 return atomic_read(&fence->pending) < 0;
0106 }
0107
0108 static inline void i915_sw_fence_wait(struct i915_sw_fence *fence)
0109 {
0110 wait_event(fence->wait, i915_sw_fence_done(fence));
0111 }
0112
0113 static inline void
0114 i915_sw_fence_set_error_once(struct i915_sw_fence *fence, int error)
0115 {
0116 if (unlikely(error))
0117 cmpxchg(&fence->error, 0, error);
0118 }
0119
0120 #endif