summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerge Semin <fancer.lancer@gmail.com>2023-11-20 18:11:41 +0300
committerSerge Semin <fancer.lancer@gmail.com>2026-08-06 00:28:06 +0300
commit437481d79bf21eb9e08d588f6d3bb02e05d07cb4 (patch)
tree014f0f065c125f0bcece7600558b97cfe3776f4a
parent028ef9c96e96197026887c0f092424679298aae8 (diff)
downloadlinux-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.c4
-rw-r--r--drivers/dma/dw-edma/dw-edma-v0-regs.h3
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)