You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.2 KiB
89 lines
2.2 KiB
/* |
|
* 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 |
|
|
|
#include <linux/bug.h> |
|
#include <linux/dmaengine.h> |
|
|
|
/** |
|
* 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; |
|
} |
|
|
|
/** |
|
* 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; |
|
} |
|
|
|
/** |
|
* 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; |
|
} |
|
|
|
/** |
|
* 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; |
|
} |
|
|
|
#endif
|
|
|