dmaengine: Add scatter-gathered memset
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Mon, 6 Jul 2015 10:19:23 +0000 (12:19 +0200)
committerVinod Koul <vinod.koul@intel.com>
Thu, 6 Aug 2015 03:00:56 +0000 (08:30 +0530)
The current API allows the driver to accelerate memset by using the DMA
controller.

However, it does so over a contiguous memory area, which might proves
inefficient when you have to do it over a non-contiguous yet repititive
pattern, since you have to create a number of descriptors and then submit
each other.

Add a memset operation going over a scatter list to handle such cases in a
single call.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: Ludovic Desroches <ludovic.desroches@atmel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
include/linux/dmaengine.h

index 03ed832adbc28ddb8b312b98d6225c40cfdb71b1..8ad9a4e839f664f37e905f096a2496e27fd3ec8c 100644 (file)
@@ -66,6 +66,7 @@ enum dma_transaction_type {
        DMA_XOR_VAL,
        DMA_PQ_VAL,
        DMA_MEMSET,
+       DMA_MEMSET_SG,
        DMA_INTERRUPT,
        DMA_SG,
        DMA_PRIVATE,
@@ -630,6 +631,7 @@ enum dmaengine_alignment {
  * @device_prep_dma_pq: prepares a pq operation
  * @device_prep_dma_pq_val: prepares a pqzero_sum operation
  * @device_prep_dma_memset: prepares a memset operation
+ * @device_prep_dma_memset_sg: prepares a memset operation over a scatter list
  * @device_prep_dma_interrupt: prepares an end of chain interrupt operation
  * @device_prep_slave_sg: prepares a slave dma operation
  * @device_prep_dma_cyclic: prepare a cyclic dma operation suitable for audio.
@@ -696,6 +698,9 @@ struct dma_device {
        struct dma_async_tx_descriptor *(*device_prep_dma_memset)(
                struct dma_chan *chan, dma_addr_t dest, int value, size_t len,
                unsigned long flags);
+       struct dma_async_tx_descriptor *(*device_prep_dma_memset_sg)(
+               struct dma_chan *chan, struct scatterlist *sg,
+               unsigned int nents, int value, unsigned long flags);
        struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)(
                struct dma_chan *chan, unsigned long flags);
        struct dma_async_tx_descriptor *(*device_prep_dma_sg)(