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