1 /* $NetBSD: dma-fence-chain.h,v 1.4 2021/12/19 12:39:32 riastradh Exp $ */ 2 3 /*- 4 * Copyright (c) 2020 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef _LINUX_DMA_FENCE_CHAIN_H_ 30 #define _LINUX_DMA_FENCE_CHAIN_H_ 31 32 #include <sys/types.h> 33 34 #include <linux/dma-fence.h> 35 #include <linux/irq_work.h> 36 37 struct dma_fence_chain { 38 /* Linux API */ 39 struct dma_fence base; 40 uint64_t prev_seqno; 41 42 spinlock_t dfc_lock; 43 struct dma_fence *volatile dfc_prev; 44 struct dma_fence *dfc_fence; 45 struct dma_fence_cb dfc_callback; 46 struct irq_work dfc_irq_work; 47 }; 48 49 #define dma_fence_chain_find_seqno linux_dma_fence_chain_find_seqno 50 #define dma_fence_chain_init linux_dma_fence_chain_init 51 #define dma_fence_chain_walk linux_dma_fence_chain_walk 52 #define to_dma_fence_chain linux_to_dma_fence_chain 53 54 void dma_fence_chain_init(struct dma_fence_chain *, struct dma_fence *, 55 struct dma_fence *, uint64_t); 56 int dma_fence_chain_find_seqno(struct dma_fence **, uint64_t); 57 struct dma_fence_chain * 58 to_dma_fence_chain(struct dma_fence *); 59 struct dma_fence * 60 dma_fence_chain_walk(struct dma_fence *); 61 62 #define dma_fence_chain_for_each(VAR, FENCE) \ 63 for ((VAR) = dma_fence_get(FENCE); \ 64 (VAR) != NULL; \ 65 (VAR) = dma_fence_chain_walk(VAR)) 66 67 #endif /* _LINUX_DMA_FENCE_CHAIN_H_ */ 68