Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * SPDX-License-Identifier: MIT
0003  *
0004  * i915_sw_fence.h - library routines for N:M synchronisation points
0005  *
0006  * Copyright (C) 2016 Intel Corporation
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 /* used internally for DAG checking */
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 /* _I915_SW_FENCE_H_ */