linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/2] dmaengine: core/omap-dma: Support for port window
@ 2016-11-29 14:23 Peter Ujfalusi
  2016-11-29 14:23 ` [PATCH v3 1/2] dmaengine: dma_slave_config: add support for slave " Peter Ujfalusi
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Peter Ujfalusi @ 2016-11-29 14:23 UTC (permalink / raw)
  To: vinod.koul, dan.j.williams, tony, linux
  Cc: dmaengine, linux-kernel, linux-omap, arnd

Hi,

Changes since v2:
- the src/dst_port_window_size is in words, not in bytes (comment updated)
- correct the port_window based configuration in the omap-dma driver

Changes since v1:
- Make sure that the one frame covers the port_window (burst = port_window)
- added comment to explain the double indexed setup to cover the port_window
- Simplifications for the code mentioned by Russell and Vinod

Cover letter from v1:

as I'm trying to convert the remaining OMAP driver to use DMAengine instead of
the legacy omap-dma API I have encountered with the
drivers/usb/musb/tusb6010_omap.c driver.

The TUSB6010 is connected via NOR FLASH interface and it's register space is
mapped in the GPMC memory area. In OMAP SoCs we have support for external DMA
request lines and the TUSB6010 is using those as well.

With asynchronous access the DMA needs to read/write within the FIFO 'window' in
incremental address mode to read/write data.
The constant addressing only works in synchronous mode.

Since the DMA is driven by external DMA requests, the asynchronous mode is also
slave DMA operation, but currently the port window can not be 'swiped' as the
DMAengine only supports single register/address on the slave side.

This series will add support in dma_slave_config to specify the port side window
size and the second patch implements the setup needs in omap-dma driver for such
a transfer.

Regards,
Peter
---
Peter Ujfalusi (2):
  dmaengine: dma_slave_config: add support for slave port window
  dmaengine: omap-dma: Support for slave devices with data port window

 drivers/dma/omap-dma.c    | 63 +++++++++++++++++++++++++++++++++++++++++++++--
 include/linux/dmaengine.h |  8 ++++++
 2 files changed, 69 insertions(+), 2 deletions(-)

-- 
2.11.0.rc2

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v3 1/2] dmaengine: dma_slave_config: add support for slave port window
  2016-11-29 14:23 [PATCH v3 0/2] dmaengine: core/omap-dma: Support for port window Peter Ujfalusi
@ 2016-11-29 14:23 ` Peter Ujfalusi
  2016-11-29 14:23 ` [PATCH v3 2/2] dmaengine: omap-dma: Support for slave devices with data " Peter Ujfalusi
  2016-11-30  3:24 ` [PATCH v3 0/2] dmaengine: core/omap-dma: Support for " Vinod Koul
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Ujfalusi @ 2016-11-29 14:23 UTC (permalink / raw)
  To: vinod.koul, dan.j.williams, tony, linux
  Cc: dmaengine, linux-kernel, linux-omap, arnd

Some slave devices uses address window instead of single register for read
and/or write of data. With the src/dst_port_window_size the address window
can be specified and the DMAengine driver should use this information to
correctly set up the transfer to loop within the provided window.

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

diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
index cc535a478bae..feee6ec6a13b 100644
--- a/include/linux/dmaengine.h
+++ b/include/linux/dmaengine.h
@@ -336,6 +336,12 @@ enum dma_slave_buswidth {
  * may or may not be applicable on memory sources.
  * @dst_maxburst: same as src_maxburst but for destination target
  * mutatis mutandis.
+ * @src_port_window_size: The length of the register area in words the data need
+ * to be accessed on the device side. It is only used for devices which is using
+ * an area instead of a single register to receive the data. Typically the DMA
+ * loops in this area in order to transfer the data.
+ * @dst_port_window_size: same as src_port_window_size but for the destination
+ * port.
  * @device_fc: Flow Controller Settings. Only valid for slave channels. Fill
  * with 'true' if peripheral should be flow controller. Direction will be
  * selected at Runtime.
@@ -363,6 +369,8 @@ struct dma_slave_config {
 	enum dma_slave_buswidth dst_addr_width;
 	u32 src_maxburst;
 	u32 dst_maxburst;
+	u32 src_port_window_size;
+	u32 dst_port_window_size;
 	bool device_fc;
 	unsigned int slave_id;
 };
-- 
2.11.0.rc2

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] dmaengine: omap-dma: Support for slave devices with data port window
  2016-11-29 14:23 [PATCH v3 0/2] dmaengine: core/omap-dma: Support for port window Peter Ujfalusi
  2016-11-29 14:23 ` [PATCH v3 1/2] dmaengine: dma_slave_config: add support for slave " Peter Ujfalusi
@ 2016-11-29 14:23 ` Peter Ujfalusi
  2016-11-30  3:24 ` [PATCH v3 0/2] dmaengine: core/omap-dma: Support for " Vinod Koul
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Ujfalusi @ 2016-11-29 14:23 UTC (permalink / raw)
  To: vinod.koul, dan.j.williams, tony, linux
  Cc: dmaengine, linux-kernel, linux-omap, arnd

Based on the src/dst_port_window_size - if it is set - configure the DMA
channel to use double indexing in order to be able to loop within the
address window.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/dma/omap-dma.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 61 insertions(+), 2 deletions(-)

diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c
index 15eb8024666b..ac68666cd3f4 100644
--- a/drivers/dma/omap-dma.c
+++ b/drivers/dma/omap-dma.c
@@ -166,6 +166,9 @@ enum {
 	CSDP_DST_BURST_16	= 1 << 14,
 	CSDP_DST_BURST_32	= 2 << 14,
 	CSDP_DST_BURST_64	= 3 << 14,
+	CSDP_WRITE_NON_POSTED	= 0 << 16,
+	CSDP_WRITE_POSTED	= 1 << 16,
+	CSDP_WRITE_LAST_NON_POSTED = 2 << 16,
 
 	CICR_TOUT_IE		= BIT(0),	/* OMAP1 only */
 	CICR_DROP_IE		= BIT(1),
@@ -881,15 +884,18 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
 	unsigned i, es, en, frame_bytes;
 	bool ll_failed = false;
 	u32 burst;
+	u32 port_window, port_window_bytes;
 
 	if (dir == DMA_DEV_TO_MEM) {
 		dev_addr = c->cfg.src_addr;
 		dev_width = c->cfg.src_addr_width;
 		burst = c->cfg.src_maxburst;
+		port_window = c->cfg.src_port_window_size;
 	} else if (dir == DMA_MEM_TO_DEV) {
 		dev_addr = c->cfg.dst_addr;
 		dev_width = c->cfg.dst_addr_width;
 		burst = c->cfg.dst_maxburst;
+		port_window = c->cfg.dst_port_window_size;
 	} else {
 		dev_err(chan->device->dev, "%s: bad direction?\n", __func__);
 		return NULL;
@@ -910,6 +916,12 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
 		return NULL;
 	}
 
+	/* When the port_window is used, one frame must cover the window */
+	if (port_window) {
+		burst = port_window;
+		port_window_bytes = port_window * es_bytes[es];
+	}
+
 	/* Now allocate and setup the descriptor. */
 	d = kzalloc(sizeof(*d) + sglen * sizeof(d->sg[0]), GFP_ATOMIC);
 	if (!d)
@@ -921,11 +933,45 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
 
 	d->ccr = c->ccr | CCR_SYNC_FRAME;
 	if (dir == DMA_DEV_TO_MEM) {
-		d->ccr |= CCR_DST_AMODE_POSTINC | CCR_SRC_AMODE_CONSTANT;
 		d->csdp = CSDP_DST_BURST_64 | CSDP_DST_PACKED;
+
+		d->ccr |= CCR_DST_AMODE_POSTINC;
+		if (port_window) {
+			d->ccr |= CCR_SRC_AMODE_DBLIDX;
+			d->ei = 1;
+			/*
+			 * One frame covers the port_window and by  configure
+			 * the source frame index to be -1 * (port_window - 1)
+			 * we instruct the sDMA that after a frame is processed
+			 * it should move back to the start of the window.
+			 */
+			d->fi = -(port_window_bytes - 1);
+
+			if (port_window_bytes >= 64)
+				d->csdp = CSDP_SRC_BURST_64 | CSDP_SRC_PACKED;
+			else if (port_window_bytes >= 32)
+				d->csdp = CSDP_SRC_BURST_32 | CSDP_SRC_PACKED;
+			else if (port_window_bytes >= 16)
+				d->csdp = CSDP_SRC_BURST_16 | CSDP_SRC_PACKED;
+		} else {
+			d->ccr |= CCR_SRC_AMODE_CONSTANT;
+		}
 	} else {
-		d->ccr |= CCR_DST_AMODE_CONSTANT | CCR_SRC_AMODE_POSTINC;
 		d->csdp = CSDP_SRC_BURST_64 | CSDP_SRC_PACKED;
+
+		d->ccr |= CCR_SRC_AMODE_POSTINC;
+		if (port_window) {
+			d->ccr |= CCR_DST_AMODE_DBLIDX;
+
+			if (port_window_bytes >= 64)
+				d->csdp = CSDP_DST_BURST_64 | CSDP_DST_PACKED;
+			else if (port_window_bytes >= 32)
+				d->csdp = CSDP_DST_BURST_32 | CSDP_DST_PACKED;
+			else if (port_window_bytes >= 16)
+				d->csdp = CSDP_DST_BURST_16 | CSDP_DST_PACKED;
+		} else {
+			d->ccr |= CCR_DST_AMODE_CONSTANT;
+		}
 	}
 
 	d->cicr = CICR_DROP_IE | CICR_BLOCK_IE;
@@ -943,6 +989,9 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
 			d->ccr |= CCR_TRIGGER_SRC;
 
 		d->cicr |= CICR_MISALIGNED_ERR_IE | CICR_TRANS_ERR_IE;
+
+		if (port_window)
+			d->csdp |= CSDP_WRITE_LAST_NON_POSTED;
 	}
 	if (od->plat->errata & DMA_ERRATA_PARALLEL_CHANNELS)
 		d->clnk_ctrl = c->dma_ch;
@@ -968,6 +1017,16 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
 		osg->addr = sg_dma_address(sgent);
 		osg->en = en;
 		osg->fn = sg_dma_len(sgent) / frame_bytes;
+		if (port_window && dir == DMA_MEM_TO_DEV) {
+			osg->ei = 1;
+			/*
+			 * One frame covers the port_window and by  configure
+			 * the source frame index to be -1 * (port_window - 1)
+			 * we instruct the sDMA that after a frame is processed
+			 * it should move back to the start of the window.
+			 */
+			osg->fi = -(port_window_bytes - 1);
+		}
 
 		if (d->using_ll) {
 			osg->t2_desc = dma_pool_alloc(od->desc_pool, GFP_ATOMIC,
-- 
2.11.0.rc2

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 0/2] dmaengine: core/omap-dma: Support for port window
  2016-11-29 14:23 [PATCH v3 0/2] dmaengine: core/omap-dma: Support for port window Peter Ujfalusi
  2016-11-29 14:23 ` [PATCH v3 1/2] dmaengine: dma_slave_config: add support for slave " Peter Ujfalusi
  2016-11-29 14:23 ` [PATCH v3 2/2] dmaengine: omap-dma: Support for slave devices with data " Peter Ujfalusi
@ 2016-11-30  3:24 ` Vinod Koul
  2 siblings, 0 replies; 4+ messages in thread
From: Vinod Koul @ 2016-11-30  3:24 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: dan.j.williams, tony, linux, dmaengine, linux-kernel, linux-omap, arnd

On Tue, Nov 29, 2016 at 04:23:40PM +0200, Peter Ujfalusi wrote:
> Hi,
> 
> Changes since v2:
> - the src/dst_port_window_size is in words, not in bytes (comment updated)
> - correct the port_window based configuration in the omap-dma driver
> 
> Changes since v1:
> - Make sure that the one frame covers the port_window (burst = port_window)
> - added comment to explain the double indexed setup to cover the port_window
> - Simplifications for the code mentioned by Russell and Vinod
> 
> Cover letter from v1:
> 
> as I'm trying to convert the remaining OMAP driver to use DMAengine instead of
> the legacy omap-dma API I have encountered with the
> drivers/usb/musb/tusb6010_omap.c driver.
> 
> The TUSB6010 is connected via NOR FLASH interface and it's register space is
> mapped in the GPMC memory area. In OMAP SoCs we have support for external DMA
> request lines and the TUSB6010 is using those as well.
> 
> With asynchronous access the DMA needs to read/write within the FIFO 'window' in
> incremental address mode to read/write data.
> The constant addressing only works in synchronous mode.
> 
> Since the DMA is driven by external DMA requests, the asynchronous mode is also
> slave DMA operation, but currently the port window can not be 'swiped' as the
> DMAengine only supports single register/address on the slave side.
> 
> This series will add support in dma_slave_config to specify the port side window
> size and the second patch implements the setup needs in omap-dma driver for such
> a transfer.

Applied both, thanks

-- 
~Vinod

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-11-30  3:14 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-29 14:23 [PATCH v3 0/2] dmaengine: core/omap-dma: Support for port window Peter Ujfalusi
2016-11-29 14:23 ` [PATCH v3 1/2] dmaengine: dma_slave_config: add support for slave " Peter Ujfalusi
2016-11-29 14:23 ` [PATCH v3 2/2] dmaengine: omap-dma: Support for slave devices with data " Peter Ujfalusi
2016-11-30  3:24 ` [PATCH v3 0/2] dmaengine: core/omap-dma: Support for " Vinod Koul

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).