1 1.10 riastrad /* $NetBSD: dma-resv.h,v 1.10 2021/12/19 12:21:30 riastradh Exp $ */ 2 1.5 riastrad 3 1.5 riastrad /*- 4 1.5 riastrad * Copyright (c) 2018 The NetBSD Foundation, Inc. 5 1.5 riastrad * All rights reserved. 6 1.5 riastrad * 7 1.5 riastrad * This code is derived from software contributed to The NetBSD Foundation 8 1.5 riastrad * by Taylor R. Campbell. 9 1.5 riastrad * 10 1.5 riastrad * Redistribution and use in source and binary forms, with or without 11 1.5 riastrad * modification, are permitted provided that the following conditions 12 1.5 riastrad * are met: 13 1.5 riastrad * 1. Redistributions of source code must retain the above copyright 14 1.5 riastrad * notice, this list of conditions and the following disclaimer. 15 1.5 riastrad * 2. Redistributions in binary form must reproduce the above copyright 16 1.5 riastrad * notice, this list of conditions and the following disclaimer in the 17 1.5 riastrad * documentation and/or other materials provided with the distribution. 18 1.5 riastrad * 19 1.5 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.5 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.5 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.5 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.5 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.5 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.5 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.5 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.5 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.5 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.5 riastrad * POSSIBILITY OF SUCH DAMAGE. 30 1.2 riastrad */ 31 1.2 riastrad 32 1.5 riastrad #ifndef _LINUX_DMA_RESV_H_ 33 1.5 riastrad #define _LINUX_DMA_RESV_H_ 34 1.5 riastrad 35 1.2 riastrad #include <linux/dma-fence.h> 36 1.5 riastrad #include <linux/rcupdate.h> 37 1.3 riastrad #include <linux/seqlock.h> 38 1.5 riastrad #include <linux/ww_mutex.h> 39 1.3 riastrad 40 1.3 riastrad struct dma_resv { 41 1.5 riastrad struct ww_mutex lock; 42 1.5 riastrad struct seqcount seq; 43 1.5 riastrad struct dma_fence __rcu *fence_excl; 44 1.5 riastrad struct dma_resv_list __rcu *fence; 45 1.3 riastrad 46 1.5 riastrad struct dma_resv_list __rcu *robj_prealloc; 47 1.3 riastrad }; 48 1.3 riastrad 49 1.5 riastrad struct dma_resv_list { 50 1.5 riastrad struct rcu_head rol_rcu; 51 1.3 riastrad 52 1.5 riastrad uint32_t shared_count; 53 1.5 riastrad uint32_t shared_max; 54 1.5 riastrad struct dma_fence __rcu *shared[]; 55 1.5 riastrad }; 56 1.3 riastrad 57 1.5 riastrad /* NetBSD addition */ 58 1.5 riastrad struct dma_resv_poll { 59 1.5 riastrad kmutex_t rp_lock; 60 1.5 riastrad struct selinfo rp_selq; 61 1.5 riastrad struct dma_fence_cb rp_fcb; 62 1.5 riastrad bool rp_claimed; 63 1.5 riastrad }; 64 1.3 riastrad 65 1.5 riastrad #define dma_resv_add_excl_fence linux_dma_resv_add_excl_fence 66 1.5 riastrad #define dma_resv_add_shared_fence linux_dma_resv_add_shared_fence 67 1.5 riastrad #define dma_resv_assert_held linux_dma_resv_assert_held 68 1.5 riastrad #define dma_resv_copy_fences linux_dma_resv_copy_fences 69 1.5 riastrad #define dma_resv_do_poll linux_dma_resv_do_poll 70 1.5 riastrad #define dma_resv_fini linux_dma_resv_fini 71 1.5 riastrad #define dma_resv_get_excl linux_dma_resv_get_excl 72 1.5 riastrad #define dma_resv_get_excl_rcu linux_dma_resv_get_excl_rcu 73 1.5 riastrad #define dma_resv_get_fences_rcu linux_dma_resv_get_fences_rcu 74 1.5 riastrad #define dma_resv_get_list linux_dma_resv_get_list 75 1.5 riastrad #define dma_resv_held linux_dma_resv_held 76 1.5 riastrad #define dma_resv_init linux_dma_resv_init 77 1.10 riastrad #define dma_resv_is_locked linux_dma_resv_is_locked 78 1.5 riastrad #define dma_resv_kqfilter linux_dma_resv_kqfilter 79 1.5 riastrad #define dma_resv_lock linux_dma_resv_lock 80 1.5 riastrad #define dma_resv_lock_interruptible linux_dma_resv_lock_interruptible 81 1.6 riastrad #define dma_resv_lock_slow linux_dma_resv_lock_slow 82 1.6 riastrad #define dma_resv_lock_slow_interruptible linux_dma_resv_lock_slow_interruptible 83 1.9 riastrad #define dma_resv_locking_ctx linux_dma_resv_locking_ctx 84 1.5 riastrad #define dma_resv_reserve_shared linux_dma_resv_reserve_shared 85 1.5 riastrad #define dma_resv_test_signaled_rcu linux_dma_resv_test_signaled_rcu 86 1.5 riastrad #define dma_resv_trylock linux_dma_resv_trylock 87 1.5 riastrad #define dma_resv_unlock linux_dma_resv_unlock 88 1.5 riastrad #define dma_resv_wait_timeout_rcu linux_dma_resv_wait_timeout_rcu 89 1.5 riastrad #define dma_resv_poll_fini linux_dma_resv_poll_fini 90 1.5 riastrad #define dma_resv_poll_init linux_dma_resv_poll_init 91 1.5 riastrad #define reservation_ww_class linux_reservation_ww_class 92 1.5 riastrad 93 1.5 riastrad extern struct ww_class reservation_ww_class; 94 1.5 riastrad 95 1.5 riastrad void dma_resv_init(struct dma_resv *); 96 1.5 riastrad void dma_resv_fini(struct dma_resv *); 97 1.5 riastrad int dma_resv_lock(struct dma_resv *, 98 1.5 riastrad struct ww_acquire_ctx *); 99 1.6 riastrad void dma_resv_lock_slow(struct dma_resv *, 100 1.6 riastrad struct ww_acquire_ctx *); 101 1.5 riastrad int dma_resv_lock_interruptible(struct dma_resv *, 102 1.5 riastrad struct ww_acquire_ctx *); 103 1.6 riastrad int dma_resv_lock_slow_interruptible(struct dma_resv *, 104 1.6 riastrad struct ww_acquire_ctx *); 105 1.5 riastrad bool dma_resv_trylock(struct dma_resv *) __must_check; 106 1.9 riastrad struct ww_acquire_ctx * 107 1.9 riastrad dma_resv_locking_ctx(struct dma_resv *); 108 1.5 riastrad void dma_resv_unlock(struct dma_resv *); 109 1.10 riastrad bool dma_resv_is_locked(struct dma_resv *); 110 1.5 riastrad bool dma_resv_held(struct dma_resv *); 111 1.5 riastrad void dma_resv_assert_held(struct dma_resv *); 112 1.5 riastrad struct dma_fence * 113 1.5 riastrad dma_resv_get_excl(struct dma_resv *); 114 1.5 riastrad struct dma_resv_list * 115 1.5 riastrad dma_resv_get_list(struct dma_resv *); 116 1.7 riastrad int dma_resv_reserve_shared(struct dma_resv *, unsigned int); 117 1.5 riastrad void dma_resv_add_excl_fence(struct dma_resv *, 118 1.5 riastrad struct dma_fence *); 119 1.5 riastrad void dma_resv_add_shared_fence(struct dma_resv *, 120 1.5 riastrad struct dma_fence *); 121 1.5 riastrad 122 1.5 riastrad struct dma_fence * 123 1.5 riastrad dma_resv_get_excl_rcu(const struct dma_resv *); 124 1.5 riastrad int dma_resv_get_fences_rcu(const struct dma_resv *, 125 1.5 riastrad struct dma_fence **, unsigned *, struct dma_fence ***); 126 1.5 riastrad 127 1.5 riastrad int dma_resv_copy_fences(struct dma_resv *, 128 1.5 riastrad const struct dma_resv *); 129 1.5 riastrad 130 1.5 riastrad bool dma_resv_test_signaled_rcu(const struct dma_resv *, 131 1.5 riastrad bool); 132 1.5 riastrad long dma_resv_wait_timeout_rcu(const struct dma_resv *, 133 1.5 riastrad bool, bool, unsigned long); 134 1.5 riastrad 135 1.5 riastrad /* NetBSD additions */ 136 1.5 riastrad void dma_resv_poll_init(struct dma_resv_poll *); 137 1.5 riastrad void dma_resv_poll_fini(struct dma_resv_poll *); 138 1.5 riastrad int dma_resv_do_poll(const struct dma_resv *, int, 139 1.5 riastrad struct dma_resv_poll *); 140 1.5 riastrad int dma_resv_kqfilter(const struct dma_resv *, 141 1.5 riastrad struct knote *, struct dma_resv_poll *); 142 1.3 riastrad 143 1.5 riastrad static inline bool 144 1.5 riastrad dma_resv_has_excl_fence(const struct dma_resv *robj) 145 1.3 riastrad { 146 1.5 riastrad return robj->fence_excl != NULL; 147 1.3 riastrad } 148 1.3 riastrad 149 1.5 riastrad #endif /* _LINUX_DMA_RESV_H_ */ 150