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
10extern void __ppc64_runlatch_on(void);
11extern 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