1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#ifndef DMAENGINE_H
22#define DMAENGINE_H
23
24#include <linux/device.h>
25#include <linux/uio.h>
26#include <linux/dma-mapping.h>
27
28
29
30
31
32
33typedef s32 dma_cookie_t;
34#define DMA_MIN_COOKIE 1
35#define DMA_MAX_COOKIE INT_MAX
36
37#define dma_submit_error(cookie) ((cookie) < 0 ? 1 : 0)
38
39
40
41
42
43
44
45enum dma_status {
46 DMA_SUCCESS,
47 DMA_IN_PROGRESS,
48 DMA_ERROR,
49};
50
51
52
53
54
55
56
57enum dma_transaction_type {
58 DMA_MEMCPY,
59 DMA_XOR,
60 DMA_PQ,
61 DMA_XOR_VAL,
62 DMA_PQ_VAL,
63 DMA_MEMSET,
64 DMA_INTERRUPT,
65 DMA_PRIVATE,
66 DMA_ASYNC_TX,
67 DMA_SLAVE,
68};
69
70
71#define DMA_TX_TYPE_END (DMA_SLAVE + 1)
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96enum dma_ctrl_flags {
97 DMA_PREP_INTERRUPT = (1 << 0),
98 DMA_CTRL_ACK = (1 << 1),
99 DMA_COMPL_SKIP_SRC_UNMAP = (1 << 2),
100 DMA_COMPL_SKIP_DEST_UNMAP = (1 << 3),
101 DMA_COMPL_SRC_UNMAP_SINGLE = (1 << 4),
102 DMA_COMPL_DEST_UNMAP_SINGLE = (1 << 5),
103 DMA_PREP_PQ_DISABLE_P = (1 << 6),
104 DMA_PREP_PQ_DISABLE_Q = (1 << 7),
105 DMA_PREP_CONTINUE = (1 << 8),
106 DMA_PREP_FENCE = (1 << 9),
107};
108
109
110
111
112enum sum_check_bits {
113 SUM_CHECK_P = 0,
114 SUM_CHECK_Q = 1,
115};
116
117
118
119
120
121
122enum sum_check_flags {
123 SUM_CHECK_P_RESULT = (1 << SUM_CHECK_P),
124 SUM_CHECK_Q_RESULT = (1 << SUM_CHECK_Q),
125};
126
127
128
129
130
131
132typedef struct { DECLARE_BITMAP(bits, DMA_TX_TYPE_END); } dma_cap_mask_t;
133
134
135
136
137
138
139
140struct dma_chan_percpu {
141
142 unsigned long memcpy_count;
143 unsigned long bytes_transferred;
144};
145
146
147
148
149
150
151
152
153
154
155
156
157
158struct dma_chan {
159 struct dma_device *device;
160 dma_cookie_t cookie;
161
162
163 int chan_id;
164 struct dma_chan_dev *dev;
165
166 struct list_head device_node;
167 struct dma_chan_percpu __percpu *local;
168 int client_count;
169 int table_count;
170 void *private;
171};
172
173
174
175
176
177
178
179
180struct dma_chan_dev {
181 struct dma_chan *chan;
182 struct device device;
183 int dev_id;
184 atomic_t *idr_ref;
185};
186
187static inline const char *dma_chan_name(struct dma_chan *chan)
188{
189 return dev_name(&chan->dev->device);
190}
191
192void dma_chan_cleanup(struct kref *kref);
193
194
195
196
197
198
199
200
201
202
203
204
205typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param);
206
207typedef void (*dma_async_tx_callback)(void *dma_async_param);
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225struct dma_async_tx_descriptor {
226 dma_cookie_t cookie;
227 enum dma_ctrl_flags flags;
228 dma_addr_t phys;
229 struct dma_chan *chan;
230 dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx);
231 dma_async_tx_callback callback;
232 void *callback_param;
233 struct dma_async_tx_descriptor *next;
234 struct dma_async_tx_descriptor *parent;
235 spinlock_t lock;
236};
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268struct dma_device {
269
270 unsigned int chancnt;
271 unsigned int privatecnt;
272 struct list_head channels;
273 struct list_head global_node;
274 dma_cap_mask_t cap_mask;
275 unsigned short max_xor;
276 unsigned short max_pq;
277 u8 copy_align;
278 u8 xor_align;
279 u8 pq_align;
280 u8 fill_align;
281 #define DMA_HAS_PQ_CONTINUE (1 << 15)
282
283 int dev_id;
284 struct device *dev;
285
286 int (*device_alloc_chan_resources)(struct dma_chan *chan);
287 void (*device_free_chan_resources)(struct dma_chan *chan);
288
289 struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)(
290 struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
291 size_t len, unsigned long flags);
292 struct dma_async_tx_descriptor *(*device_prep_dma_xor)(
293 struct dma_chan *chan, dma_addr_t dest, dma_addr_t *src,
294 unsigned int src_cnt, size_t len, unsigned long flags);
295 struct dma_async_tx_descriptor *(*device_prep_dma_xor_val)(
296 struct dma_chan *chan, dma_addr_t *src, unsigned int src_cnt,
297 size_t len, enum sum_check_flags *result, unsigned long flags);
298 struct dma_async_tx_descriptor *(*device_prep_dma_pq)(
299 struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src,
300 unsigned int src_cnt, const unsigned char *scf,
301 size_t len, unsigned long flags);
302 struct dma_async_tx_descriptor *(*device_prep_dma_pq_val)(
303 struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src,
304 unsigned int src_cnt, const unsigned char *scf, size_t len,
305 enum sum_check_flags *pqres, unsigned long flags);
306 struct dma_async_tx_descriptor *(*device_prep_dma_memset)(
307 struct dma_chan *chan, dma_addr_t dest, int value, size_t len,
308 unsigned long flags);
309 struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)(
310 struct dma_chan *chan, unsigned long flags);
311
312 struct dma_async_tx_descriptor *(*device_prep_slave_sg)(
313 struct dma_chan *chan, struct scatterlist *sgl,
314 unsigned int sg_len, enum dma_data_direction direction,
315 unsigned long flags);
316 void (*device_terminate_all)(struct dma_chan *chan);
317
318 enum dma_status (*device_is_tx_complete)(struct dma_chan *chan,
319 dma_cookie_t cookie, dma_cookie_t *last,
320 dma_cookie_t *used);
321 void (*device_issue_pending)(struct dma_chan *chan);
322};
323
324static inline bool dmaengine_check_align(u8 align, size_t off1, size_t off2, size_t len)
325{
326 size_t mask;
327
328 if (!align)
329 return true;
330 mask = (1 << align) - 1;
331 if (mask & (off1 | off2 | len))
332 return false;
333 return true;
334}
335
336static inline bool is_dma_copy_aligned(struct dma_device *dev, size_t off1,
337 size_t off2, size_t len)
338{
339 return dmaengine_check_align(dev->copy_align, off1, off2, len);
340}
341
342static inline bool is_dma_xor_aligned(struct dma_device *dev, size_t off1,
343 size_t off2, size_t len)
344{
345 return dmaengine_check_align(dev->xor_align, off1, off2, len);
346}
347
348static inline bool is_dma_pq_aligned(struct dma_device *dev, size_t off1,
349 size_t off2, size_t len)
350{
351 return dmaengine_check_align(dev->pq_align, off1, off2, len);
352}
353
354static inline bool is_dma_fill_aligned(struct dma_device *dev, size_t off1,
355 size_t off2, size_t len)
356{
357 return dmaengine_check_align(dev->fill_align, off1, off2, len);
358}
359
360static inline void
361dma_set_maxpq(struct dma_device *dma, int maxpq, int has_pq_continue)
362{
363 dma->max_pq = maxpq;
364 if (has_pq_continue)
365 dma->max_pq |= DMA_HAS_PQ_CONTINUE;
366}
367
368static inline bool dmaf_continue(enum dma_ctrl_flags flags)
369{
370 return (flags & DMA_PREP_CONTINUE) == DMA_PREP_CONTINUE;
371}
372
373static inline bool dmaf_p_disabled_continue(enum dma_ctrl_flags flags)
374{
375 enum dma_ctrl_flags mask = DMA_PREP_CONTINUE | DMA_PREP_PQ_DISABLE_P;
376
377 return (flags & mask) == mask;
378}
379
380static inline bool dma_dev_has_pq_continue(struct dma_device *dma)
381{
382 return (dma->max_pq & DMA_HAS_PQ_CONTINUE) == DMA_HAS_PQ_CONTINUE;
383}
384
385static unsigned short dma_dev_to_maxpq(struct dma_device *dma)
386{
387 return dma->max_pq & ~DMA_HAS_PQ_CONTINUE;
388}
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403static inline int dma_maxpq(struct dma_device *dma, enum dma_ctrl_flags flags)
404{
405 if (dma_dev_has_pq_continue(dma) || !dmaf_continue(flags))
406 return dma_dev_to_maxpq(dma);
407 else if (dmaf_p_disabled_continue(flags))
408 return dma_dev_to_maxpq(dma) - 1;
409 else if (dmaf_continue(flags))
410 return dma_dev_to_maxpq(dma) - 3;
411 BUG();
412}
413
414
415
416#ifdef CONFIG_DMA_ENGINE
417void dmaengine_get(void);
418void dmaengine_put(void);
419#else
420static inline void dmaengine_get(void)
421{
422}
423static inline void dmaengine_put(void)
424{
425}
426#endif
427
428#ifdef CONFIG_NET_DMA
429#define net_dmaengine_get() dmaengine_get()
430#define net_dmaengine_put() dmaengine_put()
431#else
432static inline void net_dmaengine_get(void)
433{
434}
435static inline void net_dmaengine_put(void)
436{
437}
438#endif
439
440#ifdef CONFIG_ASYNC_TX_DMA
441#define async_dmaengine_get() dmaengine_get()
442#define async_dmaengine_put() dmaengine_put()
443#ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH
444#define async_dma_find_channel(type) dma_find_channel(DMA_ASYNC_TX)
445#else
446#define async_dma_find_channel(type) dma_find_channel(type)
447#endif
448#else
449static inline void async_dmaengine_get(void)
450{
451}
452static inline void async_dmaengine_put(void)
453{
454}
455static inline struct dma_chan *
456async_dma_find_channel(enum dma_transaction_type type)
457{
458 return NULL;
459}
460#endif
461
462dma_cookie_t dma_async_memcpy_buf_to_buf(struct dma_chan *chan,
463 void *dest, void *src, size_t len);
464dma_cookie_t dma_async_memcpy_buf_to_pg(struct dma_chan *chan,
465 struct page *page, unsigned int offset, void *kdata, size_t len);
466dma_cookie_t dma_async_memcpy_pg_to_pg(struct dma_chan *chan,
467 struct page *dest_pg, unsigned int dest_off, struct page *src_pg,
468 unsigned int src_off, size_t len);
469void dma_async_tx_descriptor_init(struct dma_async_tx_descriptor *tx,
470 struct dma_chan *chan);
471
472static inline void async_tx_ack(struct dma_async_tx_descriptor *tx)
473{
474 tx->flags |= DMA_CTRL_ACK;
475}
476
477static inline void async_tx_clear_ack(struct dma_async_tx_descriptor *tx)
478{
479 tx->flags &= ~DMA_CTRL_ACK;
480}
481
482static inline bool async_tx_test_ack(struct dma_async_tx_descriptor *tx)
483{
484 return (tx->flags & DMA_CTRL_ACK) == DMA_CTRL_ACK;
485}
486
487#define first_dma_cap(mask) __first_dma_cap(&(mask))
488static inline int __first_dma_cap(const dma_cap_mask_t *srcp)
489{
490 return min_t(int, DMA_TX_TYPE_END,
491 find_first_bit(srcp->bits, DMA_TX_TYPE_END));
492}
493
494#define next_dma_cap(n, mask) __next_dma_cap((n), &(mask))
495static inline int __next_dma_cap(int n, const dma_cap_mask_t *srcp)
496{
497 return min_t(int, DMA_TX_TYPE_END,
498 find_next_bit(srcp->bits, DMA_TX_TYPE_END, n+1));
499}
500
501#define dma_cap_set(tx, mask) __dma_cap_set((tx), &(mask))
502static inline void
503__dma_cap_set(enum dma_transaction_type tx_type, dma_cap_mask_t *dstp)
504{
505 set_bit(tx_type, dstp->bits);
506}
507
508#define dma_cap_clear(tx, mask) __dma_cap_clear((tx), &(mask))
509static inline void
510__dma_cap_clear(enum dma_transaction_type tx_type, dma_cap_mask_t *dstp)
511{
512 clear_bit(tx_type, dstp->bits);
513}
514
515#define dma_cap_zero(mask) __dma_cap_zero(&(mask))
516static inline void __dma_cap_zero(dma_cap_mask_t *dstp)
517{
518 bitmap_zero(dstp->bits, DMA_TX_TYPE_END);
519}
520
521#define dma_has_cap(tx, mask) __dma_has_cap((tx), &(mask))
522static inline int
523__dma_has_cap(enum dma_transaction_type tx_type, dma_cap_mask_t *srcp)
524{
525 return test_bit(tx_type, srcp->bits);
526}
527
528#define for_each_dma_cap_mask(cap, mask) \
529 for ((cap) = first_dma_cap(mask); \
530 (cap) < DMA_TX_TYPE_END; \
531 (cap) = next_dma_cap((cap), (mask)))
532
533
534
535
536
537
538
539
540static inline void dma_async_issue_pending(struct dma_chan *chan)
541{
542 chan->device->device_issue_pending(chan);
543}
544
545#define dma_async_memcpy_issue_pending(chan) dma_async_issue_pending(chan)
546
547
548
549
550
551
552
553
554
555
556
557
558static inline enum dma_status dma_async_is_tx_complete(struct dma_chan *chan,
559 dma_cookie_t cookie, dma_cookie_t *last, dma_cookie_t *used)
560{
561 return chan->device->device_is_tx_complete(chan, cookie, last, used);
562}
563
564#define dma_async_memcpy_complete(chan, cookie, last, used)\
565 dma_async_is_tx_complete(chan, cookie, last, used)
566
567
568
569
570
571
572
573
574
575
576static inline enum dma_status dma_async_is_complete(dma_cookie_t cookie,
577 dma_cookie_t last_complete, dma_cookie_t last_used)
578{
579 if (last_complete <= last_used) {
580 if ((cookie <= last_complete) || (cookie > last_used))
581 return DMA_SUCCESS;
582 } else {
583 if ((cookie <= last_complete) && (cookie > last_used))
584 return DMA_SUCCESS;
585 }
586 return DMA_IN_PROGRESS;
587}
588
589enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie);
590#ifdef CONFIG_DMA_ENGINE
591enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx);
592void dma_issue_pending_all(void);
593#else
594static inline enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx)
595{
596 return DMA_SUCCESS;
597}
598static inline void dma_issue_pending_all(void)
599{
600 do { } while (0);
601}
602#endif
603
604
605
606int dma_async_device_register(struct dma_device *device);
607void dma_async_device_unregister(struct dma_device *device);
608void dma_run_dependencies(struct dma_async_tx_descriptor *tx);
609struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type);
610#define dma_request_channel(mask, x, y) __dma_request_channel(&(mask), x, y)
611struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param);
612void dma_release_channel(struct dma_chan *chan);
613
614
615
616struct dma_page_list {
617 char __user *base_address;
618 int nr_pages;
619 struct page **pages;
620};
621
622struct dma_pinned_list {
623 int nr_iovecs;
624 struct dma_page_list page_list[0];
625};
626
627struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len);
628void dma_unpin_iovec_pages(struct dma_pinned_list* pinned_list);
629
630dma_cookie_t dma_memcpy_to_iovec(struct dma_chan *chan, struct iovec *iov,
631 struct dma_pinned_list *pinned_list, unsigned char *kdata, size_t len);
632dma_cookie_t dma_memcpy_pg_to_iovec(struct dma_chan *chan, struct iovec *iov,
633 struct dma_pinned_list *pinned_list, struct page *page,
634 unsigned int offset, size_t len);
635
636#endif
637