Re: Multi-parent IRQ domains

From: Thierry Reding
Date: Mon Sep 17 2018 - 09:07:19 EST


On Mon, Sep 17, 2018 at 02:28:01PM +0200, Thomas Gleixner wrote:
> On Mon, 17 Sep 2018, Thierry Reding wrote:
> > On Fri, Sep 14, 2018 at 12:31:18PM +0200, Thomas Gleixner wrote:
> > > Now, you need the PMC for both, the GPIOs and the RTC. What you can do here
> > > is to provide two irq domains in PMC. One which has GIC as its parent and
> > > one which has no parent. Surely they need to share some resources, but
> > > that should be a solvable problem.
> >
> > I think I have this working to some degree, finally. GPIO is still
> > proving difficult, but RTC seems to be working fine. I've currently
> > solved this by making the PMC an interrupt controller and then have
> > an interrupt-map property in its device tree node that lists those
> > wake events that we're interested in. It looks something like this:
> >
> > pmc: pmc@c360000 {
> > compatible = "nvidia,tegra194-pmc";
> > reg = <0x0c360000 0x10000>,
> > <0x0c370000 0x10000>,
> > <0x0c380000 0x10000>,
> > <0x0c390000 0x10000>,
> > <0x0c3a0000 0x10000>;
> > reg-names = "pmc", "wake", "aotag", "scratch", "misc";
> >
> > #interrupt-cells = <1>;
> > interrupt-controller;
> >
> > interrupt-map = /*<29 &gpio_aon TEGRA194_AON_GPIO(EE, 4)
> > IRQ_TYPE_LEVEL_HIGH>,*/
> > <73 &gic GIC_SPI 10
> > IRQ_TYPE_LEVEL_HIGH>;
> > };
> >
> > Note that I've commented out the GPIO wake event (this is for the power
> > button) because that currently crashes in the GPIO driver, probably
> > because I misunderstood how to properly implement this.
>
> I'm not a DT wizerd, but the GPIO cannot be linked there I think.
>
> RTC ---------------------------> [ PMC domain 1] -----> GIC
>
> Button --> [GPIO domain] ------> [ PMC domain 2]
>
> The RTC is connected to PMC domain 1 and that allocates the GIC irq.
>
> The button is conntected to the GPIO which connect to the PMC domain
> 2. That PMC domain has no connection to anything. It ends there.

Interesting, I was assuming the following:

Button --> [PMC domain 2] --> [GPIO domain]

based on the hardware documentation that maps the wake events to
specific signals on the chip.

> > When I use the above code on the PMC/GPIO domain, then I see crashes
> > because the GPIO controller doesn't implement things like the ->alloc()
> > callback for its IRQ domain. But perhaps this is what I misunderstand.
> > Are you saying that for the case of GPIO I can just *not* pass through
> > all other operations and just let them be NULL? So that the only
> > callback will be ->irq_set_wake()? What I don't quite understand is how
> > the IRQ code would know how to properly set up the GPIO interrupt in
> > that case.
>
> Let's look at the PMC level first:
>
> The PMC has a fixed number of interrupts which are avail
>
> domain 1:
>
> That domain is used for interrupts which have a dedicated GIC
> interrupt line, e.g. the RTC
>
> The interrupt domain needs at least:
>
> alloc = pmc_domain1_alloc
>
> The interrupt chip has:
>
> irq_mask = irq_chip_mask_parent
> irq_unmask = irq_chip_unmask_parent
> irq_eoi = irq_chip_eoi_parent
> irq_set_affinity = irq_chip_set_affinity_parent
> irq_set_type = irq_chip_set_type_parent
> irq_set_wake = pmc_set_wake
>
> domain 2:
>
> That domain is used for interrupts which are not related to the GIC
> directly, e.g. GPIO
>
> The interrupt domain needs at least:
>
> alloc = pmc_domain2_alloc
>
> The interrupt chip has:
>
> irq_set_wake = pmc_set_wake
>
>
> Now the GPIO domain builds on top of PMC domain2
>
> i.e. the parent of the GPIO domain is PMC domain2, which means that
> it's part of a hierarchy and therefore needs an alloc function in
> the domain ops.
>
> The GPIO irq chip gains one extra callback:
>
> irq_set_wake = irq_chip_set_wake_parent,

This looks interesting. I'm going to give that a try, though it may take
me a little to rework everything.

> So, I don't know how GPIOs are mapped into the PMC when they are a wakeup
> source. It might be all of them have the ability so there is some 1:1
> relation ship or if the whole GPIO -> PMC connection can be built at run
> time, but that's just an implementation detail.

There's a fixed mapping for which signals go to which wake event. Some
of those events are mapped to GPIOs, others to different signals, such
as the RTC alarm. I think I should be able to build a GPIO -> PMC map
at runtime using a static table.

Thanks,
Thierry

Attachment: signature.asc
Description: PGP signature