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