Lines Matching refs:chain
50 dma_fence_chain_init(struct dma_fence_chain *chain, struct dma_fence *prev, in dma_fence_chain_init() argument
56 spin_lock_init(&chain->dfc_lock); in dma_fence_chain_init()
57 chain->dfc_prev = prev; /* consume caller's reference */ in dma_fence_chain_init()
58 chain->dfc_fence = fence; /* consume caller's reference */ in dma_fence_chain_init()
59 init_irq_work(&chain->dfc_irq_work, &dma_fence_chain_irq_work); in dma_fence_chain_init()
66 chain->prev_seqno = 0; in dma_fence_chain_init()
69 chain->prev_seqno = prev->seqno; in dma_fence_chain_init()
72 dma_fence_init(&chain->base, &dma_fence_chain_ops, &chain->dfc_lock, in dma_fence_chain_init()
93 struct dma_fence_chain *chain = container_of(work, in dma_fence_chain_irq_work() local
96 if (!dma_fence_chain_enable_signaling(&chain->base)) in dma_fence_chain_irq_work()
97 dma_fence_signal(&chain->base); in dma_fence_chain_irq_work()
98 dma_fence_put(&chain->base); in dma_fence_chain_irq_work()
104 struct dma_fence_chain *chain = container_of(cb, in dma_fence_chain_callback() local
107 irq_work_queue(&chain->dfc_irq_work); in dma_fence_chain_callback()
114 struct dma_fence_chain *chain = to_dma_fence_chain(fence); in dma_fence_chain_enable_signaling() local
118 KASSERT(chain); in dma_fence_chain_enable_signaling()
120 dma_fence_get(&chain->base); in dma_fence_chain_enable_signaling()
121 dma_fence_chain_for_each(f, &chain->base) { in dma_fence_chain_enable_signaling()
125 if (dma_fence_add_callback(f, &chain->dfc_callback, in dma_fence_chain_enable_signaling()
132 dma_fence_put(&chain->base); in dma_fence_chain_enable_signaling()
158 struct dma_fence_chain *chain = to_dma_fence_chain(fence); in dma_fence_chain_release() local
162 KASSERT(chain); in dma_fence_chain_release()
168 while ((prev = chain->dfc_prev) != NULL) { in dma_fence_chain_release()
184 chain->dfc_prev = prev_chain->dfc_prev; in dma_fence_chain_release()
190 dma_fence_put(chain->dfc_fence); in dma_fence_chain_release()
191 spin_lock_destroy(&chain->dfc_lock); in dma_fence_chain_release()
192 dma_fence_free(&chain->base); in dma_fence_chain_release()
226 get_prev(struct dma_fence_chain *chain) in get_prev() argument
231 prev = dma_fence_get_rcu_safe(&chain->dfc_prev); in get_prev()
247 struct dma_fence_chain *chain, *prev_chain; in dma_fence_chain_walk() local
250 if ((chain = to_dma_fence_chain(fence)) == NULL) { in dma_fence_chain_walk()
255 while ((prev = get_prev(chain)) != NULL) { in dma_fence_chain_walk()
266 if (atomic_cas_ptr(&chain->dfc_prev, prev, splice) == prev) in dma_fence_chain_walk()
291 struct dma_fence_chain *chain; in dma_fence_chain_find_seqno() local
296 chain = to_dma_fence_chain(*fencep); in dma_fence_chain_find_seqno()
297 if (chain == NULL || chain->base.seqno < seqno) in dma_fence_chain_find_seqno()
300 dma_fence_chain_for_each(*fencep, &chain->base) { in dma_fence_chain_find_seqno()
301 if ((*fencep)->context != chain->base.context || in dma_fence_chain_find_seqno()
307 dma_fence_put(&chain->base); in dma_fence_chain_find_seqno()