dmaengine.h revision 96a2af41c78b1fbb1f567a3486bdc63f7b31c5fd
1d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux/* 2d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux * The contents of this file are private to DMA engine drivers, and is not 3d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux * part of the API to be used by DMA engine users. 4d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux */ 5d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux#ifndef DMAENGINE_H 6d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux#define DMAENGINE_H 7d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux 8f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux#include <linux/bug.h> 9d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux#include <linux/dmaengine.h> 10d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux 11884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux/** 12884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * dma_cookie_assign - assign a DMA engine cookie to the descriptor 13884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * @tx: descriptor needing cookie 14884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * 15884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * Assign a unique non-zero per-channel cookie to the descriptor. 16884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * Note: caller is expected to hold a lock to prevent concurrency. 17884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux */ 18884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linuxstatic inline dma_cookie_t dma_cookie_assign(struct dma_async_tx_descriptor *tx) 19884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux{ 20884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux struct dma_chan *chan = tx->chan; 21884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux dma_cookie_t cookie; 22884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux 23884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux cookie = chan->cookie + 1; 24884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux if (cookie < DMA_MIN_COOKIE) 25884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux cookie = DMA_MIN_COOKIE; 26884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux tx->cookie = chan->cookie = cookie; 27884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux 28884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux return cookie; 29884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux} 30884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux 31f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux/** 32f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * dma_cookie_complete - complete a descriptor 33f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * @tx: descriptor to complete 34f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * 35f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * Mark this descriptor complete by updating the channels completed 36f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * cookie marker. Zero the descriptors cookie to prevent accidental 37f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * repeated completions. 38f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * 39f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * Note: caller is expected to hold a lock to prevent concurrency. 40f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux */ 41f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linuxstatic inline void dma_cookie_complete(struct dma_async_tx_descriptor *tx) 42f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux{ 43f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux BUG_ON(tx->cookie < DMA_MIN_COOKIE); 44f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux tx->chan->completed_cookie = tx->cookie; 45f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux tx->cookie = 0; 46f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux} 47f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux 4896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux/** 4996a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * dma_cookie_status - report cookie status 5096a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * @chan: dma channel 5196a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * @cookie: cookie we are interested in 5296a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * @state: dma_tx_state structure to return last/used cookies 5396a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * 5496a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * Report the status of the cookie, filling in the state structure if 5596a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * non-NULL. No locking is required. 5696a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux */ 5796a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linuxstatic inline enum dma_status dma_cookie_status(struct dma_chan *chan, 5896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux dma_cookie_t cookie, struct dma_tx_state *state) 5996a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux{ 6096a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux dma_cookie_t used, complete; 6196a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux 6296a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux used = chan->cookie; 6396a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux complete = chan->completed_cookie; 6496a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux barrier(); 6596a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux if (state) { 6696a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->last = complete; 6796a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->used = used; 6896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->residue = 0; 6996a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux } 7096a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux return dma_async_is_complete(cookie, complete, used); 7196a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux} 7296a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux 7396a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linuxstatic inline void dma_set_residue(struct dma_tx_state *state, u32 residue) 7496a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux{ 7596a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux if (state) 7696a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->residue = residue; 7796a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux} 7896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux 79d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux#endif 80