|
|
@@ -151,6 +151,81 @@ The details of these operations are:
|
|
|
Note that callbacks will always be invoked from the DMA
|
|
|
engines tasklet, never from interrupt context.
|
|
|
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+ - 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
|
|
|
+
|
|
|
+ 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 are
|
|
|
+ 4. Read out the metadate 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.
|
|
|
+
|
|
|
4. Submit the transaction
|
|
|
|
|
|
Once the descriptor has been prepared and the callback information
|