Re: [PATCH v2 3/8] irqchip/apple-aic: Add cpumasks for E and P cores

From: Marc Zyngier
Date: Mon Dec 13 2021 - 09:43:27 EST


On Sun, 12 Dec 2021 07:30:20 +0000,
Hector Martin <marcan@xxxxxxxxx> wrote:
>
> On 01/12/2021 22.49, Marc Zyngier wrote:
> > In order to be able to tell the core IRQ code about the affinity
> > of the PMU interrupt in later patches, compute the cpumasks of the
> > P and E cores at boot time.
> >
> > This relies on the affinity scheme used by the vendor, which seems
> > to work for the couple of SoCs that are out in the wild.
> >
> > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx>
> > ---
> > drivers/irqchip/irq-apple-aic.c | 14 ++++++++++++++
> > 1 file changed, 14 insertions(+)
> >
> > diff --git a/drivers/irqchip/irq-apple-aic.c b/drivers/irqchip/irq-apple-aic.c
> > index 3759dc36cc8f..30ca80ccda8b 100644
> > --- a/drivers/irqchip/irq-apple-aic.c
> > +++ b/drivers/irqchip/irq-apple-aic.c
> > @@ -177,6 +177,8 @@ struct aic_irq_chip {
> > void __iomem *base;
> > struct irq_domain *hw_domain;
> > struct irq_domain *ipi_domain;
> > + struct cpumask ecore_mask;
> > + struct cpumask pcore_mask;
> > int nr_hw;
> > int ipi_hwirq;
> > };
> > @@ -200,6 +202,11 @@ static void aic_ic_write(struct aic_irq_chip *ic, u32 reg, u32 val)
> > writel_relaxed(val, ic->base + reg);
> > }
> > +static bool __is_pcore(u64 mpidr)
> > +{
> > + return MPIDR_AFFINITY_LEVEL(mpidr, 2) == 1;
> > +}
> > +
> > /*
> > * IRQ irqchip
> > */
> > @@ -833,6 +840,13 @@ static int __init aic_of_ic_init(struct device_node *node, struct device_node *p
> > return -ENODEV;
> > }
> > + for_each_possible_cpu(i) {
> > + if (__is_pcore(cpu_logical_map(i)))
> > + cpumask_set_cpu(i, &irqc->pcore_mask);
> > + else
> > + cpumask_set_cpu(i, &irqc->ecore_mask);
> > + }
> > +
> > set_handle_irq(aic_handle_irq);
> > set_handle_fiq(aic_handle_fiq);
> >
>
> I'm okay with this approach, but if we want to be more explicit about
> the affinities, maybe something like apple,pmu-irq-index in the CPU
> nodes? Then we can either start at a higher FIQ offset for these (in
> case we need to add more FIQs in the future), or just make up a new
> AIC_PMU top level interrupt type and start at 0.

I'm actually worried that we'll need more of these "asymmetric FIQs"
in the future, and that the PMU-specific hack won't scale.

Do you know of any other per-CPU device that could differ between
small and big cores? This would certainly help guiding my
implementation between a device specific hack (the PMU irq index) or
something more generic (interrupt specifier containing the affinity
and following the AICv2 scheme).

Thanks,

M.

--
Without deviation from the norm, progress is not possible.