[PATCH v3 01/11] dmaengine: Add API function dmaengine_prep_slave_dma_array()

Hillf Danton hdanton at sina.com
Tue Apr 4 01:59:44 UTC 2023


On 3 Apr 2023 17:47:50 +0200 Paul Cercueil <paul at crapouillou.net>
> This function can be used to initiate a scatter-gather DMA transfer
> where the DMA addresses and lengths are located inside arrays.
> 
> The major difference with dmaengine_prep_slave_sg() is that it supports
> specifying the lengths of each DMA transfer; as trying to override the
> length of the transfer with dmaengine_prep_slave_sg() is a very tedious
> process. The introduction of a new API function is also justified by the
> fact that scatterlists are on their way out.

Given sg's wayout and conceptually iovec and kvec (in include/linux/uio.h),
what you add should have been dma_vec to ease people making use of it.

	struct dma_vec {
		dma_addr_t	addr;
		size_t		len;
	};
> 
> Signed-off-by: Paul Cercueil <paul at crapouillou.net>
> 
> ---
> v3: New patch
> ---
>  include/linux/dmaengine.h | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
> index c3656e590213..62efa28c009a 100644
> --- a/include/linux/dmaengine.h
> +++ b/include/linux/dmaengine.h
> @@ -912,6 +912,11 @@ struct dma_device {
>  	struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)(
>  		struct dma_chan *chan, unsigned long flags);
>  
> +	struct dma_async_tx_descriptor *(*device_prep_slave_dma_array)(
> +		struct dma_chan *chan, dma_addr_t *addrs,
> +		size_t *lengths, size_t nb,
> +		enum dma_transfer_direction direction,
> +		unsigned long flags);

Then the callback looks like

	struct dma_async_tx_descriptor *(*device_prep_slave_vec)(
		struct dma_chan *chan,
		struct dma_vec *vec,
		int nvec,
		enum dma_transfer_direction direction,
		unsigned long flags);


More information about the dri-devel mailing list