Thread (23 messages) 23 messages, 3 authors, 2018-07-11

[PATCH v1 1/4] dmaengine: imx-sdma: add memcpy interface

From: Robin Gong <hidden>
Date: 2018-07-11 07:05:34
Also in: dmaengine, lkml

-----Original Message-----
From: Sascha Hauer [mailto:s.hauer at pengutronix.de]
Sent: 2018?7?11? 15:01
To: Robin Gong <redacted>
Cc: vkoul at kernel.org; dan.j.williams at intel.com; shawnguo at kernel.org; Fabio
Estevam [off-list ref]; linux at armlinux.org.uk;
linux-arm-kernel at lists.infradead.org; kernel at pengutronix.de;
dmaengine at vger.kernel.org; linux-kernel at vger.kernel.org; dl-linux-imx
[off-list ref]
Subject: Re: [PATCH v1 1/4] dmaengine: imx-sdma: add memcpy interface

On Wed, Jul 11, 2018 at 06:56:18AM +0000, Robin Gong wrote:
quoted
quoted
-----Original Message-----
From: Sascha Hauer [mailto:s.hauer at pengutronix.de]
Sent: 2018?7?11? 14:25
To: Robin Gong <redacted>
Cc: vkoul at kernel.org; dan.j.williams at intel.com; shawnguo at kernel.org;
Fabio Estevam [off-list ref]; linux at armlinux.org.uk;
linux-arm-kernel at lists.infradead.org; kernel at pengutronix.de;
dmaengine at vger.kernel.org; linux-kernel at vger.kernel.org;
dl-linux-imx [off-list ref]
Subject: Re: [PATCH v1 1/4] dmaengine: imx-sdma: add memcpy
interface

On Wed, Jul 11, 2018 at 12:23:10AM +0800, Robin Gong wrote:
quoted
Add MEMCPY support, meanwhile, add SDMA_BD_MAX_CNT instead of
'0xffff'.

Signed-off-by: Robin Gong <redacted>
---
+static struct dma_async_tx_descriptor *sdma_prep_memcpy(
+		struct dma_chan *chan, dma_addr_t dma_dst,
+		dma_addr_t dma_src, size_t len, unsigned long flags) {
+	struct sdma_channel *sdmac = to_sdma_chan(chan);
+	struct sdma_engine *sdma = sdmac->sdma;
+	int channel = sdmac->channel;
+	size_t count;
+	int i = 0, param;
+	struct sdma_buffer_descriptor *bd;
+	struct sdma_desc *desc;
+
+	if (!chan || !len)
+		return NULL;
+
+	dev_dbg(sdma->dev, "memcpy: %pad->%pad, len=%zu,
channel=%d.\n",
quoted
quoted
quoted
+		&dma_src, &dma_dst, len, channel);
+
+	desc = sdma_transfer_init(sdmac, DMA_MEM_TO_MEM, len /
SDMA_BD_MAX_CNT
quoted
+					+ 1);
+	if (!desc)
+		goto err_out;
+
+	do {
+		count = min_t(size_t, len, SDMA_BD_MAX_CNT);
When len is bigger than 0xffff you initialize count to 0xffff...
In this case, the data will be split into several bds, for example, If
the total count is 0x10000, two bd used then. One is for 0xffff,
Another is for the last 1
And you are doing byte size DMA? Wouldn't word size accesses be more
optimal?

Sascha
Default is words, and I'll force the buswidth to word and set into BD.
sdma->dma_device.copy_align = DMAENGINE_ALIGN_4_BYTES;

--
Pengutronix e.K.                           |
|
Industrial Linux Solutions                 |
https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.
pengutronix.de%2F&amp;data=02%7C01%7Cyibin.gong%40nxp.com%7C41fbd
3765b10424a7f1e08d5e6fc196d%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C
0%7C0%7C636668892793035822&amp;sdata=mLKjTKaojuO1Zv%2F4ohwkkzeK
FDFbmqYturqh6eSblIM%3D&amp;reserved=0  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:
+49-5121-206917-5555 |
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help