diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_sw_fence.h')
-rw-r--r-- | drivers/gpu/drm/i915/i915_sw_fence.h | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_sw_fence.h b/drivers/gpu/drm/i915/i915_sw_fence.h index 9cb5c3b307a6..a7c603bc1b01 100644 --- a/drivers/gpu/drm/i915/i915_sw_fence.h +++ b/drivers/gpu/drm/i915/i915_sw_fence.h @@ -16,17 +16,8 @@ #include <linux/wait.h> struct completion; -struct reservation_object; - -struct i915_sw_fence { - wait_queue_head_t wait; - unsigned long flags; - atomic_t pending; -}; - -#define I915_SW_FENCE_CHECKED_BIT 0 /* used internally for DAG checking */ -#define I915_SW_FENCE_PRIVATE_BIT 1 /* available for use by owner */ -#define I915_SW_FENCE_MASK (~3) +struct dma_resv; +struct i915_sw_fence; enum i915_sw_fence_notify { FENCE_COMPLETE, @@ -35,7 +26,18 @@ enum i915_sw_fence_notify { typedef int (*i915_sw_fence_notify_t)(struct i915_sw_fence *, enum i915_sw_fence_notify state); -#define __i915_sw_fence_call __aligned(4) + +struct i915_sw_fence { + wait_queue_head_t wait; + i915_sw_fence_notify_t fn; +#ifdef CONFIG_DRM_I915_SW_FENCE_CHECK_DAG + unsigned long flags; +#endif + atomic_t pending; + int error; +}; + +#define I915_SW_FENCE_CHECKED_BIT 0 /* used internally for DAG checking */ void __i915_sw_fence_init(struct i915_sw_fence *fence, i915_sw_fence_notify_t fn, @@ -53,6 +55,8 @@ do { \ __i915_sw_fence_init((fence), (fn), NULL, NULL) #endif +void i915_sw_fence_reinit(struct i915_sw_fence *fence); + #ifdef CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS void i915_sw_fence_fini(struct i915_sw_fence *fence); #else @@ -82,13 +86,13 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence, gfp_t gfp); int i915_sw_fence_await_reservation(struct i915_sw_fence *fence, - struct reservation_object *resv, + struct dma_resv *resv, const struct dma_fence_ops *exclude, bool write, unsigned long timeout, gfp_t gfp); -void i915_sw_fence_await(struct i915_sw_fence *fence); +bool i915_sw_fence_await(struct i915_sw_fence *fence); void i915_sw_fence_complete(struct i915_sw_fence *fence); static inline bool i915_sw_fence_signaled(const struct i915_sw_fence *fence) @@ -106,4 +110,11 @@ static inline void i915_sw_fence_wait(struct i915_sw_fence *fence) wait_event(fence->wait, i915_sw_fence_done(fence)); } +static inline void +i915_sw_fence_set_error_once(struct i915_sw_fence *fence, int error) +{ + if (unlikely(error)) + cmpxchg(&fence->error, 0, error); +} + #endif /* _I915_SW_FENCE_H_ */ |