1 /* Public domain. */
2 
3 #ifndef _LINUX_DMA_FENCE_ARRAY_H
4 #define _LINUX_DMA_FENCE_ARRAY_H
5 
6 #include <linux/dma-fence.h>
7 #include <linux/irq_work.h>
8 
9 struct dma_fence_array_cb {
10 	struct dma_fence_cb cb;
11 	struct dma_fence_array *array;
12 };
13 
14 struct dma_fence_array {
15 	struct dma_fence base;
16 	unsigned int num_fences;
17 	struct dma_fence **fences;
18 	struct mutex lock;
19 	struct timeout to;
20 	int num_pending;
21 };
22 
23 extern const struct dma_fence_ops dma_fence_array_ops;
24 
25 static inline struct dma_fence_array *
26 to_dma_fence_array(struct dma_fence *fence)
27 {
28 	if (fence->ops != &dma_fence_array_ops)
29 		return NULL;
30 
31 	return container_of(fence, struct dma_fence_array, base);
32 }
33 
34 static inline bool
35 dma_fence_is_array(struct dma_fence *fence)
36 {
37 	return fence->ops == &dma_fence_array_ops;
38 }
39 
40 struct dma_fence_array *dma_fence_array_create(int, struct dma_fence **,
41     u64, unsigned, bool);
42 struct dma_fence *dma_fence_array_first(struct dma_fence *);
43 struct dma_fence *dma_fence_array_next(struct dma_fence *, unsigned int);
44 
45 #define dma_fence_array_for_each(f, i, h)		\
46 	for (i = 0, f = dma_fence_array_first(h);	\
47 	     f != NULL;					\
48 	     ++(i), f = dma_fence_array_next(h, i))	\
49 
50 #endif
51