irqchip/gic-v3: Allow LPIs to be disabled from the command line
authorMarc Zyngier <marc.zyngier@arm.com>
Sun, 25 Feb 2018 11:27:04 +0000 (11:27 +0000)
committerMarc Zyngier <marc.zyngier@arm.com>
Wed, 14 Mar 2018 11:11:29 +0000 (11:11 +0000)
For most GICv3 implementations, enabling LPIs is a one way switch.
Once they're on, there is no turning back, which completely kills
kexec (pending tables will always be live, and we can't tell the
secondary kernel where they are).

This is really annoying if you plan to use Linux as a bootloader,
as it pretty much guarantees that the secondary kernel won't be
able to use MSIs, and may even see some memory corruption. Bad.

A workaround for this unfortunate situation is to allow the kernel
not to enable LPIs, even if the feature is present in the HW. This
would allow Linux-as-a-bootloader to leave LPIs alone, and let the
secondary kernel to do whatever it wants with them.

Let's introduce a boolean "irqchip.gicv3_nolpi" command line option
that serves that purpose.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Documentation/admin-guide/kernel-parameters.txt
drivers/irqchip/irq-gic-v3.c

index 1d1d53f85ddd79ce2218b7274b3114f41493ac3a..60130231db3b26f32cdcdc2f54df87a9ba2a6bc9 100644 (file)
                        of a GICv2 controller even if the memory range
                        exposed by the device tree is too small.
 
+       irqchip.gicv3_nolpi=
+                       [ARM, ARM64]
+                       Force the kernel to ignore the availability of
+                       LPIs (and by consequence ITSs). Intended for system
+                       that use the kernel as a bootloader, and thus want
+                       to let secondary kernels in charge of setting up
+                       LPIs.
+
        irqfixup        [HW]
                        When an interrupt is not handled search all handlers
                        for it. Intended to get systems with badly broken
index 0ea02504115d158cb4e7bbcbe9f868af8e3f15a7..3e9eeb6cb294d9ffd64f719ea7e92e269c5fec14 100644 (file)
@@ -613,9 +613,17 @@ static void gic_cpu_sys_reg_init(void)
                pr_crit_once("RSS is required but GICD doesn't support it\n");
 }
 
+static bool gicv3_nolpi;
+
+static int __init gicv3_nolpi_cfg(char *buf)
+{
+       return strtobool(buf, &gicv3_nolpi);
+}
+early_param("irqchip.gicv3_nolpi", gicv3_nolpi_cfg);
+
 static int gic_dist_supports_lpis(void)
 {
-       return !!(readl_relaxed(gic_data.dist_base + GICD_TYPER) & GICD_TYPER_LPIS);
+       return !!(readl_relaxed(gic_data.dist_base + GICD_TYPER) & GICD_TYPER_LPIS) && !gicv3_nolpi;
 }
 
 static void gic_cpu_init(void)