1 // SPDX-License-Identifier: MIT
4 * Copyright © 2019 Intel Corporation
7 #include "i915_sw_fence_work.h"
9 static void fence_complete(struct dma_fence_work
*f
)
13 dma_fence_signal(&f
->dma
);
16 static void fence_work(struct work_struct
*work
)
18 struct dma_fence_work
*f
= container_of(work
, typeof(*f
), work
);
21 err
= f
->ops
->work(f
);
23 dma_fence_set_error(&f
->dma
, err
);
26 dma_fence_put(&f
->dma
);
29 static int __i915_sw_fence_call
30 fence_notify(struct i915_sw_fence
*fence
, enum i915_sw_fence_notify state
)
32 struct dma_fence_work
*f
= container_of(fence
, typeof(*f
), chain
);
37 dma_fence_set_error(&f
->dma
, fence
->error
);
40 dma_fence_get(&f
->dma
);
41 if (test_bit(DMA_FENCE_WORK_IMM
, &f
->dma
.flags
))
44 queue_work(system_unbound_wq
, &f
->work
);
51 dma_fence_put(&f
->dma
);
58 static const char *get_driver_name(struct dma_fence
*fence
)
63 static const char *get_timeline_name(struct dma_fence
*fence
)
65 struct dma_fence_work
*f
= container_of(fence
, typeof(*f
), dma
);
67 return f
->ops
->name
?: "work";
70 static void fence_release(struct dma_fence
*fence
)
72 struct dma_fence_work
*f
= container_of(fence
, typeof(*f
), dma
);
74 i915_sw_fence_fini(&f
->chain
);
76 BUILD_BUG_ON(offsetof(typeof(*f
), dma
));
77 dma_fence_free(&f
->dma
);
80 static const struct dma_fence_ops fence_ops
= {
81 .get_driver_name
= get_driver_name
,
82 .get_timeline_name
= get_timeline_name
,
83 .release
= fence_release
,
86 void dma_fence_work_init(struct dma_fence_work
*f
,
87 const struct dma_fence_work_ops
*ops
)
90 spin_lock_init(&f
->lock
);
91 dma_fence_init(&f
->dma
, &fence_ops
, &f
->lock
, 0, 0);
92 i915_sw_fence_init(&f
->chain
, fence_notify
);
93 INIT_WORK(&f
->work
, fence_work
);
96 int dma_fence_work_chain(struct dma_fence_work
*f
, struct dma_fence
*signal
)
101 return __i915_sw_fence_await_dma_fence(&f
->chain
, signal
, &f
->cb
);