Thread (8 messages) 8 messages, 4 authors, 2021-11-22

Re: realtek,rtl-intc IRQ mapping broken on 5.16-rc1

From: Sander Vanheule <sander@svanheule.net>
Date: 2021-11-18 19:45:34
Also in: lkml

Hi Marc,

On Thu, 2021-11-18 at 19:19 +0000, Marc Zyngier wrote:
Hi Sander,

On Thu, 18 Nov 2021 15:56:06 +0000,
Sander Vanheule [off-list ref] wrote:
quoted
Hi everyone,

On 5.16-rc1, the realtek,rtl-intc interrupt controller driver for
Realtek RTL8380 SoCs (and related) appears broken. When booting, I
don't get a tty on the serial port, although serial output works.
Thanks for the heads up.
quoted
The watchdog (currently under review) also cannot acquire the
required phase1 interrupt, and produces the following output:
quoted
[    1.968228] realtek-otto-watchdog 18003150.watchdog: error -EINVAL: Failed to get
IRQ 4
for phase1
[    1.978404] realtek-otto-watchdog: probe of 18003150.watchdog failed with error -22

A bisects points to commit 041284181226 ("of/irq: Allow matching of
an interrupt-map local to an interrupt controller"). Reverting this
above commit and follow-up commit 10a20b34d735 ("of/irq: Don't
ignore interrupt-controller when interrupt-map failed") restores the
functionality from v5.15.
OK, back to square one, we need to debug this one.

[...]
quoted
        cpuintc: cpuintc {
                compatible = "mti,cpu-interrupt-controller";
                #address-cells = <0>;
                #interrupt-cells = <1>;
                interrupt-controller;
        };
[...]
quoted
                intc: interrupt-controller@3000 {
                        compatible = "realtek,rtl-intc";
                        reg = <0x3000 0x20>;
                        interrupt-controller;
                        #interrupt-cells = <1>;

                        #address-cells = <0>;
                        interrupt-map =
                                <31 &cpuintc 2>, /* UART0 */
                                <20 &cpuintc 3>, /* SWCORE */
                                <19 &cpuintc 4>, /* WDT IP1 */
                                <18 &cpuintc 5>; /* WDT IP2 */
                };
Something looks pretty odd. With 5.15, this interrupt-map would be
completely ignored. With 5.16-rc1, we should actually honour it.

/me digs...

Gah, I see. This driver has its own interrupt-map parser and invents
something out of thin air. I will bang my own head on the wall for
having merged this horror.

Can you try applying the patch below and rename the interrupt-map
property in your DT to "silly-interrupt-map" and let me know if that
helps?
I've dropped the aforementioned reverts, and applied your suggested changes to the DTS and
irq-realtek-rtl. Interrupts now appear to work like before; UART console and watchdog work
as expected.

Best,
Sander
quoted hunk ↗ jump to hunk
That's of course not the right fix, but that's just to confirm the
extent of the damage...

        M.
diff --git a/drivers/irqchip/irq-realtek-rtl.c b/drivers/irqchip/irq-realtek-rtl.c
index fd9f275592d2..3641cd2b1a2c 100644
--- a/drivers/irqchip/irq-realtek-rtl.c
+++ b/drivers/irqchip/irq-realtek-rtl.c
@@ -114,7 +114,7 @@ static int __init map_interrupts(struct device_node *node, struct
irq_domain *do
        if (ret || tmp)
                return -EINVAL;
 
-       imap = of_get_property(node, "interrupt-map", &imaplen);
+       imap = of_get_property(node, "silly-interrupt-map", &imaplen);
        if (!imap || imaplen % 3)
                return -EINVAL;
 
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help