return -EIO;
        }
 
+       if (dma_has_cap(DMA_MEMCPY_SG, device->cap_mask) && !device->device_prep_dma_memcpy_sg) {
+               dev_err(device->dev,
+                       "Device claims capability %s, but op is not defined\n",
+                       "DMA_MEMCPY_SG");
+               return -EIO;
+       }
+
        if (dma_has_cap(DMA_XOR, device->cap_mask) && !device->device_prep_dma_xor) {
                dev_err(device->dev,
                        "Device claims capability %s, but op is not defined\n",
 
  */
 enum dma_transaction_type {
        DMA_MEMCPY,
+       DMA_MEMCPY_SG,
        DMA_XOR,
        DMA_PQ,
        DMA_XOR_VAL,
        struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)(
                struct dma_chan *chan, dma_addr_t dst, dma_addr_t src,
                size_t len, unsigned long flags);
+       struct dma_async_tx_descriptor *(*device_prep_dma_memcpy_sg)(
+               struct dma_chan *chan,
+               struct scatterlist *dst_sg, unsigned int dst_nents,
+               struct scatterlist *src_sg, unsigned int src_nents,
+               unsigned long flags);
        struct dma_async_tx_descriptor *(*device_prep_dma_xor)(
                struct dma_chan *chan, dma_addr_t dst, dma_addr_t *src,
                unsigned int src_cnt, size_t len, unsigned long flags);
                                                    len, flags);
 }
 
+static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_memcpy_sg(
+               struct dma_chan *chan,
+               struct scatterlist *dst_sg, unsigned int dst_nents,
+               struct scatterlist *src_sg, unsigned int src_nents,
+               unsigned long flags)
+{
+       if (!chan || !chan->device || !chan->device->device_prep_dma_memcpy_sg)
+               return NULL;
+
+       return chan->device->device_prep_dma_memcpy_sg(chan, dst_sg, dst_nents,
+                                                      src_sg, src_nents,
+                                                      flags);
+}
+
 static inline bool dmaengine_is_metadata_mode_supported(struct dma_chan *chan,
                enum dma_desc_metadata_mode mode)
 {