1 /* Public domain. */
2 
3 #ifndef _LINUX_DMA_FENCE_CHAIN_H
4 #define _LINUX_DMA_FENCE_CHAIN_H
5 
6 #include <linux/dma-fence.h>
7 
8 struct dma_fence_chain {
9 	struct dma_fence base;
10 	struct dma_fence *fence;
11 	struct dma_fence *prev;
12 	uint64_t prev_seqno;
13 	struct mutex lock;
14 	union {
15 		struct timeout to;
16 		struct dma_fence_cb cb;
17 	};
18 };
19 
20 int dma_fence_chain_find_seqno(struct dma_fence **, uint64_t);
21 void dma_fence_chain_init(struct dma_fence_chain *, struct dma_fence *,
22     struct dma_fence *, uint64_t);
23 
24 extern const struct dma_fence_ops dma_fence_chain_ops;
25 
26 static inline struct dma_fence_chain *
to_dma_fence_chain(struct dma_fence * fence)27 to_dma_fence_chain(struct dma_fence *fence)
28 {
29 	if ((fence == NULL) || (fence->ops != &dma_fence_chain_ops))
30 		return NULL;
31 
32 	return container_of(fence, struct dma_fence_chain, base);
33 }
34 
35 struct dma_fence *dma_fence_chain_walk(struct dma_fence *);
36 
37 #define dma_fence_chain_for_each(f, h) \
38 	for (f = dma_fence_get(h); f != NULL; f = dma_fence_chain_walk(f))
39 
40 static inline struct dma_fence_chain *
dma_fence_chain_alloc(void)41 dma_fence_chain_alloc(void)
42 {
43 	return malloc(sizeof(struct dma_fence_chain), M_DRM,
44 	    M_WAITOK | M_CANFAIL);
45 }
46 
47 static inline void
dma_fence_chain_free(struct dma_fence_chain * dfc)48 dma_fence_chain_free(struct dma_fence_chain *dfc)
49 {
50 	free(dfc, M_DRM, sizeof(struct dma_fence_chain));
51 }
52 
53 static inline struct dma_fence *
dma_fence_chain_contained(struct dma_fence * f)54 dma_fence_chain_contained(struct dma_fence *f)
55 {
56 	struct dma_fence_chain *dfc = to_dma_fence_chain(f);
57 
58 	if (dfc != NULL)
59 		return dfc->fence;
60 	return f;
61 }
62 
63 #endif
64