Commit 8971646294bda65f8666b60cb2cb3d5e172c99bf
1 parent
45c463ae92
Exists in
master
and in
16 other branches
async_memcpy: convert to dmaengine_unmap_data
Use the generic unmap object to unmap dma buffers. Cc: Vinod Koul <vinod.koul@intel.com> Cc: Tomasz Figa <t.figa@samsung.com> Cc: Dave Jiang <dave.jiang@intel.com> Reported-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> [bzolnier: add missing unmap->len initialization] [bzolnier: fix whitespace damage] Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> [djbw: add DMA_ENGINE=n support] Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Showing 3 changed files with 42 additions and 18 deletions Side-by-side Diff
crypto/async_tx/async_memcpy.c
... | ... | @@ -50,33 +50,37 @@ |
50 | 50 | &dest, 1, &src, 1, len); |
51 | 51 | struct dma_device *device = chan ? chan->device : NULL; |
52 | 52 | struct dma_async_tx_descriptor *tx = NULL; |
53 | + struct dmaengine_unmap_data *unmap = NULL; | |
53 | 54 | |
54 | - if (device && is_dma_copy_aligned(device, src_offset, dest_offset, len)) { | |
55 | - dma_addr_t dma_dest, dma_src; | |
56 | - unsigned long dma_prep_flags = 0; | |
55 | + if (device) | |
56 | + unmap = dmaengine_get_unmap_data(device->dev, 2, GFP_NOIO); | |
57 | 57 | |
58 | + if (unmap && is_dma_copy_aligned(device, src_offset, dest_offset, len)) { | |
59 | + unsigned long dma_prep_flags = DMA_COMPL_SKIP_SRC_UNMAP | | |
60 | + DMA_COMPL_SKIP_DEST_UNMAP; | |
61 | + | |
58 | 62 | if (submit->cb_fn) |
59 | 63 | dma_prep_flags |= DMA_PREP_INTERRUPT; |
60 | 64 | if (submit->flags & ASYNC_TX_FENCE) |
61 | 65 | dma_prep_flags |= DMA_PREP_FENCE; |
62 | - dma_dest = dma_map_page(device->dev, dest, dest_offset, len, | |
63 | - DMA_FROM_DEVICE); | |
64 | 66 | |
65 | - dma_src = dma_map_page(device->dev, src, src_offset, len, | |
66 | - DMA_TO_DEVICE); | |
67 | + unmap->to_cnt = 1; | |
68 | + unmap->addr[0] = dma_map_page(device->dev, src, src_offset, len, | |
69 | + DMA_TO_DEVICE); | |
70 | + unmap->from_cnt = 1; | |
71 | + unmap->addr[1] = dma_map_page(device->dev, dest, dest_offset, len, | |
72 | + DMA_FROM_DEVICE); | |
73 | + unmap->len = len; | |
67 | 74 | |
68 | - tx = device->device_prep_dma_memcpy(chan, dma_dest, dma_src, | |
69 | - len, dma_prep_flags); | |
70 | - if (!tx) { | |
71 | - dma_unmap_page(device->dev, dma_dest, len, | |
72 | - DMA_FROM_DEVICE); | |
73 | - dma_unmap_page(device->dev, dma_src, len, | |
74 | - DMA_TO_DEVICE); | |
75 | - } | |
75 | + tx = device->device_prep_dma_memcpy(chan, unmap->addr[1], | |
76 | + unmap->addr[0], len, | |
77 | + dma_prep_flags); | |
76 | 78 | } |
77 | 79 | |
78 | 80 | if (tx) { |
79 | 81 | pr_debug("%s: (async) len: %zu\n", __func__, len); |
82 | + | |
83 | + dma_set_unmap(tx, unmap); | |
80 | 84 | async_tx_submit(chan, tx, submit); |
81 | 85 | } else { |
82 | 86 | void *dest_buf, *src_buf; |
... | ... | @@ -95,6 +99,8 @@ |
95 | 99 | |
96 | 100 | async_tx_sync_epilog(submit); |
97 | 101 | } |
102 | + | |
103 | + dmaengine_unmap_put(unmap); | |
98 | 104 | |
99 | 105 | return tx; |
100 | 106 | } |
drivers/dma/dmaengine.c
... | ... | @@ -1009,7 +1009,7 @@ |
1009 | 1009 | return -ENOMEM; |
1010 | 1010 | } |
1011 | 1011 | |
1012 | -static struct dmaengine_unmap_data * | |
1012 | +struct dmaengine_unmap_data * | |
1013 | 1013 | dmaengine_get_unmap_data(struct device *dev, int nr, gfp_t flags) |
1014 | 1014 | { |
1015 | 1015 | struct dmaengine_unmap_data *unmap; |
... | ... | @@ -1024,6 +1024,7 @@ |
1024 | 1024 | |
1025 | 1025 | return unmap; |
1026 | 1026 | } |
1027 | +EXPORT_SYMBOL(dmaengine_get_unmap_data); | |
1027 | 1028 | |
1028 | 1029 | /** |
1029 | 1030 | * dma_async_memcpy_pg_to_pg - offloaded copy from page to page |
include/linux/dmaengine.h
... | ... | @@ -457,6 +457,7 @@ |
457 | 457 | #endif |
458 | 458 | }; |
459 | 459 | |
460 | +#ifdef CONFIG_DMA_ENGINE | |
460 | 461 | static inline void dma_set_unmap(struct dma_async_tx_descriptor *tx, |
461 | 462 | struct dmaengine_unmap_data *unmap) |
462 | 463 | { |
463 | 464 | |
... | ... | @@ -464,7 +465,23 @@ |
464 | 465 | tx->unmap = unmap; |
465 | 466 | } |
466 | 467 | |
468 | +struct dmaengine_unmap_data * | |
469 | +dmaengine_get_unmap_data(struct device *dev, int nr, gfp_t flags); | |
467 | 470 | void dmaengine_unmap_put(struct dmaengine_unmap_data *unmap); |
471 | +#else | |
472 | +static inline void dma_set_unmap(struct dma_async_tx_descriptor *tx, | |
473 | + struct dmaengine_unmap_data *unmap) | |
474 | +{ | |
475 | +} | |
476 | +static inline struct dmaengine_unmap_data * | |
477 | +dmaengine_get_unmap_data(struct device *dev, int nr, gfp_t flags) | |
478 | +{ | |
479 | + return NULL; | |
480 | +} | |
481 | +static inline void dmaengine_unmap_put(struct dmaengine_unmap_data *unmap) | |
482 | +{ | |
483 | +} | |
484 | +#endif | |
468 | 485 | |
469 | 486 | static inline void dma_descriptor_unmap(struct dma_async_tx_descriptor *tx) |
470 | 487 | { |