xref: /linux/arch/microblaze/include/asm/irqflags.h (revision 4dbdc9a59656d9166f9baaf8733b73e2ad0c8fa5)
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/irqflags.h>
13 
14 # if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
15 
16 # define local_irq_save(flags)				\
17 	do {						\
18 		asm volatile ("# local_irq_save	\n\t"	\
19 				"msrclr %0, %1	\n\t"	\
20 				"nop	\n\t"		\
21 				: "=r"(flags)		\
22 				: "i"(MSR_IE)		\
23 				: "memory");		\
24 	} while (0)
25 
26 # define local_irq_disable()					\
27 	do {							\
28 		asm volatile ("# local_irq_disable \n\t"	\
29 				"msrclr r0, %0 \n\t"		\
30 				"nop	\n\t"			\
31 				:				\
32 				: "i"(MSR_IE)			\
33 				: "memory");			\
34 	} while (0)
35 
36 # define local_irq_enable()					\
37 	do {							\
38 		asm volatile ("# local_irq_enable \n\t"		\
39 				"msrset	r0, %0 \n\t"		\
40 				"nop	\n\t"			\
41 				:				\
42 				: "i"(MSR_IE)			\
43 				: "memory");			\
44 	} while (0)
45 
46 # else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */
47 
48 # define local_irq_save(flags)					\
49 	do {							\
50 		register unsigned tmp;				\
51 		asm volatile ("# local_irq_save	\n\t"		\
52 				"mfs	%0, rmsr \n\t"		\
53 				"nop \n\t"			\
54 				"andi	%1, %0, %2 \n\t"	\
55 				"mts	rmsr, %1 \n\t"		\
56 				"nop \n\t"			\
57 				: "=r"(flags), "=r" (tmp)	\
58 				: "i"(~MSR_IE)			\
59 				: "memory");			\
60 	} while (0)
61 
62 # define local_irq_disable()					\
63 	do {							\
64 		register unsigned tmp;				\
65 		asm volatile ("# local_irq_disable \n\t"	\
66 				"mfs	%0, rmsr \n\t"		\
67 				"nop \n\t"			\
68 				"andi	%0, %0, %1 \n\t"	\
69 				"mts	rmsr, %0 \n\t"		\
70 				"nop \n\t"			\
71 				: "=r"(tmp)			\
72 				: "i"(~MSR_IE)			\
73 				: "memory");			\
74 	} while (0)
75 
76 # define local_irq_enable()					\
77 	do {							\
78 		register unsigned tmp;				\
79 		asm volatile ("# local_irq_enable \n\t"		\
80 				"mfs	%0, rmsr \n\t"		\
81 				"nop \n\t"			\
82 				"ori	%0, %0, %1 \n\t"	\
83 				"mts	rmsr, %0 \n\t"		\
84 				"nop \n\t"			\
85 				: "=r"(tmp)			\
86 				: "i"(MSR_IE)			\
87 				: "memory");			\
88 	} while (0)
89 
90 # endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
91 
92 #define local_save_flags(flags)					\
93 	do {							\
94 		asm volatile ("# local_save_flags \n\t"		\
95 				"mfs	%0, rmsr \n\t"		\
96 				"nop	\n\t"			\
97 				: "=r"(flags)			\
98 				:				\
99 				: "memory");			\
100 	} while (0)
101 
102 #define local_irq_restore(flags)			\
103 	do {						\
104 		asm volatile ("# local_irq_restore \n\t"\
105 				"mts	rmsr, %0 \n\t"	\
106 				"nop	\n\t"		\
107 				:			\
108 				: "r"(flags)		\
109 				: "memory");		\
110 	} while (0)
111 
112 static inline int irqs_disabled(void)
113 {
114 	unsigned long flags;
115 
116 	local_save_flags(flags);
117 	return ((flags & MSR_IE) == 0);
118 }
119 
120 #define raw_irqs_disabled irqs_disabled
121 #define raw_irqs_disabled_flags(flags)	((flags) == 0)
122 
123 #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */
124