Thread (3 messages) 3 messages, 3 authors, 2018-09-14

[RFC] dmaengine: rcar-dmac: set scatter/gather max segment size

From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2018-09-14 17:28:13
Also in: linux-renesas-soc

Hi Wolfram,

On Thu, Sep 13, 2018 at 4:53 PM Wolfram Sang
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
Fix warning when running with CONFIG_DMA_API_DEBUG_SG=y by allocating a
device_dma_parameters structure and filling in the max segment size.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
---

According to this discussion [1], this is the intended way of setting
dma_parms. I am not 100% sure about the value, though. I took the maximum value
of the DMA Transfer Count Registers which is 16M. I'd think the real maximum
needs to be multiplied with the data length which is varying, though? Geert,
what do you think?

[1] https://www.spinics.net/lists/iommu/msg29861.html

 drivers/dma/sh/rcar-dmac.c | 3 +++
 1 file changed, 3 insertions(+)
diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
index 48ee35e2bce6..bb3631f6c41c 100644
--- a/drivers/dma/sh/rcar-dmac.c
+++ b/drivers/dma/sh/rcar-dmac.c
@@ -198,6 +198,7 @@ struct rcar_dmac {
        struct dma_device engine;
        struct device *dev;
        void __iomem *iomem;
+       struct device_dma_parameters parms;

        unsigned int n_channels;
        struct rcar_dmac_chan *channels;
@@ -1792,6 +1793,8 @@ static int rcar_dmac_probe(struct platform_device *pdev)

        dmac->dev = &pdev->dev;
        platform_set_drvdata(pdev, dmac);
+       dmac->dev->dma_parms = &dmac->parms;
+       dma_set_max_seg_size(dmac->dev, 0x01000000);
That is one too much, cfr.

    drivers/dma/sh/rcar-dmac.c:#define RCAR_DMATCR_MASK             0x00ffffff

And commit d716d9b702bb759d ("dmaengine: rcar-dmac: fix max_chunk_size for
R-Car Gen3"), which did:

-       max_chunk_size = (RCAR_DMATCR_MASK + 1) << desc->xfer_shift;
+       max_chunk_size = RCAR_DMATCR_MASK << desc->xfer_shift;

And yes, this depends on the data length, which is not known at probe time.
Of course, dma_set_max_seg_size(dmac->dev, RCAR_DMATCR_MASK)
should be safe, albeit (slightly) suboptimal.
But I doubt anyone is really doing such large transfers (up to
(16 Mi - 1) * 64 bytes!).
        dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40));

        ret = rcar_dmac_parse_of(&pdev->dev, dmac);
Gr{oetje,eeting}s,

                        Geert
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help