Blame view
drivers/dma/dmaengine.h
4.58 KB
b24413180 License cleanup: ... |
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
d2ebfb335 dmaengine: add pr... |
2 3 4 5 6 7 |
/* * The contents of this file are private to DMA engine drivers, and is not * part of the API to be used by DMA engine users. */ #ifndef DMAENGINE_H #define DMAENGINE_H |
f7fbce07c dmaengine: provid... |
8 |
#include <linux/bug.h> |
d2ebfb335 dmaengine: add pr... |
9 |
#include <linux/dmaengine.h> |
884485e1f dmaengine: consol... |
10 |
/** |
d3ee98cdc dmaengine: consol... |
11 12 13 14 15 16 17 18 19 20 |
* dma_cookie_init - initialize the cookies for a DMA channel * @chan: dma channel to initialize */ static inline void dma_cookie_init(struct dma_chan *chan) { chan->cookie = DMA_MIN_COOKIE; chan->completed_cookie = DMA_MIN_COOKIE; } /** |
884485e1f dmaengine: consol... |
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
* dma_cookie_assign - assign a DMA engine cookie to the descriptor * @tx: descriptor needing cookie * * Assign a unique non-zero per-channel cookie to the descriptor. * Note: caller is expected to hold a lock to prevent concurrency. */ static inline dma_cookie_t dma_cookie_assign(struct dma_async_tx_descriptor *tx) { struct dma_chan *chan = tx->chan; dma_cookie_t cookie; cookie = chan->cookie + 1; if (cookie < DMA_MIN_COOKIE) cookie = DMA_MIN_COOKIE; tx->cookie = chan->cookie = cookie; return cookie; } |
f7fbce07c dmaengine: provid... |
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/** * dma_cookie_complete - complete a descriptor * @tx: descriptor to complete * * Mark this descriptor complete by updating the channels completed * cookie marker. Zero the descriptors cookie to prevent accidental * repeated completions. * * Note: caller is expected to hold a lock to prevent concurrency. */ static inline void dma_cookie_complete(struct dma_async_tx_descriptor *tx) { BUG_ON(tx->cookie < DMA_MIN_COOKIE); tx->chan->completed_cookie = tx->cookie; tx->cookie = 0; } |
96a2af41c dmaengine: consol... |
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
/** * dma_cookie_status - report cookie status * @chan: dma channel * @cookie: cookie we are interested in * @state: dma_tx_state structure to return last/used cookies * * Report the status of the cookie, filling in the state structure if * non-NULL. No locking is required. */ static inline enum dma_status dma_cookie_status(struct dma_chan *chan, dma_cookie_t cookie, struct dma_tx_state *state) { dma_cookie_t used, complete; used = chan->cookie; complete = chan->completed_cookie; barrier(); if (state) { state->last = complete; state->used = used; state->residue = 0; } return dma_async_is_complete(cookie, complete, used); } static inline void dma_set_residue(struct dma_tx_state *state, u32 residue) { if (state) state->residue = residue; } |
f083f5571 dmaengine: Add he... |
85 86 |
struct dmaengine_desc_callback { dma_async_tx_callback callback; |
f067025bc dmaengine: add su... |
87 |
dma_async_tx_callback_result callback_result; |
f083f5571 dmaengine: Add he... |
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
void *callback_param; }; /** * dmaengine_desc_get_callback - get the passed in callback function * @tx: tx descriptor * @cb: temp struct to hold the callback info * * Fill the passed in cb struct with what's available in the passed in * tx descriptor struct * No locking is required. */ static inline void dmaengine_desc_get_callback(struct dma_async_tx_descriptor *tx, struct dmaengine_desc_callback *cb) { cb->callback = tx->callback; |
f067025bc dmaengine: add su... |
105 |
cb->callback_result = tx->callback_result; |
f083f5571 dmaengine: Add he... |
106 107 108 109 110 111 |
cb->callback_param = tx->callback_param; } /** * dmaengine_desc_callback_invoke - call the callback function in cb struct * @cb: temp struct that is holding the callback info |
f067025bc dmaengine: add su... |
112 |
* @result: transaction result |
f083f5571 dmaengine: Add he... |
113 114 115 116 117 118 119 |
* * Call the callback function provided in the cb struct with the parameter * in the cb struct. * Locking is dependent on the driver. */ static inline void dmaengine_desc_callback_invoke(struct dmaengine_desc_callback *cb, |
f067025bc dmaengine: add su... |
120 |
const struct dmaengine_result *result) |
f083f5571 dmaengine: Add he... |
121 |
{ |
f067025bc dmaengine: add su... |
122 123 124 125 126 127 128 129 130 131 |
struct dmaengine_result dummy_result = { .result = DMA_TRANS_NOERROR, .residue = 0 }; if (cb->callback_result) { if (!result) result = &dummy_result; cb->callback_result(cb->callback_param, result); } else if (cb->callback) { |
f083f5571 dmaengine: Add he... |
132 |
cb->callback(cb->callback_param); |
f067025bc dmaengine: add su... |
133 |
} |
f083f5571 dmaengine: Add he... |
134 135 136 137 138 139 |
} /** * dmaengine_desc_get_callback_invoke - get the callback in tx descriptor and * then immediately call the callback. * @tx: dma async tx descriptor |
f067025bc dmaengine: add su... |
140 |
* @result: transaction result |
f083f5571 dmaengine: Add he... |
141 142 143 144 145 146 147 |
* * Call dmaengine_desc_get_callback() and dmaengine_desc_callback_invoke() * in a single function since no work is necessary in between for the driver. * Locking is dependent on the driver. */ static inline void dmaengine_desc_get_callback_invoke(struct dma_async_tx_descriptor *tx, |
f067025bc dmaengine: add su... |
148 |
const struct dmaengine_result *result) |
f083f5571 dmaengine: Add he... |
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
{ struct dmaengine_desc_callback cb; dmaengine_desc_get_callback(tx, &cb); dmaengine_desc_callback_invoke(&cb, result); } /** * dmaengine_desc_callback_valid - verify the callback is valid in cb * @cb: callback info struct * * Return a bool that verifies whether callback in cb is valid or not. * No locking is required. */ static inline bool dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb) { return (cb->callback) ? true : false; } |
d2ebfb335 dmaengine: add pr... |
168 |
#endif |