Re: [PATCH 0/4] dma/imx_edma5: introduce NXP i.MX95 eDMA5 driver
Stephen Hemminger <[email protected]>
| Newsgroups | org.dpdk.dev |
|---|---|
| Message-ID | <[email protected]> |
On Thu, 6 Aug 2026 14:12:41 +0530 Gagandeep Singh <[email protected]> wrote: > This patch series adds a new dmadev Poll-Mode Driver (PMD) for the NXP > i.MX95 eDMA5 (Enhanced DMA Type 5) controller. > > Key features supported by this driver: > - Memory-to-memory copy (RTE_DMA_OP_TYPE_MEMCPY) > - Scatter-gather memory copy (RTE_DMA_OP_TYPE_SG) > - 64-bit TCD (Transfer Control Descriptor) format > - Non-coherent DMA with explicit cache clean/invalidate > - Per-channel statistics and register dump for debug > > Patch breakdown: > [1/4] Skeleton: bus probe/remove, dmadev registration, MAINTAINERS, > doc index, and release notes for 26.11. > [2/4] Device configuration: vchan setup, TCD ring allocation, > start/stop, and capability reporting. > [3/4] Data path: enqueue (copy and sg), doorbell, completion poll. > [4/4] Statistics and dump: per-channel counters and register dump. > > Tested on NXP i.MX95 EVK with vfio-platform. > > Gagandeep Singh (4): > dma/imx_edma5: introduce eDMA5 dmadev skeleton > dma/imx_edma5: add device configuration > dma/imx_edma5: add data path > dma/imx_edma5: add statistics and dump > > MAINTAINERS | 5 + > doc/guides/dmadevs/imx_edma5.rst | 61 ++ > doc/guides/dmadevs/index.rst | 1 + > doc/guides/rel_notes/release_26_11.rst | 6 + > drivers/dma/imx_edma5/imx_edma5_dmadev.c | 1096 ++++++++++++++++++++++ > drivers/dma/imx_edma5/imx_edma5_dmadev.h | 203 ++++ > drivers/dma/imx_edma5/imx_edma5_hw.h | 158 ++++ > drivers/dma/imx_edma5/imx_edma5_logs.h | 16 + > drivers/dma/imx_edma5/meson.build | 10 + > drivers/dma/meson.build | 1 + > 10 files changed, 1557 insertions(+) > create mode 100644 doc/guides/dmadevs/imx_edma5.rst > create mode 100644 drivers/dma/imx_edma5/imx_edma5_dmadev.c > create mode 100644 drivers/dma/imx_edma5/imx_edma5_dmadev.h > create mode 100644 drivers/dma/imx_edma5/imx_edma5_hw.h > create mode 100644 drivers/dma/imx_edma5/imx_edma5_logs.h > create mode 100644 drivers/dma/imx_edma5/meson.build > Always good to see more hardware support. Detailed AI review showed lots of problems: Patch 1/4 (skeleton): Error: The driver can never match a device through the upstream platform bus. platform_bus_match() compares (1) the kernel driver name against the DPDK driver name, (2) the kernel driver name against the alias, and (3) the sysfs device name against the DPDK driver name. Devices are only scanned if bound to vfio-platform, so the kernel driver name is always "vfio-platform", and a DT device name like "42000000.dma-controller" never equals "dma_imx_edma5". No match path can succeed, so probe is unreachable. The cover letter says this was tested on i.MX95 EVK - presumably against a modified bus. The series needs an accompanying bus/platform change (e.g. match on of_node/compatible) or an explanation of the intended binding. Error: RTE_PMD_REGISTER_ALIAS(dma_imx_edma5, IMX_EDMA5_COMPAT) produces a broken alias. RTE_PMD_REGISTER_ALIAS stringifies its argument via RTE_STR, and IMX_EDMA5_COMPAT is already a string literal, so the alias becomes "\"fsl,imx95-edma5\"" with embedded quote characters (verified with cpp). It can never strcmp-equal anything. The macro takes an unquoted token, and "fsl,imx95-edma5" cannot be expressed as one (comma splits macro args), so the compatible string cannot be used as an alias at all - which feeds back into the matching problem above. Warning: probe() does not verify the device's compatible string. If the bus matching is fixed, any allowlisted vfio-platform device would be claimed by this driver. Read of_node/compatible and check for "fsl,imx95-edma5" before touching registers. Patch 2/4 (device configuration): Warning: Internal contradiction on coherency. imx_edma5_reset_hw_chan() programs CH_MATTR to IMX_EDMA5_CH_MATTR_COHERENT with a comment saying the eDMA "snoops the CPU caches, matching the Linux fsl-edma driver on a dma-coherent controller", while the cover letter, patch 3 commit message, and the data path all say the master is non-coherent and do full manual clean/invalidate. Both cannot be the intended design: if the interconnect honors those attributes, the per-op cache maintenance and iova2virt lookups are pure overhead; if it does not, this comment is wrong. Pick one and make the comments match the code. Patch 3/4 (data path): Error: RTE_DMA_OP_FLAG_SUBMIT does not submit previously enqueued jobs. The API defines the flag as issuing the doorbell "after enqueued jobs", i.e. equivalent to rte_dma_submit(). imx_edma5_copy()/copy_sg() with the flag run only the current job. Jobs enqueued earlier without the flag are skipped, so they execute out of order relative to the flagged job, and if the application relies on the flag alone they never execute: imx_edma5_completed() stops at the unsubmitted job at tail and the application waits forever. In the flag branch, run all pending jobs from tail through this one (same walk as imx_edma5_submit()). Error: The arm64 cache maintenance helpers lack a DSB. imx_edma5_cache_clean() issues DC CVAC per line but never executes DSB; completion of cache maintenance to the PoC is only guaranteed after a DSB, and the DMB inside rte_write32() does not provide that. The device can be started before the cleans reach memory and read stale source data; likewise the CPU can read the destination before the CIVAC loop in imx_edma5_cache_inval() has completed. Add asm volatile("dsb sy" ::: "memory") at the end of both helpers (compare Linux arch_sync_dma_for_device()). Error: 1 ms completion timeout with unbounded transfer length can corrupt memory. The API length is uint32_t and the driver imposes no maximum, but the timeout comment assumes "the largest single-block copy ... completes in well under a millisecond". A large copy exceeds 1 ms, imx_edma5_wait_done() times out, and imx_edma5_reset_hw_chan() does not actually cancel an active transfer (it only writes CH_CSR.DONE; there is no MP_CSR.CX cancel in this driver), so the next job reprograms the TCD while the channel is still ACTIVE and the aborted transfer keeps writing to the old destination. Enforce a maximum length in copy()/copy_sg() and scale the timeout, or implement cancel via MP_CSR.CX on timeout. Error: TCD NBYTES is written with the full 32-bit length, but on eDMA3/4/5 the NBYTES register carries SMLOE/DMLOE in bits 31:30 when minor-loop offsets are supported, leaving a 30-bit count. A length with bit 30 or 31 set silently enables minor-loop offset mode and truncates the count. (Confidence moderate - please confirm against the i.MX95 RM.) A length cap per the previous item resolves this too. Warning: The data path is fully synchronous: enqueue (or submit) programs the TCD, starts the channel, and busy-waits for DONE, so the CPU spins for the duration of every copy and the offload gains nothing over memcpy. The hardware can run detached: program and START at submit time, poll CH_CSR.DONE in completed()/completed_status(), and only serialize when a second job needs the single register TCD. At minimum the limitation deserves a line in the driver doc. Warning: rte_mem_iova2virt() is called per operation (src and dst) in the hot path; it walks the memseg lists and is expensive. In IOVA=VA mode the lookup is unnecessary. Also, when it returns NULL (e.g. external memory), cache maintenance is silently skipped, which corrupts data on the non-coherent path - reject such addresses or document the restriction. Info: The in-memory TCD64 pool is only used as a parameter store: fields are converted to LE at enqueue and read back with le_to_cpu in imx_edma5_run_job()/job_invalidate_dst(); no descriptor is ever fetched by hardware, and the "must be cleaned from the CPU cache" comment in imx_edma5_hw.h is not (and need not be) honored. A plain array of src/dst/len triples would be simpler, or use E_SG hardware chaining. Patch 4/4 (statistics and dump): Info: The cover letter advertises "register dump for debug", but dev_dump prints software state only (the commit message is accurate). Either dump CH_CSR/CH_ES/TCD registers or fix the cover letter wording. Series: Info: A few double blank lines (imx_edma5_dmadev.h:46, 69, 132; imx_edma5_hw.h:157) and a stray blank line before the closing brace of struct imx_edma5_dev; checkpatch will flag these.