xref: /linux/arch/arm64/include/asm/nmi.h (revision 85cdaca6970028bf6f544c355c90035586836ddf)
10c2c5659SKiryl Shutsemau (Meta) /* SPDX-License-Identifier: GPL-2.0 */
20c2c5659SKiryl Shutsemau (Meta) #ifndef __ASM_NMI_H
30c2c5659SKiryl Shutsemau (Meta) #define __ASM_NMI_H
40c2c5659SKiryl Shutsemau (Meta) 
50c2c5659SKiryl Shutsemau (Meta) #include <linux/cpumask.h>
60c2c5659SKiryl Shutsemau (Meta) 
7*d639f762SKiryl Shutsemau (Meta) struct pt_regs;
8*d639f762SKiryl Shutsemau (Meta) 
90c2c5659SKiryl Shutsemau (Meta) /*
100c2c5659SKiryl Shutsemau (Meta)  * Cross-CPU NMI provider hooks, consulted by the arm64 arch code before
110c2c5659SKiryl Shutsemau (Meta)  * its regular-IRQ / pseudo-NMI IPI paths. The SDEI provider in
120c2c5659SKiryl Shutsemau (Meta)  * drivers/firmware/arm_sdei_nmi.c implements them when active; a future
130c2c5659SKiryl Shutsemau (Meta)  * FEAT_NMI provider could slot in here too. The stubs let callers stay
140c2c5659SKiryl Shutsemau (Meta)  * unconditional when ARM_SDEI_NMI is off.
15*d639f762SKiryl Shutsemau (Meta)  *
16*d639f762SKiryl Shutsemau (Meta)  * sdei_nmi_active() lets a caller test for the service before committing
17*d639f762SKiryl Shutsemau (Meta)  * to (and waiting on) the SDEI stop rung; sdei_nmi_stop_cpus() then signals
18*d639f762SKiryl Shutsemau (Meta)  * the targets, which ack by going offline.
190c2c5659SKiryl Shutsemau (Meta)  */
200c2c5659SKiryl Shutsemau (Meta) #ifdef CONFIG_ARM_SDEI_NMI
210c2c5659SKiryl Shutsemau (Meta) bool sdei_nmi_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu);
22*d639f762SKiryl Shutsemau (Meta) bool sdei_nmi_active(void);
23*d639f762SKiryl Shutsemau (Meta) void sdei_nmi_stop_cpus(const cpumask_t *mask);
240c2c5659SKiryl Shutsemau (Meta) #else
250c2c5659SKiryl Shutsemau (Meta) static inline bool sdei_nmi_trigger_cpumask_backtrace(const cpumask_t *mask,
260c2c5659SKiryl Shutsemau (Meta) 						      int exclude_cpu)
270c2c5659SKiryl Shutsemau (Meta) {
280c2c5659SKiryl Shutsemau (Meta) 	return false;
290c2c5659SKiryl Shutsemau (Meta) }
30*d639f762SKiryl Shutsemau (Meta) 
31*d639f762SKiryl Shutsemau (Meta) static inline bool sdei_nmi_active(void)
32*d639f762SKiryl Shutsemau (Meta) {
33*d639f762SKiryl Shutsemau (Meta) 	return false;
34*d639f762SKiryl Shutsemau (Meta) }
35*d639f762SKiryl Shutsemau (Meta) 
36*d639f762SKiryl Shutsemau (Meta) static inline void sdei_nmi_stop_cpus(const cpumask_t *mask) { }
370c2c5659SKiryl Shutsemau (Meta) #endif
380c2c5659SKiryl Shutsemau (Meta) 
39*d639f762SKiryl Shutsemau (Meta) /*
40*d639f762SKiryl Shutsemau (Meta)  * The common "stop this CPU" entry every arm64 stop path funnels through:
41*d639f762SKiryl Shutsemau (Meta)  * the regular/pseudo-NMI stop IPI handlers, panic_smp_self_stop(), and the
42*d639f762SKiryl Shutsemau (Meta)  * SDEI cross-CPU NMI handler. @die_on_crash powers the CPU off on the kdump
43*d639f762SKiryl Shutsemau (Meta)  * crash path (IPI handlers) instead of parking it (SDEI / self-stop).
44*d639f762SKiryl Shutsemau (Meta)  * Defined in arch/arm64/kernel/smp.c.
45*d639f762SKiryl Shutsemau (Meta)  */
46*d639f762SKiryl Shutsemau (Meta) void __noreturn arm64_nmi_cpu_stop(struct pt_regs *regs, bool die_on_crash);
47*d639f762SKiryl Shutsemau (Meta) 
480c2c5659SKiryl Shutsemau (Meta) #endif /* __ASM_NMI_H */
49