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