Message ID | 1720187733-5380-2-git-send-email-quic_msarkar@quicinc.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fix unmasking interrupt bit and remove watermark interrupt enablement | expand |
On Fri, Jul 05, 2024 at 07:25:32PM +0530, Mrinmay Sarkar wrote: Subject should be, dmaengine: dw-edma: Fix unmasking STOP and ABORT interrupts for HDMA > The current logic is enabling both STOP_INT_MASK and ABORT_INT_MASK > bit. This is apparently masking those particular interrupt rather than s/interrupt/interrupts > unmasking the same. > Please add the implications of this issue. I guess if the interrupts are masked, they would never get triggered. > This change will reset STOP_INT_MASK and ABORT_INT_MASK bit and unmask > these interrupts. > How about, So fix the issue by unmasking the STOP and ABORT interrupts properly. > Signed-off-by: Mrinmay Sarkar <quic_msarkar@quicinc.com> Please add fixes tag and CC stable as this is a potential bug fix. > --- > drivers/dma/dw-edma/dw-hdma-v0-core.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw-hdma-v0-core.c > index 10e8f07..88bd652f 100644 > --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c > +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c > @@ -247,10 +247,11 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first) > if (first) { > /* Enable engine */ > SET_CH_32(dw, chan->dir, chan->id, ch_en, BIT(0)); > - /* Interrupt enable&unmask - done, abort */ > - tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) | > - HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK | > - HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; > + /* Interrupt unmask - done, abort */ There is no done interrupt in HDMA, only STOP. So use STOP, ABORT here and below. - Mani
diff --git a/drivers/dma/dw-edma/dw-hdma-v0-core.c b/drivers/dma/dw-edma/dw-hdma-v0-core.c index 10e8f07..88bd652f 100644 --- a/drivers/dma/dw-edma/dw-hdma-v0-core.c +++ b/drivers/dma/dw-edma/dw-hdma-v0-core.c @@ -247,10 +247,11 @@ static void dw_hdma_v0_core_start(struct dw_edma_chunk *chunk, bool first) if (first) { /* Enable engine */ SET_CH_32(dw, chan->dir, chan->id, ch_en, BIT(0)); - /* Interrupt enable&unmask - done, abort */ - tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) | - HDMA_V0_STOP_INT_MASK | HDMA_V0_ABORT_INT_MASK | - HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; + /* Interrupt unmask - done, abort */ + tmp = GET_CH_32(dw, chan->dir, chan->id, int_setup) & + ~HDMA_V0_STOP_INT_MASK & ~HDMA_V0_ABORT_INT_MASK; + /* Interrupt enable - done, abort */ + tmp |= HDMA_V0_LOCAL_STOP_INT_EN | HDMA_V0_LOCAL_ABORT_INT_EN; if (!(dw->chip->flags & DW_EDMA_CHIP_LOCAL)) tmp |= HDMA_V0_REMOTE_STOP_INT_EN | HDMA_V0_REMOTE_ABORT_INT_EN; SET_CH_32(dw, chan->dir, chan->id, int_setup, tmp);
The current logic is enabling both STOP_INT_MASK and ABORT_INT_MASK bit. This is apparently masking those particular interrupt rather than unmasking the same. This change will reset STOP_INT_MASK and ABORT_INT_MASK bit and unmask these interrupts. Signed-off-by: Mrinmay Sarkar <quic_msarkar@quicinc.com> --- drivers/dma/dw-edma/dw-hdma-v0-core.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)