Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1558086 > unrolled thread

[PATCH 0/3] tty: serial: 8250_omap: Enable DMA support

Started byVignesh R <vigneshr@ti.com>
First post2017-01-13 09:10 +0100
Last post2017-01-13 19:30 +0100
Articles 5 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 0/3] tty: serial: 8250_omap: Enable DMA support Vignesh R <vigneshr@ti.com> - 2017-01-13 09:10 +0100
    [PATCH 2/3] tty: serial: 8250_omap: Add OMAP_DMA_TX_KICK quirk for AM437x Vignesh R <vigneshr@ti.com> - 2017-01-13 09:10 +0100
    [PATCH 1/3] serial: 8250: omap: pause DMA only if DMA transfer in progress Vignesh R <vigneshr@ti.com> - 2017-01-13 09:10 +0100
    [PATCH 3/3] tty: serial: 8250_omap: Remove rx_dma_broken flag Vignesh R <vigneshr@ti.com> - 2017-01-13 09:10 +0100
    Re: [PATCH 0/3] tty: serial: 8250_omap: Enable DMA support Tony Lindgren <tony@atomide.com> - 2017-01-13 19:30 +0100

#1558086 — [PATCH 0/3] tty: serial: 8250_omap: Enable DMA support

FromVignesh R <vigneshr@ti.com>
Date2017-01-13 09:10 +0100
Subject[PATCH 0/3] tty: serial: 8250_omap: Enable DMA support
Message-ID<sZ55T-6Ta-1@gated-at.bofh.it>
This patch series re enables DMA support for UART 8250_omap driver.

Tested on AM335x, AM437x that use EDMA and OMAP5 and DRA74 EVM with
SDMA.

Vignesh R (3):
  serial :8250: omap: pause DMA only if DMA transfer in progress
  tty: serial: 8250_omap: Add OMAP_DMA_TX_KICK quirk for AM437x
  tty: serial: 8250_omap: Remove rx_dma_broken flag

 drivers/tty/serial/8250/8250_omap.c | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

-- 
2.11.0

[toc] | [next] | [standalone]


#1558091 — [PATCH 2/3] tty: serial: 8250_omap: Add OMAP_DMA_TX_KICK quirk for AM437x

FromVignesh R <vigneshr@ti.com>
Date2017-01-13 09:10 +0100
Subject[PATCH 2/3] tty: serial: 8250_omap: Add OMAP_DMA_TX_KICK quirk for AM437x
Message-ID<sZ55V-6Ta-37@gated-at.bofh.it>
In reply to#1558086
UART uses as EDMA as dma engine on AM437x SoC and therefore, requires
OMAP_DMA_TX_KICK quirk just like AM33xx. So, enable OMAP_DMA_TX_KICK
quirk for AM437x platform as well. While at that, drop use of
of_machine_is_compatible() and instead pass quirks via device data.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 drivers/tty/serial/8250/8250_omap.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
index 4ad1934ef6ed..97766dcd67d4 100644
--- a/drivers/tty/serial/8250/8250_omap.c
+++ b/drivers/tty/serial/8250/8250_omap.c
@@ -1078,15 +1078,15 @@ static int omap8250_no_handle_irq(struct uart_port *port)
 }
 
 static const u8 am3352_habit = OMAP_DMA_TX_KICK | UART_ERRATA_CLOCK_DISABLE;
-static const u8 am4372_habit = UART_ERRATA_CLOCK_DISABLE;
+static const u8 dra742_habit = UART_ERRATA_CLOCK_DISABLE;
 
 static const struct of_device_id omap8250_dt_ids[] = {
 	{ .compatible = "ti,omap2-uart" },
 	{ .compatible = "ti,omap3-uart" },
 	{ .compatible = "ti,omap4-uart" },
 	{ .compatible = "ti,am3352-uart", .data = &am3352_habit, },
-	{ .compatible = "ti,am4372-uart", .data = &am4372_habit, },
-	{ .compatible = "ti,dra742-uart", .data = &am4372_habit, },
+	{ .compatible = "ti,am4372-uart", .data = &am3352_habit, },
+	{ .compatible = "ti,dra742-uart", .data = &dra742_habit, },
 	{},
 };
 MODULE_DEVICE_TABLE(of, omap8250_dt_ids);
@@ -1221,9 +1221,6 @@ static int omap8250_probe(struct platform_device *pdev)
 			priv->omap8250_dma.rx_size = RX_TRIGGER;
 			priv->omap8250_dma.rxconf.src_maxburst = RX_TRIGGER;
 			priv->omap8250_dma.txconf.dst_maxburst = TX_TRIGGER;
-
-			if (of_machine_is_compatible("ti,am33xx"))
-				priv->habit |= OMAP_DMA_TX_KICK;
 			/*
 			 * pause is currently not supported atleast on omap-sdma
 			 * and edma on most earlier kernels.
-- 
2.11.0

[toc] | [prev] | [next] | [standalone]


#1558093 — [PATCH 1/3] serial: 8250: omap: pause DMA only if DMA transfer in progress

FromVignesh R <vigneshr@ti.com>
Date2017-01-13 09:10 +0100
Subject[PATCH 1/3] serial: 8250: omap: pause DMA only if DMA transfer in progress
Message-ID<sZ55V-6Ta-43@gated-at.bofh.it>
In reply to#1558086
It is possible that DMA transfer is already complete but, completion
handler is yet to be called, when dmaengine_pause() is called in case of
error condition(like break/rx timeout). This leads to dmaengine_pause()
API to return EINVAL (as descriptor is already NULL) causing
rx_dma_broken flag to be set and effectively disabling RX DMA.
Fix this by calling dmaengine_pause() only when transfer is in progress.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 drivers/tty/serial/8250/8250_omap.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
index 61ad6c3b20a0..4ad1934ef6ed 100644
--- a/drivers/tty/serial/8250/8250_omap.c
+++ b/drivers/tty/serial/8250/8250_omap.c
@@ -790,6 +790,7 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
 {
 	struct omap8250_priv	*priv = p->port.private_data;
 	struct uart_8250_dma	*dma = p->dma;
+	struct dma_tx_state     state;
 	unsigned long		flags;
 	int ret;
 
@@ -800,10 +801,12 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
 		return;
 	}
 
-	ret = dmaengine_pause(dma->rxchan);
-	if (WARN_ON_ONCE(ret))
-		priv->rx_dma_broken = true;
-
+	ret = dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
+	if (ret == DMA_IN_PROGRESS) {
+		ret = dmaengine_pause(dma->rxchan);
+		if (WARN_ON_ONCE(ret))
+			priv->rx_dma_broken = true;
+	}
 	spin_unlock_irqrestore(&priv->rx_dma_lock, flags);
 
 	__dma_rx_do_complete(p);
-- 
2.11.0

[toc] | [prev] | [next] | [standalone]


#1558094 — [PATCH 3/3] tty: serial: 8250_omap: Remove rx_dma_broken flag

FromVignesh R <vigneshr@ti.com>
Date2017-01-13 09:10 +0100
Subject[PATCH 3/3] tty: serial: 8250_omap: Remove rx_dma_broken flag
Message-ID<sZ55V-6Ta-35@gated-at.bofh.it>
In reply to#1558086
8250 UART DMA support was marked broken by default as it was not
possible to pause ongoing RX DMA transfer. Now that both SDMA and
EDMA can support pause operation for RX DMA transactions, don't set
rx_dma_broken to true by default. With this patch 8250_omap driver will
use DMA by default.

Signed-off-by: Vignesh R <vigneshr@ti.com>
---
 drivers/tty/serial/8250/8250_omap.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
index 97766dcd67d4..68a6393d9636 100644
--- a/drivers/tty/serial/8250/8250_omap.c
+++ b/drivers/tty/serial/8250/8250_omap.c
@@ -1221,11 +1221,6 @@ static int omap8250_probe(struct platform_device *pdev)
 			priv->omap8250_dma.rx_size = RX_TRIGGER;
 			priv->omap8250_dma.rxconf.src_maxburst = RX_TRIGGER;
 			priv->omap8250_dma.txconf.dst_maxburst = TX_TRIGGER;
-			/*
-			 * pause is currently not supported atleast on omap-sdma
-			 * and edma on most earlier kernels.
-			 */
-			priv->rx_dma_broken = true;
 		}
 	}
 #endif
-- 
2.11.0

[toc] | [prev] | [next] | [standalone]


#1558664

FromTony Lindgren <tony@atomide.com>
Date2017-01-13 19:30 +0100
Message-ID<sZeLT-4cm-23@gated-at.bofh.it>
In reply to#1558086
* Vignesh R <vigneshr@ti.com> [170113 00:03]:
> This patch series re enables DMA support for UART 8250_omap driver.
> 
> Tested on AM335x, AM437x that use EDMA and OMAP5 and DRA74 EVM with
> SDMA.

Is 8250_omap serial console working for you on omap5 in general?

I've noticed that it's really unresponsive for me as if the FIFO
interrupt was not working. For example logging in might take several
attempts and a long time with each character showing up much later
after some timeout.

TX on the uart on omap5 seems to work OK, I do see all the console
messages fine. And these patches do not make the issue better or
worse.

Regards,

Tony

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web