[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ebba6278-2d4b-411b-ad95-8db70752eff8@roeck-us.net>
Date: Sun, 9 Jul 2023 06:51:03 -0700
From: Guenter Roeck <linux@...ck-us.net>
To: Geert Uytterhoeven <geert+renesas@...der.be>
Cc: Sergey Shtylyov <s.shtylyov@....ru>,
John Paul Adrian Glaubitz <glaubitz@...sik.fu-berlin.de>,
Yoshinori Sato <ysato@...rs.sourceforge.jp>,
Rich Felker <dalias@...c.org>, linux-sh@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] [RFT] sh: mach-r2d: Handle virq offset in cascaded IRL
demux
On Sun, Jul 09, 2023 at 01:15:49PM +0200, Geert Uytterhoeven wrote:
> When booting rts7751r2dplus_defconfig on QEMU, the system hangs due to
> an interrupt storm on IRQ 20. IRQ 20 aka event 0x280 is a cascaded IRL
> interrupt, which maps to IRQ_VOYAGER, the interrupt used by the Silicon
> Motion SM501 multimedia companion chip. As rts7751r2d_irq_demux() does
> not take into account the new virq offset, the interrupt is no longer
> translated, leading to an unhandled interrupt.
>
> Fix this by taking into account the virq offset when translating
> cascaded IRL interrupts.
>
> Fixes: a8ac2961148e8c72 ("sh: Avoid using IRQ0 on SH3 and SH4")
> Reported-by: Guenter Roeck <linux@...ck-us.net>
> Closes: https://lore.kernel.org/r/fbfea3ad-d327-4ad5-ac9c-648c7ca3fe1f@roeck-us.net
> Signed-off-by: Geert Uytterhoeven <geert+renesas@...der.be>
Tested-by: Guenter Roeck <linux@...ck-us.net>
Guenter
> ---
> Highlander and Dreamcast probably have the same issue.
> I'll send patches for these later...
> ---
> arch/sh/boards/mach-r2d/irq.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/sh/boards/mach-r2d/irq.c b/arch/sh/boards/mach-r2d/irq.c
> index e34f81e9ae813b8d..c37b40398c5bc83e 100644
> --- a/arch/sh/boards/mach-r2d/irq.c
> +++ b/arch/sh/boards/mach-r2d/irq.c
> @@ -117,10 +117,10 @@ static unsigned char irl2irq[R2D_NR_IRL];
>
> int rts7751r2d_irq_demux(int irq)
> {
> - if (irq >= R2D_NR_IRL || irq < 0 || !irl2irq[irq])
> + if (irq >= 16 + R2D_NR_IRL || irq < 16 || !irl2irq[irq - 16])
> return irq;
>
> - return irl2irq[irq];
> + return irl2irq[irq - 16];
> }
>
> /*
> --
> 2.34.1
>
Powered by blists - more mailing lists