dmaengine: sun6i: Set the maximum segment size
authorSamuel Holland <samuel@sholland.org>
Sun, 1 Jan 2023 19:36:04 +0000 (13:36 -0600)
committerVinod Koul <vkoul@kernel.org>
Wed, 18 Jan 2023 12:07:39 +0000 (17:37 +0530)
The sun6i DMA engine supports segment sizes up to 2^25-1 bytes. This is
explicitly stated in newer SoC documentation (H6, D1), and it is implied
in older documentation by the 25-bit width of the "bytes left in the
current segment" register field.

Exposing the real segment size limit (instead of the 64k default)
reduces the number of SG list segments needed for a transaction.

Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Samuel Holland <samuel@sholland.org>
Link: https://lore.kernel.org/r/20230101193605.50285-1-samuel@sholland.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/sun6i-dma.c

index b7557f43793620de475776b6ca7788d4769bb274..30667d251e978c24bc60a61d2aedd43c6ae1c410 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <linux/clk.h>
 #include <linux/delay.h>
+#include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 #include <linux/dmapool.h>
 #include <linux/interrupt.h>
@@ -1334,6 +1335,8 @@ static int sun6i_dma_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&sdc->pending);
        spin_lock_init(&sdc->lock);
 
+       dma_set_max_seg_size(&pdev->dev, SZ_32M - 1);
+
        dma_cap_set(DMA_PRIVATE, sdc->slave.cap_mask);
        dma_cap_set(DMA_MEMCPY, sdc->slave.cap_mask);
        dma_cap_set(DMA_SLAVE, sdc->slave.cap_mask);