Re: [PATCH v7 03/12] dmaengine: doc: Add sections for per descriptor metadata support
From: Vinod Koul
Date: Fri Dec 20 2019 - 03:28:17 EST
Hi Peter,
On 09-12-19, 11:43, Peter Ujfalusi wrote:
> + Optional: per descriptor metadata
> + ---------------------------------
> + DMAengine provides two ways for metadata support.
> +
> + DESC_METADATA_CLIENT
> +
> + The metadata buffer is allocated/provided by the client driver and it is
> + attached to the descriptor.
> +
> + .. code-block:: c
> +
> + int dmaengine_desc_attach_metadata(struct dma_async_tx_descriptor *desc,
> + void *data, size_t len);
> +
> + DESC_METADATA_ENGINE
> +
> + The metadata buffer is allocated/managed by the DMA driver. The client
and when would it be freed?
> + driver can ask for the pointer, maximum size and the currently used size of
> + the metadata and can directly update or read it.
> +
> + .. code-block:: c
> +
> + void *dmaengine_desc_get_metadata_ptr(struct dma_async_tx_descriptor *desc,
> + size_t *payload_len, size_t *max_len);
> +
> + int dmaengine_desc_set_metadata_len(struct dma_async_tx_descriptor *desc,
> + size_t payload_len);
> +
> + Client drivers can query if a given mode is supported with:
> +
> + .. code-block:: c
> +
> + bool dmaengine_is_metadata_mode_supported(struct dma_chan *chan,
> + enum dma_desc_metadata_mode mode);
> +
> + Depending on the used mode client drivers must follow different flow.
> +
> + DESC_METADATA_CLIENT
> +
> + - DMA_MEM_TO_DEV / DEV_MEM_TO_MEM:
> + 1. prepare the descriptor (dmaengine_prep_*)
> + construct the metadata in the client's buffer
> + 2. use dmaengine_desc_attach_metadata() to attach the buffer to the
> + descriptor
> + 3. submit the transfer
This is simpler, txn finished the metadata would be freed up right?
> + - DMA_DEV_TO_MEM:
> + 1. prepare the descriptor (dmaengine_prep_*)
> + 2. use dmaengine_desc_attach_metadata() to attach the buffer to the
> + descriptor
> + 3. submit the transfer
> + 4. when the transfer is completed, the metadata should be available in the
> + attached buffer
and when and how would driver free that up :)
> +
> + DESC_METADATA_ENGINE
> +
> + - DMA_MEM_TO_DEV / DEV_MEM_TO_MEM:
> + 1. prepare the descriptor (dmaengine_prep_*)
> + 2. use dmaengine_desc_get_metadata_ptr() to get the pointer to the
> + engine's metadata area
> + 3. update the metadata at the pointer
> + 4. use dmaengine_desc_set_metadata_len() to tell the DMA engine the
> + amount of data the client has placed into the metadata buffer
> + 5. submit the transfer
> + - DMA_DEV_TO_MEM:
> + 1. prepare the descriptor (dmaengine_prep_*)
> + 2. submit the transfer
> + 3. on transfer completion, use dmaengine_desc_get_metadata_ptr() to get the
> + pointer to the engine's metadata area
> + 4. Read out the metadata from the pointer
> +
> + .. note::
> +
> + Mixed use of DESC_METADATA_CLIENT / DESC_METADATA_ENGINE is not allowed,
> + client drivers must use either of the modes per descriptor.
We should check that if not done already!
--
~Vinod