xref: /linux/arch/powerpc/include/asm/runlatch.h (revision 24bce201d79807b668bf9d9e0aca801c5c0d5f78)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
4  */
5 #ifndef _ASM_POWERPC_RUNLATCH_H
6 #define _ASM_POWERPC_RUNLATCH_H
7 
8 #ifdef CONFIG_PPC64
9 
10 extern void __ppc64_runlatch_on(void);
11 extern void __ppc64_runlatch_off(void);
12 
13 /*
14  * We manually hard enable-disable, this is called
15  * in the idle loop and we don't want to mess up
16  * with soft-disable/enable & interrupt replay.
17  */
18 #define ppc64_runlatch_off()					\
19 	do {							\
20 		if (cpu_has_feature(CPU_FTR_CTRL) &&		\
21 		    test_thread_local_flags(_TLF_RUNLATCH)) {	\
22 			unsigned long msr = mfmsr();		\
23 			__hard_irq_disable();			\
24 			__ppc64_runlatch_off();			\
25 			if (msr & MSR_EE)			\
26 				__hard_irq_enable();		\
27 		}      						\
28 	} while (0)
29 
30 #define ppc64_runlatch_on()					\
31 	do {							\
32 		if (cpu_has_feature(CPU_FTR_CTRL) &&		\
33 		    !test_thread_local_flags(_TLF_RUNLATCH)) {	\
34 			unsigned long msr = mfmsr();		\
35 			__hard_irq_disable();			\
36 			__ppc64_runlatch_on();			\
37 			if (msr & MSR_EE)			\
38 				__hard_irq_enable();		\
39 		}      						\
40 	} while (0)
41 #else
42 #define ppc64_runlatch_on()
43 #define ppc64_runlatch_off()
44 #endif /* CONFIG_PPC64 */
45 
46 #endif /* _ASM_POWERPC_RUNLATCH_H */
47