89 lines · 2.2 KB · C
RawDownload
/* * 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