Messages in this thread | | | From | Alexander Gordeev <> | Subject | [PATCH v4 0/2] dmaengine: avalon: Intel Avalon-MM DMA Interface for PCIe | Date | Wed, 30 Oct 2019 14:32:08 +0100 |
| |
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@vger.kernel.org
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
| |