Blame view

kernel/linux-imx6_3.14.28/drivers/dma/dmaengine.h 2.23 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  /*
   * 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