14dbdc9a5SMichal Simek /*
24dbdc9a5SMichal Simek  * Copyright (C) 2006 Atmark Techno, Inc.
34dbdc9a5SMichal Simek  *
44dbdc9a5SMichal Simek  * This file is subject to the terms and conditions of the GNU General Public
54dbdc9a5SMichal Simek  * License. See the file "COPYING" in the main directory of this archive
64dbdc9a5SMichal Simek  * for more details.
74dbdc9a5SMichal Simek  */
84dbdc9a5SMichal Simek 
94dbdc9a5SMichal Simek #ifndef _ASM_MICROBLAZE_IRQFLAGS_H
104dbdc9a5SMichal Simek #define _ASM_MICROBLAZE_IRQFLAGS_H
114dbdc9a5SMichal Simek 
124dbdc9a5SMichal Simek #include <linux/irqflags.h>
13a3cd613bSMichal Simek #include <asm/registers.h>
144dbdc9a5SMichal Simek 
154dbdc9a5SMichal Simek # if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
164dbdc9a5SMichal Simek 
17a3cd613bSMichal Simek # define raw_local_irq_save(flags)			\
184dbdc9a5SMichal Simek 	do {						\
19a3cd613bSMichal Simek 		asm volatile ("	msrclr %0, %1;		\
20a3cd613bSMichal Simek 				nop;"			\
214dbdc9a5SMichal Simek 				: "=r"(flags)		\
224dbdc9a5SMichal Simek 				: "i"(MSR_IE)		\
234dbdc9a5SMichal Simek 				: "memory");		\
244dbdc9a5SMichal Simek 	} while (0)
254dbdc9a5SMichal Simek 
26a3cd613bSMichal Simek # define raw_local_irq_disable()			\
274dbdc9a5SMichal Simek 	do {						\
28a3cd613bSMichal Simek 		asm volatile ("	msrclr r0, %0;		\
29a3cd613bSMichal Simek 				nop;"			\
304dbdc9a5SMichal Simek 				:			\
314dbdc9a5SMichal Simek 				: "i"(MSR_IE)		\
324dbdc9a5SMichal Simek 				: "memory");		\
334dbdc9a5SMichal Simek 	} while (0)
344dbdc9a5SMichal Simek 
35a3cd613bSMichal Simek # define raw_local_irq_enable()				\
364dbdc9a5SMichal Simek 	do {						\
37a3cd613bSMichal Simek 		asm volatile ("	msrset	r0, %0;		\
38a3cd613bSMichal Simek 				nop;"			\
394dbdc9a5SMichal Simek 				:			\
404dbdc9a5SMichal Simek 				: "i"(MSR_IE)		\
414dbdc9a5SMichal Simek 				: "memory");		\
424dbdc9a5SMichal Simek 	} while (0)
434dbdc9a5SMichal Simek 
444dbdc9a5SMichal Simek # else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */
454dbdc9a5SMichal Simek 
46a3cd613bSMichal Simek # define raw_local_irq_save(flags)				\
474dbdc9a5SMichal Simek 	do {							\
484dbdc9a5SMichal Simek 		register unsigned tmp;				\
49a3cd613bSMichal Simek 		asm volatile ("	mfs	%0, rmsr;		\
50a3cd613bSMichal Simek 				nop;				\
51a3cd613bSMichal Simek 				andi	%1, %0, %2;		\
52a3cd613bSMichal Simek 				mts	rmsr, %1;		\
53a3cd613bSMichal Simek 				nop;"				\
544dbdc9a5SMichal Simek 				: "=r"(flags), "=r" (tmp)	\
554dbdc9a5SMichal Simek 				: "i"(~MSR_IE)			\
564dbdc9a5SMichal Simek 				: "memory");			\
574dbdc9a5SMichal Simek 	} while (0)
584dbdc9a5SMichal Simek 
59a3cd613bSMichal Simek # define raw_local_irq_disable()				\
604dbdc9a5SMichal Simek 	do {							\
614dbdc9a5SMichal Simek 		register unsigned tmp;				\
62a3cd613bSMichal Simek 		asm volatile ("	mfs	%0, rmsr;		\
63a3cd613bSMichal Simek 				nop;				\
64a3cd613bSMichal Simek 				andi	%0, %0, %1;		\
65a3cd613bSMichal Simek 				mts	rmsr, %0;		\
66a3cd613bSMichal Simek 				nop;"			\
674dbdc9a5SMichal Simek 				: "=r"(tmp)			\
684dbdc9a5SMichal Simek 				: "i"(~MSR_IE)			\
694dbdc9a5SMichal Simek 				: "memory");			\
704dbdc9a5SMichal Simek 	} while (0)
714dbdc9a5SMichal Simek 
72a3cd613bSMichal Simek # define raw_local_irq_enable()					\
734dbdc9a5SMichal Simek 	do {							\
744dbdc9a5SMichal Simek 		register unsigned tmp;				\
75a3cd613bSMichal Simek 		asm volatile ("	mfs	%0, rmsr;		\
76a3cd613bSMichal Simek 				nop;				\
77a3cd613bSMichal Simek 				ori	%0, %0, %1;		\
78a3cd613bSMichal Simek 				mts	rmsr, %0;		\
79a3cd613bSMichal Simek 				nop;"				\
804dbdc9a5SMichal Simek 				: "=r"(tmp)			\
814dbdc9a5SMichal Simek 				: "i"(MSR_IE)			\
824dbdc9a5SMichal Simek 				: "memory");			\
834dbdc9a5SMichal Simek 	} while (0)
844dbdc9a5SMichal Simek 
854dbdc9a5SMichal Simek # endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
864dbdc9a5SMichal Simek 
87a3cd613bSMichal Simek #define raw_local_irq_restore(flags)				\
884dbdc9a5SMichal Simek 	do {							\
89a3cd613bSMichal Simek 		asm volatile ("	mts	rmsr, %0;		\
90a3cd613bSMichal Simek 				nop;"				\
914dbdc9a5SMichal Simek 				:				\
924dbdc9a5SMichal Simek 				: "r"(flags)			\
934dbdc9a5SMichal Simek 				: "memory");			\
944dbdc9a5SMichal Simek 	} while (0)
954dbdc9a5SMichal Simek 
96a3cd613bSMichal Simek static inline unsigned long get_msr(void)
974dbdc9a5SMichal Simek {
984dbdc9a5SMichal Simek 	unsigned long flags;
99a3cd613bSMichal Simek 	asm volatile ("	mfs	%0, rmsr;	\
100a3cd613bSMichal Simek 			nop;"			\
101a3cd613bSMichal Simek 			: "=r"(flags)		\
102a3cd613bSMichal Simek 			:			\
103a3cd613bSMichal Simek 			: "memory");		\
104a3cd613bSMichal Simek 	return flags;
1054dbdc9a5SMichal Simek }
1064dbdc9a5SMichal Simek 
107a3cd613bSMichal Simek #define raw_local_save_flags(flags)	((flags) = get_msr())
108a3cd613bSMichal Simek #define raw_irqs_disabled()		((get_msr() & MSR_IE) == 0)
109a3cd613bSMichal Simek #define raw_irqs_disabled_flags(flags)	((flags & MSR_IE) == 0)
1104dbdc9a5SMichal Simek 
1114dbdc9a5SMichal Simek #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */
112