diff options
| author | Serge Semin <fancer.lancer@gmail.com> | 2023-11-20 18:11:41 +0300 |
|---|---|---|
| committer | Serge Semin <fancer.lancer@gmail.com> | 2026-08-06 00:28:06 +0300 |
| commit | 437481d79bf21eb9e08d588f6d3bb02e05d07cb4 (patch) | |
| tree | 014f0f065c125f0bcece7600558b97cfe3776f4a | |
| parent | 028ef9c96e96197026887c0f092424679298aae8 (diff) | |
| download | linux-edma/fix.tar.gz linux-edma/fix.zip | |
dmaengine: dw-edma: Enable local abort interruptsedma/fix
It turns out that in order to have the local abort/stop/error IRQ being
raised it needs to be enabled in the
DMA_WRITE_LINKED_LIST_ERR_EN/DMA_READ_LINKED_LIST_ERR_EN registers.
Currently only the remote (MSI) IRQ is enabled. Fix this by activating
both local and remote IRQs for the remote eDMA device setup (accessible
over the PCIe bus) and only the local IRQs if the DW eDMA is locally
available (accessible over the CPU application side).
Fixes: d6b03171f9fc ("dmaengine: dw-edma: Add support for chip-specific flags")
Suggested-by: Sergey Nazarov <Sergey.Nazarov@baikalelectronics.ru>
Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
| -rw-r--r-- | drivers/dma/dw-edma/dw-edma-v0-core.c | 4 | ||||
| -rw-r--r-- | drivers/dma/dw-edma/dw-edma-v0-regs.h | 3 |
2 files changed, 5 insertions, 2 deletions
diff --git a/drivers/dma/dw-edma/dw-edma-v0-core.c b/drivers/dma/dw-edma/dw-edma-v0-core.c index b75fdaffad9a..2fb6ba4854c1 100644 --- a/drivers/dma/dw-edma/dw-edma-v0-core.c +++ b/drivers/dma/dw-edma/dw-edma-v0-core.c @@ -414,7 +414,9 @@ static void dw_edma_v0_core_start(struct dw_edma_chunk *chunk, bool first) SET_RW_32(dw, chan->dir, int_mask, tmp); /* Linked list error */ tmp = GET_RW_32(dw, chan->dir, linked_list_err_en); - tmp |= FIELD_PREP(EDMA_V0_LINKED_LIST_ERR_MASK, BIT(chan->id)); + tmp |= FIELD_PREP(EDMA_V0_LL_LOCAL_ABORT_INT_MASK, BIT(chan->id)); + if (!(dw->chip->flags & DW_EDMA_CHIP_LOCAL)) + tmp |= FIELD_PREP(EDMA_V0_LL_REMOTE_ABORT_INT_MASK, BIT(chan->id)); SET_RW_32(dw, chan->dir, linked_list_err_en, tmp); /* Channel control */ SET_CH_32(dw, chan->dir, chan->id, ch_control1, diff --git a/drivers/dma/dw-edma/dw-edma-v0-regs.h b/drivers/dma/dw-edma/dw-edma-v0-regs.h index e175f7b20480..ffc544afc5e3 100644 --- a/drivers/dma/dw-edma/dw-edma-v0-regs.h +++ b/drivers/dma/dw-edma/dw-edma-v0-regs.h @@ -19,7 +19,8 @@ #define EDMA_V0_READ_CH_COUNT_MASK GENMASK(19, 16) #define EDMA_V0_CH_STATUS_MASK GENMASK(6, 5) #define EDMA_V0_DOORBELL_CH_MASK GENMASK(2, 0) -#define EDMA_V0_LINKED_LIST_ERR_MASK GENMASK(7, 0) +#define EDMA_V0_LL_REMOTE_ABORT_INT_MASK GENMASK(7, 0) +#define EDMA_V0_LL_LOCAL_ABORT_INT_MASK GENMASK(23, 16) #define EDMA_V0_CH_ODD_MSI_DATA_MASK GENMASK(31, 16) #define EDMA_V0_CH_EVEN_MSI_DATA_MASK GENMASK(15, 0) |
