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