Thread (3 messages) 3 messages, 2 authors, 2021-06-28

RE: [PATCH v4] serial: samsung: use dma_ops of DMA if attached

From: M Tamseel Shams <hidden>
Date: 2021-06-28 13:44:01
Also in: linux-samsung-soc, linux-serial, lkml

quoted
When DMA is used for TX and RX by serial driver, it should pass the
DMA device pointer to DMA API instead of UART device pointer. DMA
device should be used for DMA API because only the DMA device is aware
of how the device connects to the memory.
There might be an extra level of address translation due to a SMMU
attached to the DMA device. When serial device is used for DMA API,
the DMA API will have no clue of the SMMU attached to the DMA device.

This patch is necessary to fix the SMMU page faults which is observed
when a DMA(with SMMU enabled) is attached to UART for transfer.

Signed-off-by: Tamseel Shams <redacted>
Signed-off-by: Ajay Kumar <redacted>
---
Changes since v1:
1. Rebased the patch on "tty-next" branch of TTY driver tree

Changes since v2:
1. Updated the commit message.
2. Changed the comment description

Changes since v3:
1. Removed the null pointer check for "dma", "dma->tx_chan" and
"dma->rx_chan" and instead sending DMA device pointer while calling
DMA API.

 drivers/tty/serial/samsung_tty.c | 32
++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/tty/serial/samsung_tty.c
b/drivers/tty/serial/samsung_tty.c
index 9fbc61151c2e..fa30aa20a13f 100644
--- a/drivers/tty/serial/samsung_tty.c
+++ b/drivers/tty/serial/samsung_tty.c
@@ -305,7 +305,7 @@ static void s3c24xx_serial_stop_tx(struct uart_port
*port)
quoted
 		dmaengine_pause(dma->tx_chan);
 		dmaengine_tx_status(dma->tx_chan, dma->tx_cookie, &state);
 		dmaengine_terminate_all(dma->tx_chan);
-		dma_sync_single_for_cpu(ourport->port.dev,
+		dma_sync_single_for_cpu(dma->tx_chan->device->dev,
 			dma->tx_transfer_addr, dma->tx_size,
DMA_TO_DEVICE);
quoted
 		async_tx_ack(dma->tx_desc);
 		count = dma->tx_bytes_requested - state.residue; @@ -338,8
+338,8
quoted
@@ static void s3c24xx_serial_tx_dma_complete(void *args)
 	count = dma->tx_bytes_requested - state.residue;
 	async_tx_ack(dma->tx_desc);

-	dma_sync_single_for_cpu(ourport->port.dev, dma->tx_transfer_addr,
-				dma->tx_size, DMA_TO_DEVICE);
+	dma_sync_single_for_cpu(dma->tx_chan->device->dev,
+			dma->tx_transfer_addr, dma->tx_size,
DMA_TO_DEVICE);

Looks like alignment is broken here. However even if the line was not aligned
before, please fix it up now - align the arguments like checkpatch suggests.

This applies to other places as well. Thanks.

Best regards,
Krzysztof
Hi Krzysztof,
Will fix the alignments in the next version.

Thanks & Regards,
Tamseel Shams


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help