diff mbox series

[4/4] dma: ti: k3-udma: Move DMA channel[0] allocation to probe and add udma_remove()

Message ID 20241004132057.1449909-5-p-mantena@ti.com
State New
Delegated to: Tom Rini
Headers show
Series Cleanup dma device in spl and move dma channel[0] | expand

Commit Message

Prasanth Babu Mantena Oct. 4, 2024, 1:20 p.m. UTC
From: Santhosh Kumar K <s-k6@ti.com>

Currently, the allocation of DMA channel[0] for memcpy is happening
in udma_transfer() for every transfer, which leads to a huge overhead
for each transfer, especially in case of nand page reads. So, move this
allocation to udma_probe(), as a result, the allocation is done once
during probe.

Introduce udma_remove() for the cleanup of allocated channel during
probe.

Signed-off-by: Santhosh Kumar K <s-k6@ti.com>
Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
---
 drivers/dma/ti/k3-udma.c | 64 ++++++++++++++++++++++++----------------
 1 file changed, 39 insertions(+), 25 deletions(-)

Comments

Kumar, Udit Oct. 4, 2024, 2:44 p.m. UTC | #1
On 10/4/2024 6:50 PM, Prasanth Babu Mantena wrote:
> From: Santhosh Kumar K <s-k6@ti.com>
>
> Currently, the allocation of DMA channel[0] for memcpy is happening
> in udma_transfer() for every transfer, which leads to a huge overhead
> for each transfer, especially in case of nand page reads. So, move this

> [..]
>   
> @@ -2590,6 +2565,7 @@ static int udma_probe(struct udevice *dev)
>   	struct udevice *tmp;
>   	struct udevice *tisci_dev = NULL;
>   	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
> +	struct udma_chan *uc;
>   	ofnode navss_ofnode = ofnode_get_parent(dev_ofnode(dev));
>   
>   	ud->match_data = (void *)dev_get_driver_data(dev);
> @@ -2714,6 +2690,42 @@ static int udma_probe(struct udevice *dev)
>   
>   	uc_priv->supported = DMA_SUPPORTS_MEM_TO_MEM | DMA_SUPPORTS_MEM_TO_DEV;
>   
> +	uc = &ud->channels[0];
> +	switch (ud->match_data->type) {
> +	case DMA_TYPE_UDMA:
> +		ret = udma_alloc_chan_resources(uc);
> +		break;
> +	case DMA_TYPE_BCDMA:
> +		ret = bcdma_alloc_chan_resources(uc);
> +		break;
> +	default:
> +		return -EINVAL;

shouldn't we treat this default case as error and do some dev_err prints ?


> +	};
> +
> +	if (ret) {
> +		dev_err(dev, " Channel 0 allocation failure %d\n", ret);
> +		return ret;

No need of this ret


> +	}
> +
> +	return 0;


do 'return ret' here


> +}
> +
> +static int udma_remove(struct udevice *dev)
> +{
> +	struct udma_dev *ud = dev_get_priv(dev);
> +	struct udma_chan *uc = &ud->channels[0];
> +
> +	switch (ud->match_data->type) {
> +	case DMA_TYPE_UDMA:
> +		udma_free_chan_resources(uc);
> +		break;
> +	case DMA_TYPE_BCDMA:
> +		bcdma_free_bchan_resources(uc);
> +		break;
> +	default:
> +		return -EINVAL;

shouldn't we treat this default case as error and do some dev_err prints ?


> +	};
> +
>   	return 0;
>   }
>   
> @@ -2855,5 +2867,7 @@ U_BOOT_DRIVER(ti_edma3) = {
>   	.of_match = udma_ids,
>   	.ops	= &udma_ops,
>   	.probe	= udma_probe,
> +	.remove = udma_remove,
>   	.priv_auto	= sizeof(struct udma_dev),
> +	.flags  = DM_FLAG_OS_PREPARE,
>   };
diff mbox series

Patch

diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
index 0543f5f4c8..e0328536a2 100644
--- a/drivers/dma/ti/k3-udma.c
+++ b/drivers/dma/ti/k3-udma.c
@@ -2190,37 +2190,12 @@  static int udma_transfer(struct udevice *dev, int direction,
 	/* Channel0 is reserved for memcpy */
 	struct udma_chan *uc = &ud->channels[0];
 	dma_addr_t paddr = 0;
-	int ret;
-
-	switch (ud->match_data->type) {
-	case DMA_TYPE_UDMA:
-		ret = udma_alloc_chan_resources(uc);
-		break;
-	case DMA_TYPE_BCDMA:
-		ret = bcdma_alloc_chan_resources(uc);
-		break;
-	default:
-		return -EINVAL;
-	};
-	if (ret)
-		return ret;
 
 	udma_prep_dma_memcpy(uc, dst, src, len);
 	udma_start(uc);
 	udma_poll_completion(uc, &paddr);
 	udma_stop(uc);
 
-	switch (ud->match_data->type) {
-	case DMA_TYPE_UDMA:
-		udma_free_chan_resources(uc);
-		break;
-	case DMA_TYPE_BCDMA:
-		bcdma_free_bchan_resources(uc);
-		break;
-	default:
-		return -EINVAL;
-	};
-
 	return 0;
 }
 
@@ -2590,6 +2565,7 @@  static int udma_probe(struct udevice *dev)
 	struct udevice *tmp;
 	struct udevice *tisci_dev = NULL;
 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
+	struct udma_chan *uc;
 	ofnode navss_ofnode = ofnode_get_parent(dev_ofnode(dev));
 
 	ud->match_data = (void *)dev_get_driver_data(dev);
@@ -2714,6 +2690,42 @@  static int udma_probe(struct udevice *dev)
 
 	uc_priv->supported = DMA_SUPPORTS_MEM_TO_MEM | DMA_SUPPORTS_MEM_TO_DEV;
 
+	uc = &ud->channels[0];
+	switch (ud->match_data->type) {
+	case DMA_TYPE_UDMA:
+		ret = udma_alloc_chan_resources(uc);
+		break;
+	case DMA_TYPE_BCDMA:
+		ret = bcdma_alloc_chan_resources(uc);
+		break;
+	default:
+		return -EINVAL;
+	};
+
+	if (ret) {
+		dev_err(dev, " Channel 0 allocation failure %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int udma_remove(struct udevice *dev)
+{
+	struct udma_dev *ud = dev_get_priv(dev);
+	struct udma_chan *uc = &ud->channels[0];
+
+	switch (ud->match_data->type) {
+	case DMA_TYPE_UDMA:
+		udma_free_chan_resources(uc);
+		break;
+	case DMA_TYPE_BCDMA:
+		bcdma_free_bchan_resources(uc);
+		break;
+	default:
+		return -EINVAL;
+	};
+
 	return 0;
 }
 
@@ -2855,5 +2867,7 @@  U_BOOT_DRIVER(ti_edma3) = {
 	.of_match = udma_ids,
 	.ops	= &udma_ops,
 	.probe	= udma_probe,
+	.remove = udma_remove,
 	.priv_auto	= sizeof(struct udma_dev),
+	.flags  = DM_FLAG_OS_PREPARE,
 };