diff mbox series

[v1,1/1] idma64: Don't try to serve interrupts when device is powered off

Message ID 20240320163210.1153679-1-andriy.shevchenko@linux.intel.com (mailing list archive)
State Superseded
Headers show
Series [v1,1/1] idma64: Don't try to serve interrupts when device is powered off | expand

Commit Message

Andy Shevchenko March 20, 2024, 4:32 p.m. UTC
When iDMA 64-bit device is powered off, the IRQ status register
is all 1:s. This is never happen in real case and signalling that
the device is simply powered off. Don't try to serve interrupts
that are not ours.

Fixes: 667dfed98615 ("dmaengine: add a driver for Intel integrated DMA 64-bit")
Reported-by: Heiner Kallweit <hkallweit1@gmail.com>
Closes: https://lore.kernel.org/r/700bbb84-90e1-4505-8ff0-3f17ea8bc631@gmail.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/idma64.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Andy Shevchenko March 20, 2024, 4:36 p.m. UTC | #1
On Wed, Mar 20, 2024 at 06:32:10PM +0200, Andy Shevchenko wrote:
> When iDMA 64-bit device is powered off, the IRQ status register
> is all 1:s. This is never happen in real case and signalling that
> the device is simply powered off. Don't try to serve interrupts
> that are not ours.

...

>  	dev_vdbg(idma64->dma.dev, "%s: status=%#x\n", __func__, status);

Dunno if I actually also need to move this message to after the checks...

> +	/* Since IRQ may be shared, check if DMA controller is powered on */
> +	if (status == GENMASK(31, 0))
> +		return IRQ_NONE;
> +
>  	/* Check if we have any interrupt from the DMA controller */
>  	if (!status)
>  		return IRQ_NONE;
Heiner Kallweit March 21, 2024, 11:49 a.m. UTC | #2
On 20.03.2024 17:32, Andy Shevchenko wrote:
> diff --git a/drivers/dma/idma64.c b/drivers/dma/idma64.c
> index 78a938969d7d..1b60e73d9322 100644
> --- a/drivers/dma/idma64.c
> +++ b/drivers/dma/idma64.c
> @@ -173,6 +173,10 @@ static irqreturn_t idma64_irq(int irq, void *dev)
>  
>  	dev_vdbg(idma64->dma.dev, "%s: status=%#x\n", __func__, status);
>  
> +	/* Since IRQ may be shared, check if DMA controller is powered on */
> +	if (status == GENMASK(31, 0))
> +		return IRQ_NONE;
> +
>  	/* Check if we have any interrupt from the DMA controller */
>  	if (!status)
>  		return IRQ_NONE;
> -- 2.43.0.rc1.1.gbec44491f096

Tested-by: Heiner Kallweit <hkallweit1@gmail.com>
Andy Shevchenko March 21, 2024, 12:02 p.m. UTC | #3
On Thu, Mar 21, 2024 at 12:49:20PM +0100, Heiner Kallweit wrote:
> On 20.03.2024 17:32, Andy Shevchenko wrote:

...

> >  	dev_vdbg(idma64->dma.dev, "%s: status=%#x\n", __func__, status);
> >  
> > +	/* Since IRQ may be shared, check if DMA controller is powered on */
> > +	if (status == GENMASK(31, 0))
> > +		return IRQ_NONE;
> > +
> >  	/* Check if we have any interrupt from the DMA controller */
> >  	if (!status)
> >  		return IRQ_NONE;
> > -- 2.43.0.rc1.1.gbec44491f096
> 
> Tested-by: Heiner Kallweit <hkallweit1@gmail.com>

Thank you! I think I'll move the test to be before the debug message as it
makes no sense to print when we have powered off device.
Nevertheless, I'll take your tag if no objections for v2.
diff mbox series

Patch

diff --git a/drivers/dma/idma64.c b/drivers/dma/idma64.c
index 78a938969d7d..1b60e73d9322 100644
--- a/drivers/dma/idma64.c
+++ b/drivers/dma/idma64.c
@@ -173,6 +173,10 @@  static irqreturn_t idma64_irq(int irq, void *dev)
 
 	dev_vdbg(idma64->dma.dev, "%s: status=%#x\n", __func__, status);
 
+	/* Since IRQ may be shared, check if DMA controller is powered on */
+	if (status == GENMASK(31, 0))
+		return IRQ_NONE;
+
 	/* Check if we have any interrupt from the DMA controller */
 	if (!status)
 		return IRQ_NONE;