Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0-only */ 2 : /* 3 : * fence-array: aggregates fence to be waited together 4 : * 5 : * Copyright (C) 2016 Collabora Ltd 6 : * Copyright (C) 2016 Advanced Micro Devices, Inc. 7 : * Authors: 8 : * Gustavo Padovan <gustavo@padovan.org> 9 : * Christian König <christian.koenig@amd.com> 10 : */ 11 : 12 : #ifndef __LINUX_DMA_FENCE_ARRAY_H 13 : #define __LINUX_DMA_FENCE_ARRAY_H 14 : 15 : #include <linux/dma-fence.h> 16 : #include <linux/irq_work.h> 17 : 18 : /** 19 : * struct dma_fence_array_cb - callback helper for fence array 20 : * @cb: fence callback structure for signaling 21 : * @array: reference to the parent fence array object 22 : */ 23 : struct dma_fence_array_cb { 24 : struct dma_fence_cb cb; 25 : struct dma_fence_array *array; 26 : }; 27 : 28 : /** 29 : * struct dma_fence_array - fence to represent an array of fences 30 : * @base: fence base class 31 : * @lock: spinlock for fence handling 32 : * @num_fences: number of fences in the array 33 : * @num_pending: fences in the array still pending 34 : * @fences: array of the fences 35 : * @work: internal irq_work function 36 : */ 37 : struct dma_fence_array { 38 : struct dma_fence base; 39 : 40 : spinlock_t lock; 41 : unsigned num_fences; 42 : atomic_t num_pending; 43 : struct dma_fence **fences; 44 : 45 : struct irq_work work; 46 : }; 47 : 48 : /** 49 : * to_dma_fence_array - cast a fence to a dma_fence_array 50 : * @fence: fence to cast to a dma_fence_array 51 : * 52 : * Returns NULL if the fence is not a dma_fence_array, 53 : * or the dma_fence_array otherwise. 54 : */ 55 : static inline struct dma_fence_array * 56 : to_dma_fence_array(struct dma_fence *fence) 57 : { 58 0 : if (!fence || !dma_fence_is_array(fence)) 59 : return NULL; 60 : 61 : return container_of(fence, struct dma_fence_array, base); 62 : } 63 : 64 : /** 65 : * dma_fence_array_for_each - iterate over all fences in array 66 : * @fence: current fence 67 : * @index: index into the array 68 : * @head: potential dma_fence_array object 69 : * 70 : * Test if @array is a dma_fence_array object and if yes iterate over all fences 71 : * in the array. If not just iterate over the fence in @array itself. 72 : * 73 : * For a deep dive iterator see dma_fence_unwrap_for_each(). 74 : */ 75 : #define dma_fence_array_for_each(fence, index, head) \ 76 : for (index = 0, fence = dma_fence_array_first(head); fence; \ 77 : ++(index), fence = dma_fence_array_next(head, index)) 78 : 79 : struct dma_fence_array *dma_fence_array_create(int num_fences, 80 : struct dma_fence **fences, 81 : u64 context, unsigned seqno, 82 : bool signal_on_any); 83 : 84 : bool dma_fence_match_context(struct dma_fence *fence, u64 context); 85 : 86 : struct dma_fence *dma_fence_array_first(struct dma_fence *head); 87 : struct dma_fence *dma_fence_array_next(struct dma_fence *head, 88 : unsigned int index); 89 : 90 : #endif /* __LINUX_DMA_FENCE_ARRAY_H */