lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <3wtr4dllqg2ijbzwb4eklmcwwuzgt4my4bdcw2ivslgj3aoix4@kckvh7fpna6y>
Date: Wed, 4 Feb 2026 16:27:46 +0900
From: Koichiro Den <den@...inux.co.jp>
To: Frank Li <Frank.li@....com>
Cc: vkoul@...nel.org, mani@...nel.org, jingoohan1@...il.com, 
	lpieralisi@...nel.org, kwilczynski@...nel.org, robh@...nel.org, bhelgaas@...gle.com, 
	dmaengine@...r.kernel.org, linux-pci@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 0/7] dmaengine: dw-edma, PCI: dwc: Enable remote use
 of integrated DesignWare eDMA

On Tue, Feb 03, 2026 at 12:26:34PM -0500, Frank Li wrote:
> On Tue, Feb 03, 2026 at 10:59:10AM +0900, Koichiro Den wrote:
> > On Mon, Feb 02, 2026 at 11:59:05AM -0500, Frank Li wrote:
> > > On Sun, Feb 01, 2026 at 11:32:23AM +0900, Koichiro Den wrote:
> > > > On Tue, Jan 27, 2026 at 12:34:13PM +0900, Koichiro Den wrote:
> > > > > Hi,
> > > > >
> > > > > Per Frank Li's suggestion [1], this revision combines the previously posted
> > > > > PCI/dwc helper series and the dmaengine/dw-edma series into a single
> > > > > 7-patch set. This series therefore supersedes the two earlier postings:
> > > > >
> > > > >   - [PATCH 0/5] dmaengine: dw-edma: Add helpers for remote eDMA use scenarios
> > > > >     https://lore.kernel.org/dmaengine/20260126073652.3293564-1-den@valinux.co.jp/
> > > > >   - [PATCH 0/2] PCI: dwc: Expose integrated DesignWare eDMA windows
> > > > >     https://lore.kernel.org/linux-pci/20260126071550.3233631-1-den@valinux.co.jp/
> > > > >
> > > > > [1] https://lore.kernel.org/linux-pci/aXeoxxG+9cFML1sx@lizhi-Precision-Tower-5810/
> > > > >
> > > > > Some DesignWare PCIe endpoint platforms integrate a DesignWare eDMA
> > > > > instance alongside the PCIe controller. In remote eDMA use cases, the host
> > > > > needs access to the eDMA register block and the per-channel linked-list
> > > > > (LL) regions via PCIe BARs, while the endpoint may still boot with a
> > > > > standard EP configuration (and may also use dw-edma locally).
> > > > >
> > > > > This series provides the following building blocks:
> > > > >
> > > > >   * dmaengine: Add an optional dma_slave_caps.hw_id so DMA providers can expose
> > > > >     a provider-defined hardware channel identifier to clients, and report it
> > > > >     from dw-edma. This allows users to correlate a DMA channel with
> > > > >     hardware-specific resources such as per-channel LL regions.
> > > > >
> > > > >   * dmaengine/dw-edma: Add features useful for remote-controlled EP eDMA usage:
> > > > >       - per-channel interrupt routing control (configured via dmaengine_slave_config(),
> > > > >         passing a small dw-edma-specific structure through
> > > > >         dma_slave_config.peripheral_config / dma_slave_config.peripheral_size),
> > > > >       - optional completion polling when local IRQ handling is disabled, and
> > > > >       - notify-only channels for cases where the local side needs interrupt
> > > > > 	notification without cookie-based accounting (i.e. its peer
> > > > > 	prepares and submits the descriptors), useful when host-to-endpoint
> > > > > 	interrupt delivery is difficult or unavailable without it.
> > > > >
> > > > >   * PCI: dwc: Add query-only helper APIs to expose resources of an integrated
> > > > >     DesignWare eDMA instance:
> > > > >       - the physical base/size of the eDMA register window, and
> > > > >       - the per-channel LL region base/size, keyed by transfer direction and
> > > > >         the hardware channel identifier (hw_id).
> > > > >
> > > > > The first real user will likely be the DesignWare backend in the NTB transport work:
> > > > >
> > > > >   [RFC PATCH v4 25/38] NTB: hw: Add remote eDMA backend registry and DesignWare backend
> > > > >   https://lore.kernel.org/linux-pci/20260118135440.1958279-26-den@valinux.co.jp/
> > > > >
> > > > >     (Note: the implementation in this series has been updated since that
> > > > >     RFC v4, so the RFC series will also need some adjustments. I have an
> > > > >     updated RFC series locally and can post an RFC v5 if that would help
> > > > >     review/testing.)
> > > > >
> > > > > Apply/merge notes:
> > > > >   - Patches 1-5 apply cleanly on dmaengine.git next.
> > > > >   - Patches 6-7 apply cleanly on pci.git controller/dwc.
> > > > >
> > > > > Changes in v2:
> > > > >   - Combine the two previously posted series into a single set (per Frank's
> > > > >     suggestion). Order dmaengine/dw-edma patches first so hw_id support
> > > > >     lands before the PCI LL-region helper, which assumes
> > > > >     dma_slave_caps.hw_id availability.
> > > > >
> > > > > Thanks for reviewing,
> > > > >
> > > > >
> > > > > Koichiro Den (7):
> > > > >   dmaengine: Add hw_id to dma_slave_caps
> > > > >   dmaengine: dw-edma: Report channel hw_id in dma_slave_caps
> > > > >   dmaengine: dw-edma: Add per-channel interrupt routing control
> > > > >   dmaengine: dw-edma: Poll completion when local IRQ handling is
> > > > >     disabled
> > > > >   dmaengine: dw-edma: Add notify-only channels support
> > > > >   PCI: dwc: Add helper to query integrated dw-edma register window
> > > > >   PCI: dwc: Add helper to query integrated dw-edma linked-list region
> > > >
> > > >
> > > > Hi Mani, Vinod (and others),
> > > >
> > > > I'd appreciate your thoughts on the overall design of patches 3–5/7 when
> > > > you have a moment.
> > > >
> > > >   - [PATCH v2 3/7] dmaengine: dw-edma: Add per-channel interrupt routing control
> > > >     https://lore.kernel.org/dmaengine/20260127033420.3460579-4-den@valinux.co.jp/
> > > >   - [PATCH v2 4/7] dmaengine: dw-edma: Poll completion when local IRQ handling is disabled
> > > >     https://lore.kernel.org/dmaengine/20260127033420.3460579-5-den@valinux.co.jp/
> > > >   - [PATCH v2 5/7] dmaengine: dw-edma: Add notify-only channels support
> > > >     https://lore.kernel.org/dmaengine/20260127033420.3460579-6-den@valinux.co.jp/
> > > >
> > > > My cover letter might have been too terse, so let me add a bit more context
> > > > and two questions at the end.
> > > >
> > > > (Frank already provided helpful feedback on v1/RFC for Patch 3/7. Thanks, Frank.)
> > > >
> > > >
> > > > Motivation for these three patches
> > > > ----------------------------------
> > > >
> > > >   For remote use of a DMA channel (i.e. the host drives a channel that
> > > >   resides in the endpoint (EP)):
> > > >
> > > >   * The EP initializes its DMA channels during the normal SoC glue
> > > >     driver probe.
> > > >   * It obtains a dma_chan to delegate to the host via the standard
> > > >     dma_request_channel().
> > > >   * It exposes the underlying HW resources to the host ("delegation").
> > > >   * The host also acquires a channel via the standard
> > > >     dma_request_channel(). The underlying HW resource is the same as on the
> > > >     EP side, but it's driven remotely from the host.
> > > >
> > > >   and I'm targeting two operating modes:
> > > >
> > > >   1). Standard use of the remote channel
> > > >
> > > >     * The host submits a transaction and handles its completion, just
> > > >       like a local dmaengine client would. Under the hood, the HW channel
> > > >       resides in the remote EP.
> > > >     * In this scenario, we need to ensure:
> > > >       (a). completion interrupts are delivered only to the host. Or,
> > > >       (b). even if (a) is not possible (i.e. the EP also gets interrupted),
> > > >            the EP must not acknowledge/clear the interrupt status in a way
> > > >            that would race with host.
> > > >
> > > >                                   dmaengine_submit()
> > > >                                           :
> > > >                                           v
> > > >        +----------+                 +----------+
> > > >        | dma_chan |--(delegate)--->: dma_chan :
> > > >        +----------+                 +----------+
> > > >       EP (delegator)              Host (delegatee)
> > > >                                           ^
> > > >                                           :
> > > >                                 completion interrupt
> > > >
> > > >   2). Notify-only channel
> > > >
> > > >     * The host submits a transaction, and the EP gets the interrupt
> > > >       and runs any registered callbacks.
> > > >     * In this scenario, we need to ensure:
> > > >       (a). completion interrupts are delivered only to the EP. Or,
> > > >       (b). even if (a) is not possible (i.e. the host also gets
> > > >            interrupted), the host must not acknowledge/clear the interrupt
> > > >            status in a way that would race with the EP.
> > > >       (c). repeated dmaengine_submit() calls must not get stuck, even
> > > >            though it cannot rely on interrupt-driven transaction status
> > > >            management.
> > >
> > > According to RM:
> > >
> > > WR_DONE_INT_STATUS
> > > Done Interrupt Status. The DMA write channel has successfully completed the DMA transfer. For
> > > more information, see "Interrupts and Error Handling". Each bit corresponds to a DMA channel. Bit
> > > [0] corresponds to channel 0.
> > > - Enabling: For more information, see "Interrupts and Error Handling".
> > > - Masking: The DMA write interrupt Mask register has no effect on this register.
> > > - Clearing: You must write a 1'b1 to the corresponding channel bit in the DMA write interrupt Clear register
> > > to clear this interrupt bit.
> > >
> > > Note: You can write to this register to emulate interrupt generation, during software or hardware testing. A
> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > > write to the address triggers an interrupt, but the DMA does not set the Done or Abort bits in this register.
> > >
> > >
> > > So you just need write this register to trigger a fake irq. needn't do
> > > data transfer.
> >
> > Thanks for the comment.
> >
> > One concern I have with using the fake interrupt mechanism is that it is
> > effectively channel-less, while the only documented acknowledgment path is
> > via {WR,RD}_DONE_INT_CLEAR[x], which is strictly channel-based. The RM does
> > not describe how a channel-less, emulated interrupt is associated with (or
> > cleared by) a specific channel's INT_CLEAR bit.
> 
> According to spec, it should only generate a irq, but no bit set at status.
> so needn't clean.
> 
> >
> > Because of that, I don't think there is a spec-backed guarantee that
> > writing INT_CLEAR for an arbitrary (even if reserved) channel will reliably
> > clear a fake interrupt, though I might be missing something. In the very
> > first RFC v1 series [1], I ended up writing 1 to all enabled channels
> > simply as the most defensive approach. However, that clearly does not
> > compose well once the same eDMA instance is used for real data transfers,
> > since it risks clearing real completion events.
> 
> Transfer a dummy data is not big issue. Only have to write at least 2
> register to finish a data transfer to trigger remote doorbell.
> 
> If write INT_STATUS work, which will most likely push doorbell. I have not
> did test, dose write INT_STATUS work?

In the RM, WR_DONE_INT_CLEAR has the description:

    Done Interrupt Clear. You must write a 1'b1 to clear the
    corresponding bit in the Done interrupt status field of the
    DMA write interrupt status register. Each bit corresponds to a
    DMA channel. Bit [0] corresponds to channel 0.
    Note: Reading from this self-clearing register field always
    returns a '0'.

Based on this, I originally assumed that writing a 1 to at least one
channel bit was required. However, after reading your comment, I tested
this on R-Car S4 Spider (eDMA) and verified that writing all 0s to
INT_CLEAR is sufficient to deassert a raised fake irq. This means the fake
irq can be acked without interfering with ongoing real DMA transfers on any
channel.

For HDMA, I do not currently have access to suitable hardware, so I have
not been able to validate the same behavior. I guess something like this
might work:

    SET_BOTH_CH_32(dw, 0, int_clear, 0) // channel 0 chosen arbitrarily

Anyway, based on the above, I have prepared v3 of the series and also
locally updated my RFC series ("[RFC PATCH v4 00/38] NTB transport backed
by PCI EP embedded DMA") accordingly. This fake irq approach has been
working well in my testing, so I plan to send v3 shortly.

Thanks for the review, it helped a lot,
Koichiro

> 
> Frank
> 
> >
> > What's your view on this?
> >
> > [1] https://lore.kernel.org/all/20251023071916.901355-16-den@valinux.co.jp/
> >
> > Thanks again for taking a close look at this.
> >
> > Koichiro
> >
> > >
> > > Frank
> > >
> > > >       (d). callback can be registered for the dma_chan on the EP.
> > > >
> > > >                                   dmaengine_submit()
> > > >                                           :
> > > >                                           v
> > > >        +----------+                 +----------+
> > > >        | dma_chan |--(delegate)--->: dma_chan :
> > > >        +----------+                 +----------+
> > > >       EP (delegator)              Host (delegatee)
> > > >              ^
> > > >              :
> > > >       completion interrupt
> > > >
> > > >
> > > >   Patch mapping:
> > > >     - (a)(b) are addressed by [PATCH v2 3/7].
> > > >     - (c) is addressed by [PATCH v2 4/7].
> > > >     - (d) is addressed by [PATCH v2 5/7].
> > > >
> > > >
> > > > Questions
> > > > ---------
> > > >
> > > >   1. Are these two use cases (1) and (2) acceptable?
> > > >   2. To support (1) and (2), is the current implementation direction acceptable?
> > > >      Or should this be generalized into a dmaengine API rather than being a
> > > >      dw-edma-core-specific extension?
> > > >
> > > >
> > > > Any feedback would be appreciated.
> > > >
> > > > Kind regards,
> > > > Koichiro
> > > >
> > > >
> > > > >
> > > > >  MAINTAINERS                                  |   2 +-
> > > > >  drivers/dma/dmaengine.c                      |   1 +
> > > > >  drivers/dma/dw-edma/dw-edma-core.c           | 167 +++++++++++++++++--
> > > > >  drivers/dma/dw-edma/dw-edma-core.h           |  21 +++
> > > > >  drivers/dma/dw-edma/dw-edma-v0-core.c        |  26 ++-
> > > > >  drivers/pci/controller/dwc/pcie-designware.c |  74 ++++++++
> > > > >  drivers/pci/controller/dwc/pcie-designware.h |   2 +
> > > > >  include/linux/dma/edma.h                     |  57 +++++++
> > > > >  include/linux/dmaengine.h                    |   2 +
> > > > >  include/linux/pcie-dwc-edma.h                |  72 ++++++++
> > > > >  10 files changed, 398 insertions(+), 26 deletions(-)
> > > > >  create mode 100644 include/linux/pcie-dwc-edma.h
> > > > >
> > > > > --
> > > > > 2.51.0
> > > > >

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ