]> www.infradead.org Git - users/jedix/linux-maple.git/commit
irqchip/gic-v3: Init SRE before poking sysregs
authorMark Rutland <mark.rutland@arm.com>
Thu, 22 Aug 2024 10:23:08 +0000 (11:23 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 23 Aug 2024 10:45:45 +0000 (12:45 +0200)
commit71c8e2a7c822ee557b07d9bb49028dd269c87b2e
treefa0673a33b43340fd1beef7ff7575f1db6dcc57e
parentc5af2c90ba5629f0424a8d315f75fb8d91713c3c
irqchip/gic-v3: Init SRE before poking sysregs

The GICv3 driver pokes GICv3 system registers in gic_prio_init() before
gic_cpu_sys_reg_init() ensures that GICv3 system registers have been
enabled by writing to ICC_SRE_EL1.SRE.

On arm64 this is benign as has_useable_gicv3_cpuif() runs earlier during
cpufeature detection, and this enables the GICv3 system registers.

On 32-bit arm when booting on an FVP using the boot-wrapper, the accesses
in gic_prio_init() end up being UNDEFINED and crashes the kernel during
boot.

This is a regression introduced by the addition of gic_prio_init().

Fix this by factoring out the SRE initialization into a new function and
calling it early in the three paths where SRE may not have been
initialized:

(1) gic_init_bases(), before the primary CPU pokes GICv3 sysregs in
    gic_prio_init().

(2) gic_starting_cpu(), before secondary CPUs initialize GICv3 sysregs
    in gic_cpu_init().

(3) gic_cpu_pm_notifier(), before CPUs re-initialize GICv3 sysregs in
    gic_cpu_sys_reg_init().

Fixes: d447bf09a4013541 ("irqchip/gic-v3: Detect GICD_CTRL.DS and SCR_EL3.FIQ earlier")
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
drivers/irqchip/irq-gic-v3.c