17f4dd379Sjsg /* Public domain. */
27f4dd379Sjsg
37f4dd379Sjsg #ifndef _LINUX_DMA_FENCE_ARRAY_H
47f4dd379Sjsg #define _LINUX_DMA_FENCE_ARRAY_H
57f4dd379Sjsg
67f4dd379Sjsg #include <linux/dma-fence.h>
795f00a37Sjsg #include <linux/irq_work.h>
87f4dd379Sjsg
995f00a37Sjsg struct dma_fence_array_cb {
1095f00a37Sjsg struct dma_fence_cb cb;
1195f00a37Sjsg struct dma_fence_array *array;
1295f00a37Sjsg };
137f4dd379Sjsg
147f4dd379Sjsg struct dma_fence_array {
157f4dd379Sjsg struct dma_fence base;
167f4dd379Sjsg unsigned int num_fences;
177f4dd379Sjsg struct dma_fence **fences;
1895f00a37Sjsg struct mutex lock;
195ca02815Sjsg struct timeout to;
2095f00a37Sjsg int num_pending;
217f4dd379Sjsg };
227f4dd379Sjsg
2395f00a37Sjsg extern const struct dma_fence_ops dma_fence_array_ops;
2495f00a37Sjsg
257f4dd379Sjsg static inline struct dma_fence_array *
to_dma_fence_array(struct dma_fence * fence)267f4dd379Sjsg to_dma_fence_array(struct dma_fence *fence)
277f4dd379Sjsg {
2895f00a37Sjsg if (fence->ops != &dma_fence_array_ops)
297f4dd379Sjsg return NULL;
3095f00a37Sjsg
3195f00a37Sjsg return container_of(fence, struct dma_fence_array, base);
327f4dd379Sjsg }
337f4dd379Sjsg
347f4dd379Sjsg static inline bool
dma_fence_is_array(struct dma_fence * fence)357f4dd379Sjsg dma_fence_is_array(struct dma_fence *fence)
367f4dd379Sjsg {
3795f00a37Sjsg return fence->ops == &dma_fence_array_ops;
387f4dd379Sjsg }
397f4dd379Sjsg
4095f00a37Sjsg struct dma_fence_array *dma_fence_array_create(int, struct dma_fence **,
4195f00a37Sjsg u64, unsigned, bool);
42*1bb76ff1Sjsg struct dma_fence *dma_fence_array_first(struct dma_fence *);
43*1bb76ff1Sjsg struct dma_fence *dma_fence_array_next(struct dma_fence *, unsigned int);
44*1bb76ff1Sjsg
45*1bb76ff1Sjsg #define dma_fence_array_for_each(f, i, h) \
46*1bb76ff1Sjsg for (i = 0, f = dma_fence_array_first(h); \
47*1bb76ff1Sjsg f != NULL; \
48*1bb76ff1Sjsg ++(i), f = dma_fence_array_next(h, i)) \
497f4dd379Sjsg
507f4dd379Sjsg #endif
51