On 24-09-18, 16:00, Peter Ujfalusi wrote: > DMA driver for > Texas Instruments K3 NAVSS Unified DMA – Peripheral Root Complex (UDMA-P) > > The UDMA-P is intended to perform similar (but significantly upgraded) functions > as the packet-oriented DMA used on previous SoC devices. The UDMA-P module > supports the transmission and reception of various packet types. The UDMA-P is > architected to facilitate the segmentation and reassembly of SoC DMA data > structure compliant packets to/from smaller data blocks that are natively > compatible with the specific requirements of each connected peripheral. Multiple > Tx and Rx channels are provided within the DMA which allow multiple segmentation > or reassembly operations to be ongoing. The DMA controller maintains state > information for each of the channels which allows packet segmentation and > reassembly operations to be time division multiplexed between channels in order > to share the underlying DMA hardware. An external DMA scheduler is used to > control the ordering and rate at which this multiplexing occurs for Transmit > operations. The ordering and rate of Receive operations is indirectly controlled > by the order in which blocks are pushed into the DMA on the Rx PSI-L interface. > > The UDMA-P also supports acting as both a UTC and UDMA-C for its internal > channels. Channels in the UDMA-P can be configured to be either Packet-Based or > Third-Party channels on a channel by channel basis. > > The initial driver supports: > - MEM_TO_MEM (TR mode) > - DEV_TO_MEM (Packet / TR mode) > - MEM_TO_DEV (Packet / TR mode) > - Cyclic (Packet / TR mode) > - Metadata for descriptors > > Signed-off-by: Peter Ujfalusi <peter.ujfalusi@xxxxxx> > --- > drivers/dma/ti/Kconfig | 12 + > drivers/dma/ti/Makefile | 1 + > drivers/dma/ti/k3-udma.c | 3623 +++++++++++++++++++++++++++++ Sorry but that's too big to review, please split it up ... I tried to review but it is too long, can you split to possibly, struct and io accessors, then low level function and dma callbacks at the end.. > drivers/dma/ti/k3-udma.h | 132 ++ > include/dt-bindings/dma/k3-udma.h | 26 + > 5 files changed, 3794 insertions(+) > create mode 100644 drivers/dma/ti/k3-udma.c > create mode 100644 drivers/dma/ti/k3-udma.h > create mode 100644 include/dt-bindings/dma/k3-udma.h > > diff --git a/drivers/dma/ti/Kconfig b/drivers/dma/ti/Kconfig > index e5e74e1361dc..db73371de206 100644 > --- a/drivers/dma/ti/Kconfig > +++ b/drivers/dma/ti/Kconfig > @@ -33,5 +33,17 @@ config DMA_OMAP > Enable support for the TI sDMA (System DMA or DMA4) controller. This > DMA engine is found on OMAP and DRA7xx parts. > > +config TI_K3_NAVSS_UDMA > + tristate "Texas Instruments UDMA support" > + depends on ARCH_K3 || COMPILE_TEST > + depends on TI_SCI_PROTOCOL > + select DMA_ENGINE > + select DMA_VIRTUAL_CHANNELS > + select TI_K3_NAVSS_RINGACC > + default y > + help > + Enable support for the TI UDMA (Unified DMA) controller. This > + DMA engine is used in AM65x. > + > config TI_DMA_CROSSBAR > bool > diff --git a/drivers/dma/ti/Makefile b/drivers/dma/ti/Makefile > index 113e59ec9c32..911f7c723979 100644 > --- a/drivers/dma/ti/Makefile > +++ b/drivers/dma/ti/Makefile > @@ -2,4 +2,5 @@ > obj-$(CONFIG_TI_CPPI41) += cppi41.o > obj-$(CONFIG_TI_EDMA) += edma.o > obj-$(CONFIG_DMA_OMAP) += omap-dma.o > +obj-$(CONFIG_TI_K3_NAVSS_UDMA) += k3-udma.o > obj-$(CONFIG_TI_DMA_CROSSBAR) += dma-crossbar.o > diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c > new file mode 100644 > index 000000000000..2a2a2c8b1fc2 > --- /dev/null > +++ b/drivers/dma/ti/k3-udma.c > @@ -0,0 +1,3623 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com > + * Author: Peter Ujfalusi <peter.ujfalusi@xxxxxx> > + */ > + > +#include <linux/kernel.h> > +#include <linux/delay.h> > +#include <linux/dmaengine.h> > +#include <linux/dma-mapping.h> > +#include <linux/dmapool.h> > +#include <linux/err.h> > +#include <linux/init.h> > +#include <linux/interrupt.h> > +#include <linux/list.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > +#include <linux/pm_runtime.h> > +#include <linux/slab.h> > +#include <linux/spinlock.h> > +#include <linux/of.h> > +#include <linux/of_dma.h> > +#include <linux/of_device.h> > +#include <linux/of_irq.h> Do you really need all of_ variants? -- ~Vinod