lkml.org 
[lkml]   [2022]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v3 22/24] dmaengine: dw-edma: Bypass dma-ranges mapping for the local setup
    On Fri, Jun 10, 2022 at 12:14:57PM +0300, Serge Semin wrote:
    > DW eDMA doesn't perform any translation of the traffic generated on the
    > CPU/Application side. It just generates read/write AXI-bus requests with
    > the specified addresses. But in case if the dma-ranges DT-property is
    > specified for a platform device node, Linux will use it to map the CPU
    > memory regions into the DMAable bus ranges. This isn't what we want for
    > the eDMA embedded into the locally accessed DW PCIe Root Port and
    > End-point. In order to work that around let's set the chan_dma_dev flag
    > for each DW eDMA channel thus forcing the client drivers to getting a
    > custom dma-ranges-less parental device for the mappings.
    >
    > Note it will only work for the client drivers using the
    > dmaengine_get_dma_device() method to get the parental DMA device.
    >
    > Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>

    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

    Thanks,
    Mani

    >
    > ---
    >
    > Changelog v2:
    > - Fix the comment a bit to being clearer. (@Manivannan)
    >
    > Changelog v3:
    > - Conditionally set dchan->dev->device.dma_coherent field since it can
    > be missing on some platforms. (@Manivannan)
    > - Remove Manivannan' rb and tb tags since the patch content has been
    > changed.
    > ---
    > drivers/dma/dw-edma/dw-edma-core.c | 20 ++++++++++++++++++++
    > 1 file changed, 20 insertions(+)
    >
    > diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c
    > index 6a8282eaebaf..4f56149dc8d8 100644
    > --- a/drivers/dma/dw-edma/dw-edma-core.c
    > +++ b/drivers/dma/dw-edma/dw-edma-core.c
    > @@ -716,6 +716,26 @@ static int dw_edma_alloc_chan_resources(struct dma_chan *dchan)
    > if (chan->status != EDMA_ST_IDLE)
    > return -EBUSY;
    >
    > + /* Bypass the dma-ranges based memory regions mapping for the eDMA
    > + * controlled from the CPU/Application side since in that case
    > + * the local memory address is left untranslated.
    > + */
    > + if (chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) {
    > + dchan->dev->chan_dma_dev = true;
    > +
    > +#if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \
    > + defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) || \
    > + defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
    > + dchan->dev->device.dma_coherent = chan->dw->chip->dev->dma_coherent;
    > +#endif
    > +
    > + dma_coerce_mask_and_coherent(&dchan->dev->device,
    > + dma_get_mask(chan->dw->chip->dev));
    > + dchan->dev->device.dma_parms = chan->dw->chip->dev->dma_parms;
    > + } else {
    > + dchan->dev->chan_dma_dev = false;
    > + }
    > +
    > pm_runtime_get(chan->dw->chip->dev);
    >
    > return 0;
    > --
    > 2.35.1
    >

    --
    மணிவண்ணன் சதாசிவம்

    \
     
     \ /
      Last update: 2022-07-09 10:31    [W:3.337 / U:0.536 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site