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/** 12d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux * dma_cookie_init - initialize the cookies for a DMA channel 13d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux * @chan: dma channel to initialize 14d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux */ 15d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linuxstatic inline void dma_cookie_init(struct dma_chan *chan) 16d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux{ 17d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux chan->cookie = DMA_MIN_COOKIE; 18d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux chan->completed_cookie = DMA_MIN_COOKIE; 19d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux} 20d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux 21d3ee98cdcd6198ea1cf75c603178acc8a805b69bRussell King - ARM Linux/** 22884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * dma_cookie_assign - assign a DMA engine cookie to the descriptor 23884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * @tx: descriptor needing cookie 24884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * 25884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * Assign a unique non-zero per-channel cookie to the descriptor. 26884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux * Note: caller is expected to hold a lock to prevent concurrency. 27884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux */ 28884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linuxstatic inline dma_cookie_t dma_cookie_assign(struct dma_async_tx_descriptor *tx) 29884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux{ 30884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux struct dma_chan *chan = tx->chan; 31884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux dma_cookie_t cookie; 32884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux 33884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux cookie = chan->cookie + 1; 34884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux if (cookie < DMA_MIN_COOKIE) 35884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux cookie = DMA_MIN_COOKIE; 36884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux tx->cookie = chan->cookie = cookie; 37884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux 38884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux return cookie; 39884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux} 40884485e1f12dcd39390f042e772cdbefc9ebb750Russell King - ARM Linux 41f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux/** 42f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * dma_cookie_complete - complete a descriptor 43f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * @tx: descriptor to complete 44f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * 45f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * Mark this descriptor complete by updating the channels completed 46f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * cookie marker. Zero the descriptors cookie to prevent accidental 47f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * repeated completions. 48f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * 49f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux * Note: caller is expected to hold a lock to prevent concurrency. 50f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux */ 51f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linuxstatic inline void dma_cookie_complete(struct dma_async_tx_descriptor *tx) 52f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux{ 53f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux BUG_ON(tx->cookie < DMA_MIN_COOKIE); 54f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux tx->chan->completed_cookie = tx->cookie; 55f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux tx->cookie = 0; 56f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux} 57f7fbce07c6ce26a25b4e0cb5f241c361fde87901Russell King - ARM Linux 5896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux/** 5996a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * dma_cookie_status - report cookie status 6096a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * @chan: dma channel 6196a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * @cookie: cookie we are interested in 6296a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * @state: dma_tx_state structure to return last/used cookies 6396a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * 6496a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * Report the status of the cookie, filling in the state structure if 6596a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux * non-NULL. No locking is required. 6696a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux */ 6796a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linuxstatic inline enum dma_status dma_cookie_status(struct dma_chan *chan, 6896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux dma_cookie_t cookie, struct dma_tx_state *state) 6996a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux{ 7096a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux dma_cookie_t used, complete; 7196a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux 7296a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux used = chan->cookie; 7396a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux complete = chan->completed_cookie; 7496a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux barrier(); 7596a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux if (state) { 7696a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->last = complete; 7796a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->used = used; 7896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->residue = 0; 7996a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux } 8096a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux return dma_async_is_complete(cookie, complete, used); 8196a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux} 8296a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux 8396a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linuxstatic inline void dma_set_residue(struct dma_tx_state *state, u32 residue) 8496a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux{ 8596a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux if (state) 8696a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux state->residue = residue; 8796a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux} 8896a2af41c78b1fbb1f567a3486bdc63f7b31c5fdRussell King - ARM Linux 89d2ebfb335b0426deb1a4fb14e4e926d81ecd8235Russell King - ARM Linux#endif 90