[PATCH 0/2] dmaengine: dw-edma: Interrupt-emulation doorbell support
From: Koichiro Den
Date: Sun Feb 15 2026 - 10:22:45 EST
Hi,
Some DesignWare eDMA instances support "interrupt emulation", where a
software write can assert the IRQ line without setting the normal
DONE/ABORT status bits.
In the current mainline, on implementations that support interrupt
emulation, writing once to DMA_{WRITE,READ}_INT_STATUS_OFF is sufficient
to leave the level-triggered IRQ line asserted. Since the shared dw-edma
IRQ handlers only look at DONE/ABORT bits and do not perform any
deassertion sequence for interrupt emulation, the IRQ remains asserted
and is eventually disabled by the generic IRQ layer:
$ sudo devmem2 0xe65d50a0 w 0
[ 47.189557] irq 48: nobody cared (try booting with the "irqpoll" option)
...
[ 47.190383] handlers:
[ 47.199837] [<00000000a5ecb36e>] dw_edma_interrupt_common
[ 47.200214] Disabling IRQ #48
In other words, a single interrupt-emulation write can leave the IRQ
line stuck asserted and render the DMA engine unusable until reboot.
This series fixes the problem by:
- adding a core hook to deassert an emulated interrupt
- wiring a requestable Linux virtual IRQ whose .irq_ack performs the
deassert sequence
- raising that virtual IRQ from the dw-edma IRQ path to ensure the
deassert sequence is always executed
This makes interrupt emulation safe and also enables platform users to
expose it as a doorbell via the exported db_irq and db_offset.
This is a spin-off from:
https://lore.kernel.org/linux-pci/20260209125316.2132589-1-den@xxxxxxxxxxxxx/
Based on dmaengine.git next branch latest:
Commit ab736ed52e34 ("dmaengine: add Frank Li as reviewer")
Thanks for reviewing,
Koichiro Den (2):
dmaengine: dw-edma: Add interrupt-emulation hooks
dmaengine: dw-edma: Add virtual IRQ for interrupt-emulation doorbells
drivers/dma/dw-edma/dw-edma-core.c | 127 +++++++++++++++++++++++++-
drivers/dma/dw-edma/dw-edma-core.h | 17 ++++
drivers/dma/dw-edma/dw-edma-v0-core.c | 21 +++++
drivers/dma/dw-edma/dw-hdma-v0-core.c | 7 ++
include/linux/dma/edma.h | 6 ++
5 files changed, 173 insertions(+), 5 deletions(-)
--
2.51.0