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 |
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 --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, };