lkml.org 
[lkml]   [2018]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [RFC 2/6] dmaengine: xilinx_dma: Pass AXI4-Stream control words to netdev dma client
    From
    Date
    Hi Radhey,

    On 2018-05-30 20:29, Radhey Shyam Pandey wrote:
    >> In couple of days I can update the metadata patches I have atm and send
    >> as RFC.
    >>
    >> Is there anything from your side I should take into account when doing that?
    > I think a generic interface to attach/share metadata buffer b/w client and the
    > dmaengine driver is good enough. Is metadata patchset (early version)
    > available in TI external repos?

    I don't have it in public repository, but now that the TRM is public I
    can start preparing things for upstream.

    I have attached the patch I ended up with, but I need to add the
    documentation part.

    Since the 'metadata' is part of the DMA descriptor itself I thought that
    it might be better to reflect that -> the metadata_ops is part of the
    dma_async_tx_descriptor struct.

    DMA drivers can initialize it when it is supported by the channel or
    setup. In my case it is optional, many peripherals did not use it at all.

    I have two modes to deal with the metadata:
    1. attach mode
    Client drivers are giving a buffer and a size to the DMA driver and in
    case of TX the data is copied to the descriptor's metadata part. In case
    of RX when the transfer is completed the DMA driver will copy the data
    from the DMA descriptor to the client provided buffer.
    Here we need one memcpy for each descriptor.

    2. pointer mode
    If we have high throughput peripheral, the per descriptor memcpy can be
    an obstacle for performance.

    TX: The client dmaengine_desc_get_metadata_ptr() to get the pointer to
    the metadata section of the descriptor, it will receive back the max
    size and the currently used size (important for RX). This is done before
    issue_pending().
    The client can update the metadata directly and when it is done calls
    the dmaengine_desc_set_metadata_len() to tell the DMA driver the size of
    the metadata it has configured.

    RX: in the DMA callback the client calls
    dmaengine_desc_get_metadata_ptr() to get the pointer and the size of the
    metadata we have received and can process the information w/o memcpy.

    I think it might be better to rename these from metadata to client_data
    or something. It is part of the DMA descriptor, passed along with the
    DMA descriptor, but it is owned by the client driver.

    - Péter

    Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
    Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
    From cdd04a5876d5e2b1e10b4e5456585958715fd3a7 Mon Sep 17 00:00:00 2001
    From: Peter Ujfalusi <peter.ujfalusi@ti.com>
    Date: Fri, 20 Apr 2018 15:10:08 +0300
    Subject: [PATCH] dmaengine: Add metadat_ops for dma_async_tx_descriptor

    If the DMA supports per descriptor metadata it can implement the attach,
    get_ptr/set_len callbacks.

    Client drivers must only use either attach or get_ptr/set_len to avoid
    miss configuration.

    Wrappers are also added for the metadata_ops:
    dmaengine_desc_attach_metadata()
    dmaengine_desc_get_metadata_ptr()
    dmaengine_desc_set_metadata_len()

    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
    ---
    include/linux/dmaengine.h | 50 +++++++++++++++++++++++++++++++++++++++
    1 file changed, 50 insertions(+)

    diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
    index 51fbb861e84b..ac42ace36aa3 100644
    --- a/include/linux/dmaengine.h
    +++ b/include/linux/dmaengine.h
    @@ -491,6 +491,18 @@ struct dmaengine_unmap_data {
    dma_addr_t addr[0];
    };

    +struct dma_async_tx_descriptor;
    +
    +struct dma_descriptor_metadata_ops {
    + int (*attach)(struct dma_async_tx_descriptor *desc, void *data,
    + size_t len);
    +
    + void *(*get_ptr)(struct dma_async_tx_descriptor *desc,
    + size_t *payload_len, size_t *max_len);
    + int (*set_len)(struct dma_async_tx_descriptor *desc,
    + size_t payload_len);
    +};
    +
    /**
    * struct dma_async_tx_descriptor - async transaction descriptor
    * ---dma generic offload fields---
    @@ -520,6 +532,7 @@ struct dma_async_tx_descriptor {
    dma_async_tx_callback_result callback_result;
    void *callback_param;
    struct dmaengine_unmap_data *unmap;
    + struct dma_descriptor_metadata_ops *metadata_ops;
    #ifdef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH
    struct dma_async_tx_descriptor *next;
    struct dma_async_tx_descriptor *parent;
    @@ -932,6 +945,43 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_memcpy(
    len, flags);
    }

    +static inline int dmaengine_desc_attach_metadata(
    + struct dma_async_tx_descriptor *desc, void *data, size_t len)
    +{
    + if (!desc)
    + return 0;
    +
    + if (!desc->metadata_ops || !desc->metadata_ops->attach)
    + return -ENOTSUPP;
    +
    + return desc->metadata_ops->attach(desc, data, len);
    +}
    +
    +static inline void *dmaengine_desc_get_metadata_ptr(
    + struct dma_async_tx_descriptor *desc, size_t *payload_len,
    + size_t *max_len)
    +{
    + if (!desc)
    + return NULL;
    +
    + if (!desc->metadata_ops || !desc->metadata_ops->get_ptr)
    + return ERR_PTR(-ENOTSUPP);
    +
    + return desc->metadata_ops->get_ptr(desc, payload_len, max_len);
    +}
    +
    +static inline int dmaengine_desc_set_metadata_len(
    + struct dma_async_tx_descriptor *desc, size_t payload_len)
    +{
    + if (!desc)
    + return 0;
    +
    + if (!desc->metadata_ops || !desc->metadata_ops->set_len)
    + return -ENOTSUPP;
    +
    + return desc->metadata_ops->set_len(desc, payload_len);
    +}
    +
    /**
    * dmaengine_terminate_all() - Terminate all active DMA transfers
    * @chan: The channel for which to terminate the transfers
    --
    Peter
    Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
    Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

    \
     
     \ /
      Last update: 2018-06-01 12:18    [W:3.863 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site