[PATCH v2] of/irq: Ignore interrupt parent for nodes without interrupts

Rob Herring robh at kernel.org
Mon Dec 1 06:34:37 PST 2025


On Mon, Dec 1, 2025 at 6:52 AM Geert Uytterhoeven <geert at linux-m68k.org> wrote:
>
> Hi Rob,
>
> Thanks, I was just looking into this...
>
> On Mon, 1 Dec 2025 at 13:09, Rob Herring <robh at kernel.org> wrote:
> > On Fri, Nov 28, 2025 at 10:43 AM Ioana Ciornei <ioana.ciornei at nxp.com> wrote:
> > > On Fri, Nov 14, 2025 at 11:47:54AM +0100, Geert Uytterhoeven wrote:
> > > > The Devicetree Specification states:
> > > >
> > > >     The root of the interrupt tree is determined when traversal of the
> > > >     interrupt tree reaches an interrupt controller node without an
> > > >     interrupts property and thus no explicit interrupt parent.
> > > >
> > > > However, of_irq_init() gratuitously assumes that a node without
> > > > interrupts has an actual interrupt parent if it finds an
> > > > interrupt-parent property higher up in the device tree.  Hence when such
> > > > a property is present (e.g. in the root node), the root interrupt
> > > > controller may not be detected as such, causing a panic:
> > > >
> > > >     OF: of_irq_init: children remain, but no parents
> > > >     Kernel panic - not syncing: No interrupt controller found.
> > > >
> > > > Commit e91033621d56e055 ("of/irq: Use interrupts-extended to find
> > > > parent") already fixed a first part, by checking for the presence of an
> > > > interrupts-extended property.  Fix the second part by only calling
> > > > of_irq_find_parent() when an interrupts property is present.
> > > >
> > > > Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>
>
> > > > --- a/drivers/of/irq.c
> > > > +++ b/drivers/of/irq.c
> > > > @@ -613,7 +613,7 @@ void __init of_irq_init(const struct of_device_id *matches)
> > > >                * are the same distance away from the root irq controller.
> > > >                */
> > > >               desc->interrupt_parent = of_parse_phandle(np, "interrupts-extended", 0);
> > > > -             if (!desc->interrupt_parent)
> > > > +             if (!desc->interrupt_parent && of_property_present(np, "interrupts"))
> > > >                       desc->interrupt_parent = of_irq_find_parent(np);
> > > >               if (desc->interrupt_parent == np) {
> > > >                       of_node_put(desc->interrupt_parent);
>
> > > This change irq-ls-extirq and commit 6ba51b7b34ca ("of/irq: Handle
> > > explicit interrupt parent") does not help with the issue.
> > >
> > > This is how the DT node in lx2160a.dtsi looks like:
> >
> > ls-extirq strikes again!
> >
> > I think something like this should fix it:
> >
> > diff --git a/drivers/of/irq.c b/drivers/of/irq.c
> > index 2271110b5f7c..c06c74aef801 100644
> > --- a/drivers/of/irq.c
> > +++ b/drivers/of/irq.c
> > @@ -593,7 +593,8 @@ void __init of_irq_init(const struct of_device_id *matches)
> >                  * are the same distance away from the root irq controller.
> >                  */
> >                 desc->interrupt_parent = of_parse_phandle(np, "interrupts-extended", 0);
> > -               if (!desc->interrupt_parent && of_property_present(np, "interrupts"))
> > +               if (!desc->interrupt_parent &&
> > +                   (of_property_present(np, "interrupts") || of_property_present(np, "interrupt-map"))
>
> That should indeed restore the previous behavior, and find again
> "interrupt-parent = &gic" in the root node.  However, wouldn't it
> be more correct to follow the approach used for interrupts-extended,
> and use the first interrupt parent from the interrupt-map (which is
> coincidentally &gic, too)?

You might notice this binding is in the interrupt-map abusers list
which is basically the list of cases that the interrupt parsing code
should ignore 'interrupt-map'. So I think the less we look into it,
the better.

I think we should do the above for now and then revert it when the
ls-extirq is converted to a proper driver.

Rob



More information about the linux-riscv mailing list