[PATCH v4 0/2] dmaengine: avalon: Intel Avalon-MM DMA Interface for PCIe
From: Alexander Gordeev
Date: Wed Oct 30 2019 - 09:32:19 EST
This series is against v5.4-rc5
Patch 1. Introduces "avalon-dma" driver that conforms to the standard
"dmaengine" model;
Patch 2. The existing "dmatest" is not meant for DMA_SLAVE type of
transfers needed by "avalon-dma" driver. Instead, custom "avalon-test"
was used to debug and stress "avalon-dma". In fact, the methology used
for testing is pretty much generic:
- DMA to/from the remote device (memory) - oneshot or multiple times;
- continuously run cuncurrent threads DMAing to/from the remote device;
- using IOCTL to DMA data to/from user level;
Such functionality could be very useful for bringing up custom embedded
devices, i.e sensors, displays etc.
With some effort "avalon-test" could even be merged into the existing
"dmatest" or turned into a tool for testing any "dmaengine" compatible
driver that does not need any custom hardware specifics to initiate DMA
transfers.
I am not certain that "avalon-test" in its current form is the best way
to proceed and thus marking patch 2 as RFC. It depends on "avalon-dma",
but the two drivers are not needed to be accepted together.
Changes since v3 ("avalon-test" only):
- BUG_ONs, WARN_ONs, dev_dbgs removed goto labels renamed;
- kernel configuration options removed in favour of module parameters;
- fail paths reworked to avoid resource leaks uninitialized data crashes;
- invalid parameter checks reworked;
Changes since v2 ("avalon-dma" only):
- avalon_dma_register() return value bug fixed;
- device_prep_slave_sg() does not crash dmaengine_prep_slave_single();
- kernel configuration options removed in favour of module parameters;
- BUG_ONs, WARN_ONs, dev_dbgs removed goto labels renamed;
- polling loop in interrupt handler commented;
- cpu_relax() added to polling loop in interrupt handler;
Changes since v1:
- "avalon-dma" converted to "dmaengine" model;
- "avalon-drv" renamed to "avalon-test";
The Avalon-MM DMA Interface for PCIe is a design used in hard IPs for
Intel Arria, Cyclone or Stratix FPGAs. It transfers data between on-chip
memory and system memory.
Testing was done using a custom FPGA build with Arria 10 FPGA streaming
data to target device RAM:
+----------+ +----------+ +----------+ +----------+
| NIOS CPU |<-->| RAM |<-->| Avalon |<-PCIe->| Host CPU |
+----------+ +----------+ +----------+ +----------+
The data integrity was ensured by examining target device RAM contents
(a) from host CPU (indirectly - checking data DMAed to/from the system)
and (b) from NIOS CPU that has direct access to the device RAM.
A companion tool using "avalon-test" IOCTL commands was used to DMA files:
https://github.com/a-gordeev/avalon-tool.git
CC: dmaengine@xxxxxxxxxxxxxxx
Alexander Gordeev (2):
dmaengine: avalon: Intel Avalon-MM DMA Interface for PCIe
dmaengine: avalon-test: Intel Avalon-MM DMA Interface for PCIe test
drivers/dma/Kconfig | 3 +
drivers/dma/Makefile | 2 +
drivers/dma/avalon-test/Kconfig | 12 +
drivers/dma/avalon-test/Makefile | 14 +
drivers/dma/avalon-test/avalon-dev.c | 108 +++++
drivers/dma/avalon-test/avalon-dev.h | 33 ++
drivers/dma/avalon-test/avalon-ioctl.c | 100 +++++
drivers/dma/avalon-test/avalon-ioctl.h | 13 +
drivers/dma/avalon-test/avalon-mmap.c | 75 ++++
drivers/dma/avalon-test/avalon-mmap.h | 13 +
drivers/dma/avalon-test/avalon-sg-buf.c | 131 ++++++
drivers/dma/avalon-test/avalon-sg-buf.h | 27 ++
drivers/dma/avalon-test/avalon-xfer.c | 559 ++++++++++++++++++++++++
drivers/dma/avalon-test/avalon-xfer.h | 29 ++
drivers/dma/avalon/Kconfig | 15 +
drivers/dma/avalon/Makefile | 12 +
drivers/dma/avalon/avalon-core.c | 477 ++++++++++++++++++++
drivers/dma/avalon/avalon-core.h | 93 ++++
drivers/dma/avalon/avalon-hw.c | 187 ++++++++
drivers/dma/avalon/avalon-hw.h | 86 ++++
drivers/dma/avalon/avalon-pci.c | 145 ++++++
include/uapi/linux/avalon-ioctl.h | 32 ++
22 files changed, 2166 insertions(+)
create mode 100644 drivers/dma/avalon-test/Kconfig
create mode 100644 drivers/dma/avalon-test/Makefile
create mode 100644 drivers/dma/avalon-test/avalon-dev.c
create mode 100644 drivers/dma/avalon-test/avalon-dev.h
create mode 100644 drivers/dma/avalon-test/avalon-ioctl.c
create mode 100644 drivers/dma/avalon-test/avalon-ioctl.h
create mode 100644 drivers/dma/avalon-test/avalon-mmap.c
create mode 100644 drivers/dma/avalon-test/avalon-mmap.h
create mode 100644 drivers/dma/avalon-test/avalon-sg-buf.c
create mode 100644 drivers/dma/avalon-test/avalon-sg-buf.h
create mode 100644 drivers/dma/avalon-test/avalon-xfer.c
create mode 100644 drivers/dma/avalon-test/avalon-xfer.h
create mode 100644 drivers/dma/avalon/Kconfig
create mode 100644 drivers/dma/avalon/Makefile
create mode 100644 drivers/dma/avalon/avalon-core.c
create mode 100644 drivers/dma/avalon/avalon-core.h
create mode 100644 drivers/dma/avalon/avalon-hw.c
create mode 100644 drivers/dma/avalon/avalon-hw.h
create mode 100644 drivers/dma/avalon/avalon-pci.c
create mode 100644 include/uapi/linux/avalon-ioctl.h
--
2.23.0