14726dd60SMichal Simek /* SPDX-License-Identifier: GPL-2.0 */
24dbdc9a5SMichal Simek /*
34dbdc9a5SMichal Simek  * Copyright (C) 2006 Atmark Techno, Inc.
44dbdc9a5SMichal Simek  */
54dbdc9a5SMichal Simek 
64dbdc9a5SMichal Simek #ifndef _ASM_MICROBLAZE_IRQFLAGS_H
74dbdc9a5SMichal Simek #define _ASM_MICROBLAZE_IRQFLAGS_H
84dbdc9a5SMichal Simek 
9df9ee292SDavid Howells #include <linux/types.h>
10a3cd613bSMichal Simek #include <asm/registers.h>
114dbdc9a5SMichal Simek 
1212dfc73eSMichal Simek #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
134dbdc9a5SMichal Simek 
arch_local_irq_save(void)14a2f52699SSteven Rostedt static inline notrace unsigned long arch_local_irq_save(void)
154dbdc9a5SMichal Simek {
164dbdc9a5SMichal Simek 	unsigned long flags;
17df9ee292SDavid Howells 	asm volatile("	msrclr %0, %1	\n"
18df9ee292SDavid Howells 		     "	nop		\n"
19df9ee292SDavid Howells 		     : "=r"(flags)
20df9ee292SDavid Howells 		     : "i"(MSR_IE)
21df9ee292SDavid Howells 		     : "memory");
22a3cd613bSMichal Simek 	return flags;
234dbdc9a5SMichal Simek }
244dbdc9a5SMichal Simek 
arch_local_irq_disable(void)25a2f52699SSteven Rostedt static inline notrace void arch_local_irq_disable(void)
26df9ee292SDavid Howells {
27df9ee292SDavid Howells 	/* this uses r0 without declaring it - is that correct? */
28df9ee292SDavid Howells 	asm volatile("	msrclr r0, %0	\n"
29df9ee292SDavid Howells 		     "	nop		\n"
30df9ee292SDavid Howells 		     :
31df9ee292SDavid Howells 		     : "i"(MSR_IE)
32df9ee292SDavid Howells 		     : "memory");
33df9ee292SDavid Howells }
34df9ee292SDavid Howells 
arch_local_irq_enable(void)35a2f52699SSteven Rostedt static inline notrace void arch_local_irq_enable(void)
36df9ee292SDavid Howells {
37df9ee292SDavid Howells 	/* this uses r0 without declaring it - is that correct? */
38df9ee292SDavid Howells 	asm volatile("	msrset	r0, %0	\n"
39df9ee292SDavid Howells 		     "	nop		\n"
40df9ee292SDavid Howells 		     :
41df9ee292SDavid Howells 		     : "i"(MSR_IE)
42df9ee292SDavid Howells 		     : "memory");
43df9ee292SDavid Howells }
44df9ee292SDavid Howells 
45df9ee292SDavid Howells #else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
46df9ee292SDavid Howells 
arch_local_irq_save(void)47a2f52699SSteven Rostedt static inline notrace unsigned long arch_local_irq_save(void)
48df9ee292SDavid Howells {
49df9ee292SDavid Howells 	unsigned long flags, tmp;
50df9ee292SDavid Howells 	asm volatile ("	mfs	%0, rmsr	\n"
51df9ee292SDavid Howells 		      "	nop			\n"
52df9ee292SDavid Howells 		      "	andi	%1, %0, %2	\n"
53df9ee292SDavid Howells 		      "	mts	rmsr, %1	\n"
54df9ee292SDavid Howells 		      "	nop			\n"
55df9ee292SDavid Howells 		      : "=r"(flags), "=r"(tmp)
56df9ee292SDavid Howells 		      : "i"(~MSR_IE)
57df9ee292SDavid Howells 		      : "memory");
58df9ee292SDavid Howells 	return flags;
59df9ee292SDavid Howells }
60df9ee292SDavid Howells 
arch_local_irq_disable(void)61a2f52699SSteven Rostedt static inline notrace void arch_local_irq_disable(void)
62df9ee292SDavid Howells {
63df9ee292SDavid Howells 	unsigned long tmp;
64df9ee292SDavid Howells 	asm volatile("	mfs	%0, rmsr	\n"
65df9ee292SDavid Howells 		     "	nop			\n"
66df9ee292SDavid Howells 		     "	andi	%0, %0, %1	\n"
67df9ee292SDavid Howells 		     "	mts	rmsr, %0	\n"
68df9ee292SDavid Howells 		     "	nop			\n"
69df9ee292SDavid Howells 		     : "=r"(tmp)
70df9ee292SDavid Howells 		     : "i"(~MSR_IE)
71df9ee292SDavid Howells 		     : "memory");
72df9ee292SDavid Howells }
73df9ee292SDavid Howells 
arch_local_irq_enable(void)74a2f52699SSteven Rostedt static inline notrace void arch_local_irq_enable(void)
75df9ee292SDavid Howells {
76df9ee292SDavid Howells 	unsigned long tmp;
77df9ee292SDavid Howells 	asm volatile("	mfs	%0, rmsr	\n"
78df9ee292SDavid Howells 		     "	nop			\n"
79df9ee292SDavid Howells 		     "	ori	%0, %0, %1	\n"
80df9ee292SDavid Howells 		     "	mts	rmsr, %0	\n"
81df9ee292SDavid Howells 		     "	nop			\n"
82df9ee292SDavid Howells 		     : "=r"(tmp)
83df9ee292SDavid Howells 		     : "i"(MSR_IE)
84df9ee292SDavid Howells 		     : "memory");
85df9ee292SDavid Howells }
86df9ee292SDavid Howells 
87df9ee292SDavid Howells #endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
88df9ee292SDavid Howells 
arch_local_save_flags(void)89a2f52699SSteven Rostedt static inline notrace unsigned long arch_local_save_flags(void)
90df9ee292SDavid Howells {
91df9ee292SDavid Howells 	unsigned long flags;
92df9ee292SDavid Howells 	asm volatile("	mfs	%0, rmsr	\n"
93df9ee292SDavid Howells 		     "	nop			\n"
94df9ee292SDavid Howells 		     : "=r"(flags)
95df9ee292SDavid Howells 		     :
96df9ee292SDavid Howells 		     : "memory");
97df9ee292SDavid Howells 	return flags;
98df9ee292SDavid Howells }
99df9ee292SDavid Howells 
arch_local_irq_restore(unsigned long flags)100a2f52699SSteven Rostedt static inline notrace void arch_local_irq_restore(unsigned long flags)
101df9ee292SDavid Howells {
102df9ee292SDavid Howells 	asm volatile("	mts	rmsr, %0	\n"
103df9ee292SDavid Howells 		     "	nop			\n"
104df9ee292SDavid Howells 		     :
105df9ee292SDavid Howells 		     : "r"(flags)
106df9ee292SDavid Howells 		     : "memory");
107df9ee292SDavid Howells }
108df9ee292SDavid Howells 
arch_irqs_disabled_flags(unsigned long flags)109a2f52699SSteven Rostedt static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
110df9ee292SDavid Howells {
111df9ee292SDavid Howells 	return (flags & MSR_IE) == 0;
112df9ee292SDavid Howells }
113df9ee292SDavid Howells 
arch_irqs_disabled(void)114a2f52699SSteven Rostedt static inline notrace bool arch_irqs_disabled(void)
115df9ee292SDavid Howells {
116df9ee292SDavid Howells 	return arch_irqs_disabled_flags(arch_local_save_flags());
117df9ee292SDavid Howells }
1184dbdc9a5SMichal Simek 
1194dbdc9a5SMichal Simek #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */
120