linux/drivers/dma
Gustavo Pimentel e63d79d1ff dmaengine: Add Synopsys eDMA IP core driver
Add Synopsys PCIe Endpoint eDMA IP core driver to kernel.

This IP is generally distributed with Synopsys PCIe Endpoint IP (depends
of the use and licensing agreement).

This core driver, initializes and configures the eDMA IP using vma-helpers
functions and dma-engine subsystem.

This driver can be compile as built-in or external module in kernel.

To enable this driver just select DW_EDMA option in kernel configuration,
however it requires and selects automatically DMA_ENGINE and
DMA_VIRTUAL_CHANNELS option too.

In order to transfer data from point A to B as fast as possible this IP
requires a dedicated memory space containing linked list of elements.

All elements of this linked list are continuous and each one describes a
data transfer (source and destination addresses, length and a control
variable).

For the sake of simplicity, lets assume a memory space for channel write
0 which allows about 42 elements.

+---------+
| Desc #0 |-+
+---------+ |
            V
       +----------+
       | Chunk #0 |-+
       |  CB = 1  | |  +----------+  +-----+  +-----------+  +-----+
       +----------+ +->| Burst #0 |->| ... |->| Burst #41 |->| llp |
            |          +----------+  +-----+  +-----------+  +-----+
            V
       +----------+
       | Chunk #1 |-+
       |  CB = 0  | |  +-----------+  +-----+  +-----------+  +-----+
       +----------+ +->| Burst #42 |->| ... |->| Burst #83 |->| llp |
            |          +-----------+  +-----+  +-----------+  +-----+
            V
       +----------+
       | Chunk #2 |-+
       |  CB = 1  | |  +-----------+  +-----+  +------------+  +-----+
       +----------+ +->| Burst #84 |->| ... |->| Burst #125 |->| llp |
            |          +-----------+  +-----+  +------------+  +-----+
            V
       +----------+
       | Chunk #3 |-+
       |  CB = 0  | |  +------------+  +-----+  +------------+  +-----+
       +----------+ +->| Burst #126 |->| ... |->| Burst #129 |->| llp |
                       +------------+  +-----+  +------------+  +-----+

Legend:
 - Linked list, also know as Chunk
 - Linked list element*, also know as Burst *CB*, also know as Change Bit,
it's a control bit (and typically is toggled) that allows to easily
identify and differentiate between the current linked list and the
previous or the next one.
 - LLP, is a special element that indicates the end of the linked list
element stream also informs that the next CB should be toggle

On every last Burst of the Chunk (Burst #41, Burst #83, Burst #125 or
even Burst #129) is set some flags on their control variable (RIE and
LIE bits) that will trigger the send of "done" interruption.

On the interruptions callback, is decided whether to recycle the linked
list memory space by writing a new set of Bursts elements (if still
exists Chunks to transfer) or is considered completed (if there is no
Chunks available to transfer).

On scatter-gather transfer mode, the client will submit a scatter-gather
list of n (on this case 130) elements, that will be divide in multiple
Chunks, each Chunk will have (on this case 42) a limited number of
Bursts and after transferring all Bursts, an interrupt will be
triggered, which will allow to recycle the all linked list dedicated
memory again with the new information relative to the next Chunk and
respective Burst associated and repeat the whole cycle again.

On cyclic transfer mode, the client will submit a buffer pointer, length
of it and number of repetitions, in this case each burst will correspond
directly to each repetition.

Each Burst can describes a data transfer from point A(source) to point
B(destination) with a length that can be from 1 byte up to 4 GB. Since
dedicated the memory space where the linked list will reside is limited,
the whole n burst elements will be organized in several Chunks, that
will be used later to recycle the dedicated memory space to initiate a
new sequence of data transfers.

The whole transfer is considered has completed when it was transferred
all bursts.

Currently this IP has a set well-known register map, which includes
support for legacy and unroll modes. Legacy mode is version of this
register map that has multiplexer register that allows to switch
registers between all write and read channels and the unroll modes
repeats all write and read channels registers with an offset between
them. This register map is called v0.

The IP team is creating a new register map more suitable to the latest
PCIe features, that very likely will change the map register, which this
version will be called v1. As soon as this new version is released by
the IP team the support for this version in be included on this driver.

According to the logic, patches 1, 2 and 3 should be squashed into 1
unique patch, but for the sake of simplicity of review, it was divided
in this 3 patches files.

Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Cc: Vinod Koul <vkoul@kernel.org>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Russell King <rmk+kernel@armlinux.org.uk>
Cc: Joao Pinto <jpinto@synopsys.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
2019-06-10 13:10:39 +05:30
..
bestcomm treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
dw Merge branch 'topic/dw' into for-linus 2019-03-12 12:03:47 +05:30
dw-axi-dmac dmaengine: dw-axi-dmac: Fix trivia typo 2019-01-08 22:36:18 +05:30
dw-edma dmaengine: Add Synopsys eDMA IP core driver 2019-06-10 13:10:39 +05:30
hsu dmaengine: hsu: remove dma_slave_config direction usage 2018-10-07 19:25:09 +05:30
ioat dmaengine: ioatdma: support latency tolerance report (LTR) for v3.4 2019-02-25 12:18:38 +05:30
ipu treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
mediatek dmaengine: mediatek: Add MediaTek UART APDMA support 2019-06-07 15:36:45 +05:30
ppc4xx dmaengine: ppc4xx: fix off-by-one build failure 2018-10-16 20:08:30 +05:30
qcom dmaengine: qcom_hidma: assign channel cookie correctly 2019-01-20 10:43:34 +05:30
sh dmaengine: sh: usb-dmac: Let the core do the device node validation 2019-05-27 11:23:53 +05:30
ti dmaengine: cppi41: delete channel from pending list when stop channel 2018-12-05 14:01:59 +05:30
xilinx dmaengine: xilinx_dma: Remove set but unused ‘tail_desc’ 2019-05-22 10:45:04 +05:30
acpi-dma.c
altera-msgdma.c dmaengine: altera: Use IRQ-safe spinlock calls in the error paths as well 2017-10-20 11:51:10 +05:30
amba-pl08x.c dmaengine: pl08x: be fair when re-assigning physical channel 2019-03-25 21:52:28 +05:30
at_hdmac_regs.h dmaengine: at_hdmac: Remove unnecessary 0x prefixes before %pad 2017-11-08 10:47:04 +05:30
at_hdmac.c dmaengine: at_hdmac: drop useless LIST_HEAD 2019-01-07 09:49:26 +05:30
at_xdmac.c dmaengine: at_xdmac: remove a stray bottom half unlock 2019-05-04 16:11:02 +05:30
bcm2835-dma.c dmaengine updates for v5.2-rc1 2019-05-09 08:51:45 -07:00
bcm-sba-raid.c dmaengine: bcm-sba-raid: Use dev_get_drvdata() 2019-04-29 10:47:15 +05:30
coh901318_lli.c
coh901318.c dmaengine: coh901318: Remove unused variable 2018-11-26 13:35:52 +05:30
coh901318.h
dma-axi-dmac.c dmaengine: axi-dmac: assign copy_align property 2019-05-27 12:36:08 +05:30
dma-jz4740.c dmaengine: jz4740: remove dma_slave_config direction usage 2018-10-07 19:20:14 +05:30
dma-jz4780.c dmaengine: dma-jz4780: Let the core do the device node validation 2019-05-27 11:23:52 +05:30
dmaengine.c dmaengine: Add matching device node validation in __dma_request_channel() 2019-05-27 11:23:52 +05:30
dmaengine.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dmatest.c dmaengine updates for v5.1-rc1 2019-03-14 09:11:54 -07:00
ep93xx_dma.c dmaengine: ep93xx: fix some typo 2018-11-11 14:56:49 +05:30
fsl_raid.c dmaengine: fsl_raid: make of_device_ids const. 2017-06-29 09:25:28 +05:30
fsl_raid.h
fsl-edma-common.c dmaengine: fsl-edma: dma map slave device address 2019-02-04 12:32:53 +05:30
fsl-edma-common.h dmaengine: fsl-edma: Fix typo in Vybrid name 2019-05-04 15:50:26 +05:30
fsl-edma.c dmaengine: fsl-edma: Adjust indentation 2019-05-04 15:50:26 +05:30
fsl-qdma.c dmaengine: fsl-qdma: Continue to clear register on error 2019-06-04 17:35:05 +05:30
fsldma.c dmaengine: fsldma: Replace DMA_IN/OUT by FSL_DMA_IN/OUT 2019-01-07 09:50:16 +05:30
fsldma.h dmaengine: fsldma: Add 64-bit I/O accessors for powerpc64 2019-02-04 12:56:54 +05:30
idma64.c dmaengine: idma64: Move driver name to the header 2019-04-26 16:55:23 +05:30
idma64.h dmaengine: idma64: Use actual device for DMA transfers 2019-03-21 19:48:26 +05:30
img-mdc-dma.c dmaengine: img-mdc-dma: Use vchan_terminate_vdesc() instead of desc_free 2017-12-04 22:33:51 +05:30
imx-dma.c dmaengine updates for v5.1-rc1 2019-03-14 09:11:54 -07:00
imx-sdma.c dmaengine: imx-sdma: Let the core do the device node validation 2019-05-27 11:23:52 +05:30
iop-adma.c
k3dma.c dmaengine: k3dma: Add support for dma-channel-mask 2019-02-04 14:30:57 +05:30
Kconfig dmaengine: Add Synopsys eDMA IP core driver 2019-06-10 13:10:39 +05:30
lpc18xx-dmamux.c
Makefile dmaengine: Add Synopsys eDMA IP core driver 2019-06-10 13:10:39 +05:30
mcf-edma.c dmaengine: fsl-edma: dma map slave device address 2019-02-04 12:32:53 +05:30
mic_x100_dma.c dmaengine: mic_x100_dma: convert to DEFINE_SHOW_ATTRIBUTE 2018-12-17 11:49:41 +05:30
mic_x100_dma.h
mmp_pdma.c dmaengine: mmp_pdma: remove dma_slave_config direction usage 2018-11-05 10:32:46 +05:30
mmp_tdma.c dmaengine: mmp_tdma: Let the core do the device node validation 2019-05-27 11:23:52 +05:30
moxart-dma.c treewide: Use struct_size() for kmalloc()-family 2018-06-06 11:15:43 -07:00
mpc512x_dma.c
mv_xor_v2.c dmaengine: mv_xor_v2: use {lower,upper}_32_bits to configure HW descriptor address 2018-07-25 17:53:22 +05:30
mv_xor.c Merge branch 'topic/mv' into for-linus 2019-03-12 12:04:16 +05:30
mv_xor.h
mxs-dma.c dmaengine: mxs-dma: Let the core do the device node validation 2019-05-27 11:23:52 +05:30
nbpfaxi.c dmaengine: nbpfaxi: Use dev_get_drvdata() 2019-04-29 10:47:15 +05:30
of-dma.c dmaengine: Add matching device node validation in __dma_request_channel() 2019-05-27 11:23:52 +05:30
owl-dma.c dmaengine: owl: Fix warnings generated during build 2018-10-15 22:39:16 +05:30
pch_dma.c PCI: Move Rohm Vendor ID to generic list 2019-02-01 17:24:52 -06:00
pl330.c dmaengine: pl330: _stop: clear interrupt status 2019-04-26 16:51:37 +05:30
pxa_dma.c dmaengine-4.21-rc1 2019-01-01 15:45:48 -08:00
s3c24xx-dma.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
sa11x0-dma.c dmaengine: sa11x0: drop useless LIST_HEAD 2019-01-07 09:49:26 +05:30
sirf-dma.c
sprd-dma.c dmaengine: sprd: Change channel id to slave id for DMA cell specifier 2019-02-25 12:11:19 +05:30
st_fdma.c dmaengine: st_fdma: use struct_size() in kzalloc() 2019-01-07 18:05:22 +05:30
st_fdma.h
ste_dma40_ll.c
ste_dma40_ll.h
ste_dma40.c dmaengine: ste_dma40: remove dma_slave_config direction usage 2018-11-24 20:22:21 +05:30
stm32-dma.c dmaengine: stm32-dma: Fix redundant call to platform_get_irq 2019-05-21 10:09:24 +05:30
stm32-dmamux.c dmaengine: stm32: use to_platform_device() 2019-05-27 12:12:17 +05:30
stm32-mdma.c dmaengine: stm32-mdma: Revert "dmaengine: stm32-mdma: Add a check on read_u32_array" 2019-03-25 21:56:54 +05:30
sun4i-dma.c dmaengine: sun4i: fix invalid argument 2017-04-24 09:50:05 +05:30
sun6i-dma.c dmaengine: sun6i: Add support for H6 DMA 2019-06-04 17:56:59 +05:30
tegra20-apb-dma.c dmaengine: tegra-apb: Error out if DMA_PREP_INTERRUPT flag is unset 2019-06-04 17:45:47 +05:30
tegra210-adma.c dmaengine: tegra210-adma: restore channel status 2019-05-04 16:13:42 +05:30
timb_dma.c dmaengine: timb_dma: Use struct_size() in kzalloc() 2019-01-20 10:50:07 +05:30
TODO
txx9dmac.c drivers: Remove explicit invocations of mmiowb() 2019-04-08 12:01:02 +01:00
txx9dmac.h
uniphier-mdmac.c dmaengine: uniphier-mdmac: add UniPhier MIO DMAC driver 2018-11-24 19:42:59 +05:30
virt-dma.c dmaengine: virt-dma: Add helper to free/reuse a descriptor 2017-12-04 22:33:51 +05:30
virt-dma.h dmaengine: virt-dma: Support for race free transfer termination 2017-12-04 22:33:51 +05:30
xgene-dma.c dmaengine: xgene-dma: fix spelling mistake "descripto" -> "descriptor" 2019-04-26 16:57:15 +05:30
zx_dma.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00