1 /*
2  * Copyright (C) 2006 Atmark Techno, Inc.
3  *
4  * This file is subject to the terms and conditions of the GNU General Public
5  * License. See the file "COPYING" in the main directory of this archive
6  * for more details.
7  */
8 
9 #ifndef _ASM_MICROBLAZE_IRQFLAGS_H
10 #define _ASM_MICROBLAZE_IRQFLAGS_H
11 
12 #include <linux/types.h>
13 #include <asm/registers.h>
14 
15 #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
16 
17 static inline notrace unsigned long arch_local_irq_save(void)
18 {
19 	unsigned long flags;
20 	asm volatile("	msrclr %0, %1	\n"
21 		     "	nop		\n"
22 		     : "=r"(flags)
23 		     : "i"(MSR_IE)
24 		     : "memory");
25 	return flags;
26 }
27 
28 static inline notrace void arch_local_irq_disable(void)
29 {
30 	/* this uses r0 without declaring it - is that correct? */
31 	asm volatile("	msrclr r0, %0	\n"
32 		     "	nop		\n"
33 		     :
34 		     : "i"(MSR_IE)
35 		     : "memory");
36 }
37 
38 static inline notrace void arch_local_irq_enable(void)
39 {
40 	/* this uses r0 without declaring it - is that correct? */
41 	asm volatile("	msrset	r0, %0	\n"
42 		     "	nop		\n"
43 		     :
44 		     : "i"(MSR_IE)
45 		     : "memory");
46 }
47 
48 #else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
49 
50 static inline notrace unsigned long arch_local_irq_save(void)
51 {
52 	unsigned long flags, tmp;
53 	asm volatile ("	mfs	%0, rmsr	\n"
54 		      "	nop			\n"
55 		      "	andi	%1, %0, %2	\n"
56 		      "	mts	rmsr, %1	\n"
57 		      "	nop			\n"
58 		      : "=r"(flags), "=r"(tmp)
59 		      : "i"(~MSR_IE)
60 		      : "memory");
61 	return flags;
62 }
63 
64 static inline notrace void arch_local_irq_disable(void)
65 {
66 	unsigned long tmp;
67 	asm volatile("	mfs	%0, rmsr	\n"
68 		     "	nop			\n"
69 		     "	andi	%0, %0, %1	\n"
70 		     "	mts	rmsr, %0	\n"
71 		     "	nop			\n"
72 		     : "=r"(tmp)
73 		     : "i"(~MSR_IE)
74 		     : "memory");
75 }
76 
77 static inline notrace void arch_local_irq_enable(void)
78 {
79 	unsigned long tmp;
80 	asm volatile("	mfs	%0, rmsr	\n"
81 		     "	nop			\n"
82 		     "	ori	%0, %0, %1	\n"
83 		     "	mts	rmsr, %0	\n"
84 		     "	nop			\n"
85 		     : "=r"(tmp)
86 		     : "i"(MSR_IE)
87 		     : "memory");
88 }
89 
90 #endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
91 
92 static inline notrace unsigned long arch_local_save_flags(void)
93 {
94 	unsigned long flags;
95 	asm volatile("	mfs	%0, rmsr	\n"
96 		     "	nop			\n"
97 		     : "=r"(flags)
98 		     :
99 		     : "memory");
100 	return flags;
101 }
102 
103 static inline notrace void arch_local_irq_restore(unsigned long flags)
104 {
105 	asm volatile("	mts	rmsr, %0	\n"
106 		     "	nop			\n"
107 		     :
108 		     : "r"(flags)
109 		     : "memory");
110 }
111 
112 static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
113 {
114 	return (flags & MSR_IE) == 0;
115 }
116 
117 static inline notrace bool arch_irqs_disabled(void)
118 {
119 	return arch_irqs_disabled_flags(arch_local_save_flags());
120 }
121 
122 #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */
123