linux/drivers/dma/dmaengine.h
<<
>>
Prefs
   1/*
   2 * The contents of this file are private to DMA engine drivers, and is not
   3 * part of the API to be used by DMA engine users.
   4 */
   5#ifndef DMAENGINE_H
   6#define DMAENGINE_H
   7
   8#include <linux/bug.h>
   9#include <linux/dmaengine.h>
  10
  11/**
  12 * dma_cookie_init - initialize the cookies for a DMA channel
  13 * @chan: dma channel to initialize
  14 */
  15static inline void dma_cookie_init(struct dma_chan *chan)
  16{
  17        chan->cookie = DMA_MIN_COOKIE;
  18        chan->completed_cookie = DMA_MIN_COOKIE;
  19}
  20
  21/**
  22 * dma_cookie_assign - assign a DMA engine cookie to the descriptor
  23 * @tx: descriptor needing cookie
  24 *
  25 * Assign a unique non-zero per-channel cookie to the descriptor.
  26 * Note: caller is expected to hold a lock to prevent concurrency.
  27 */
  28static inline dma_cookie_t dma_cookie_assign(struct dma_async_tx_descriptor *tx)
  29{
  30        struct dma_chan *chan = tx->chan;
  31        dma_cookie_t cookie;
  32
  33        cookie = chan->cookie + 1;
  34        if (cookie < DMA_MIN_COOKIE)
  35                cookie = DMA_MIN_COOKIE;
  36        tx->cookie = chan->cookie = cookie;
  37
  38        return cookie;
  39}
  40
  41/**
  42 * dma_cookie_complete - complete a descriptor
  43 * @tx: descriptor to complete
  44 *
  45 * Mark this descriptor complete by updating the channels completed
  46 * cookie marker.  Zero the descriptors cookie to prevent accidental
  47 * repeated completions.
  48 *
  49 * Note: caller is expected to hold a lock to prevent concurrency.
  50 */
  51static inline void dma_cookie_complete(struct dma_async_tx_descriptor *tx)
  52{
  53        BUG_ON(tx->cookie < DMA_MIN_COOKIE);
  54        tx->chan->completed_cookie = tx->cookie;
  55        tx->cookie = 0;
  56}
  57
  58/**
  59 * dma_cookie_status - report cookie status
  60 * @chan: dma channel
  61 * @cookie: cookie we are interested in
  62 * @state: dma_tx_state structure to return last/used cookies
  63 *
  64 * Report the status of the cookie, filling in the state structure if
  65 * non-NULL.  No locking is required.
  66 */
  67static inline enum dma_status dma_cookie_status(struct dma_chan *chan,
  68        dma_cookie_t cookie, struct dma_tx_state *state)
  69{
  70        dma_cookie_t used, complete;
  71
  72        used = chan->cookie;
  73        complete = chan->completed_cookie;
  74        barrier();
  75        if (state) {
  76                state->last = complete;
  77                state->used = used;
  78                state->residue = 0;
  79        }
  80        return dma_async_is_complete(cookie, complete, used);
  81}
  82
  83static inline void dma_set_residue(struct dma_tx_state *state, u32 residue)
  84{
  85        if (state)
  86                state->residue = residue;
  87}
  88
  89#endif
  90