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 *
to_dma_fence_array(struct dma_fence * fence)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
dma_fence_is_array(struct dma_fence * fence)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