1 /* SPDX-License-Identifier: MIT */
2 
3 /*
4  * Copyright © 2019 Intel Corporation
5  */
6 
7 #ifndef I915_SW_FENCE_WORK_H
8 #define I915_SW_FENCE_WORK_H
9 
10 #include <linux/dma-fence.h>
11 #include <linux/spinlock.h>
12 #include <linux/workqueue.h>
13 
14 #include "i915_sw_fence.h"
15 
16 struct dma_fence_work;
17 
18 struct dma_fence_work_ops {
19 	const char *name;
20 	int (*work)(struct dma_fence_work *f);
21 	void (*release)(struct dma_fence_work *f);
22 };
23 
24 struct dma_fence_work {
25 	struct dma_fence dma;
26 	spinlock_t lock;
27 
28 	struct i915_sw_fence chain;
29 	struct i915_sw_dma_fence_cb cb;
30 
31 	struct work_struct work;
32 	const struct dma_fence_work_ops *ops;
33 };
34 
35 void dma_fence_work_init(struct dma_fence_work *f,
36 			 const struct dma_fence_work_ops *ops);
37 int dma_fence_work_chain(struct dma_fence_work *f, struct dma_fence *signal);
38 
39 static inline void dma_fence_work_commit(struct dma_fence_work *f)
40 {
41 	i915_sw_fence_commit(&f->chain);
42 }
43 
44 #endif /* I915_SW_FENCE_WORK_H */
45