diff options
author | Daniel Thompson <daniel.thompson@linaro.org> | 2016-08-19 13:56:28 +0100 |
---|---|---|
committer | Daniel Thompson <daniel.thompson@linaro.org> | 2017-03-30 17:55:52 +0100 |
commit | 5288e43cb853300f74f5005be2347eb021ff0359 (patch) | |
tree | 34dc198d37fc55859efd282878603fb54d77eb50 /drivers | |
parent | e2851fa0e7510e4dff97b847445bca821e122a77 (diff) |
arm64: irqflags: Use ICC sysregs to implement IRQ masking
Currently irqflags is implemented using the PSR's I bit. It is possible
to implement irqflags by using the co-processor interface to the GIC.
Using the co-processor interface makes it feasible to simulate NMIs
using GIC interrupt prioritization.
This patch changes the irqflags macros to modify, save and restore
ICC_PMR_EL1. This has a substantial knock on effect for the rest of
the kernel. There are four reasons for this:
1. The state of the PMR becomes part of the CPU context and must be
saved and restored during traps. To simplify the additional context
we store only a single bit, which we refer to as G(IC) bit. This bit
is copied from the PMR and stored in a reserved bit within the saved
PSR. Naturally this approach will need to be changed if future ARM
architecture extensions make use of this bit.
2. The hardware automatically masks the I bit (at boot, during traps, etc).
When the I bit is set by hardware we must add code to switch from I
bit masking and PMR masking.
3. Some instructions, such as wfi, require that the PMR not be used
for interrupt masking. Before calling these instructions we must
switch from PMR masking to I bit masking.
4. We use the alternatives system to allow a single kernel to boot and
be switched to the alternative masking approach at runtime.
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/irqchip/irq-gic-v3.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index c132f29322cc..36ec89a438e2 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -491,8 +491,10 @@ static void gic_cpu_sys_reg_init(void) if (!gic_enable_sre()) pr_err("GIC: unable to set SRE (disabled at EL2), panic ahead\n"); +#ifndef CONFIG_USE_ICC_SYSREGS_FOR_IRQFLAGS /* Set priority mask register */ gic_write_pmr(DEFAULT_PMR_VALUE); +#endif /* * Some firmwares hand over to the kernel with the BPR changed from |