| /* | |
| * 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 |