diff options
author | Daniel Thompson <daniel.thompson@linaro.org> | 2017-01-27 16:07:13 +0000 |
---|---|---|
committer | Daniel Thompson <daniel.thompson@linaro.org> | 2017-03-30 19:29:03 +0100 |
commit | 9d9c6c34f93859d01b6201bf69301a69a0663c44 (patch) | |
tree | 4dab97f3eb63db3a93d1753e51568bcabc9adb0f /drivers | |
parent | 0ab44db1752bb96ae49726a386ead41b3298c5e9 (diff) |
WIP: Migrating PMR interrupt locking away from kernel_entrydev/arm64_nmi-v4.11
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/irqchip/irq-gic-v3.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 39232014d200..9ca08aa9e3ba 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -343,7 +343,7 @@ static u64 gic_mpidr_to_affinity(unsigned long mpidr) } #ifdef CONFIG_USE_ICC_SYSREGS_FOR_IRQFLAGS -static bool gic_handle_nmi(struct pt_regs *regs) +static bool __maybe_unused gic_handle_nmi(struct pt_regs *regs) { u64 irqnr; struct pt_regs *old_regs; @@ -393,12 +393,37 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs { u32 irqnr; +#if 1 + local_irq_disable(); + if (gic_handle_nmi(regs)) return; +#endif do { irqnr = gic_read_iar(); +#if 0 + printk_ratelimited(KERN_INFO "irqnr %d\n", irqnr); + + if (unlikely(SMP_IPI_NMI_MASK & (1 << irqnr))) { + struct pt_regs *old_regs; + + old_regs = set_irq_regs(regs); + nmi_enter(); + + gic_write_eoir(irqnr); + if (static_key_true(&supports_deactivate)) + gic_write_dir(irqnr); + + nmi_cpu_backtrace(regs); + + nmi_exit(); + set_irq_regs(old_regs); + continue; + } +#endif + if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) { int err; |