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>
134dbdc9a5SMichal Simek 
144dbdc9a5SMichal Simek # if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
154dbdc9a5SMichal Simek 
164dbdc9a5SMichal Simek # define local_irq_save(flags)				\
174dbdc9a5SMichal Simek 	do {						\
184dbdc9a5SMichal Simek 		asm volatile ("# local_irq_save	\n\t"	\
194dbdc9a5SMichal Simek 				"msrclr %0, %1	\n\t"	\
204dbdc9a5SMichal Simek 				"nop	\n\t"		\
214dbdc9a5SMichal Simek 				: "=r"(flags)		\
224dbdc9a5SMichal Simek 				: "i"(MSR_IE)		\
234dbdc9a5SMichal Simek 				: "memory");		\
244dbdc9a5SMichal Simek 	} while (0)
254dbdc9a5SMichal Simek 
264dbdc9a5SMichal Simek # define local_irq_disable()					\
274dbdc9a5SMichal Simek 	do {							\
284dbdc9a5SMichal Simek 		asm volatile ("# local_irq_disable \n\t"	\
294dbdc9a5SMichal Simek 				"msrclr r0, %0 \n\t"		\
304dbdc9a5SMichal Simek 				"nop	\n\t"			\
314dbdc9a5SMichal Simek 				:				\
324dbdc9a5SMichal Simek 				: "i"(MSR_IE)			\
334dbdc9a5SMichal Simek 				: "memory");			\
344dbdc9a5SMichal Simek 	} while (0)
354dbdc9a5SMichal Simek 
364dbdc9a5SMichal Simek # define local_irq_enable()					\
374dbdc9a5SMichal Simek 	do {							\
384dbdc9a5SMichal Simek 		asm volatile ("# local_irq_enable \n\t"		\
394dbdc9a5SMichal Simek 				"msrset	r0, %0 \n\t"		\
404dbdc9a5SMichal Simek 				"nop	\n\t"			\
414dbdc9a5SMichal Simek 				:				\
424dbdc9a5SMichal Simek 				: "i"(MSR_IE)			\
434dbdc9a5SMichal Simek 				: "memory");			\
444dbdc9a5SMichal Simek 	} while (0)
454dbdc9a5SMichal Simek 
464dbdc9a5SMichal Simek # else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */
474dbdc9a5SMichal Simek 
484dbdc9a5SMichal Simek # define local_irq_save(flags)					\
494dbdc9a5SMichal Simek 	do {							\
504dbdc9a5SMichal Simek 		register unsigned tmp;				\
514dbdc9a5SMichal Simek 		asm volatile ("# local_irq_save	\n\t"		\
524dbdc9a5SMichal Simek 				"mfs	%0, rmsr \n\t"		\
534dbdc9a5SMichal Simek 				"nop \n\t"			\
544dbdc9a5SMichal Simek 				"andi	%1, %0, %2 \n\t"	\
554dbdc9a5SMichal Simek 				"mts	rmsr, %1 \n\t"		\
564dbdc9a5SMichal Simek 				"nop \n\t"			\
574dbdc9a5SMichal Simek 				: "=r"(flags), "=r" (tmp)	\
584dbdc9a5SMichal Simek 				: "i"(~MSR_IE)			\
594dbdc9a5SMichal Simek 				: "memory");			\
604dbdc9a5SMichal Simek 	} while (0)
614dbdc9a5SMichal Simek 
624dbdc9a5SMichal Simek # define local_irq_disable()					\
634dbdc9a5SMichal Simek 	do {							\
644dbdc9a5SMichal Simek 		register unsigned tmp;				\
654dbdc9a5SMichal Simek 		asm volatile ("# local_irq_disable \n\t"	\
664dbdc9a5SMichal Simek 				"mfs	%0, rmsr \n\t"		\
674dbdc9a5SMichal Simek 				"nop \n\t"			\
684dbdc9a5SMichal Simek 				"andi	%0, %0, %1 \n\t"	\
694dbdc9a5SMichal Simek 				"mts	rmsr, %0 \n\t"		\
704dbdc9a5SMichal Simek 				"nop \n\t"			\
714dbdc9a5SMichal Simek 				: "=r"(tmp)			\
724dbdc9a5SMichal Simek 				: "i"(~MSR_IE)			\
734dbdc9a5SMichal Simek 				: "memory");			\
744dbdc9a5SMichal Simek 	} while (0)
754dbdc9a5SMichal Simek 
764dbdc9a5SMichal Simek # define local_irq_enable()					\
774dbdc9a5SMichal Simek 	do {							\
784dbdc9a5SMichal Simek 		register unsigned tmp;				\
794dbdc9a5SMichal Simek 		asm volatile ("# local_irq_enable \n\t"		\
804dbdc9a5SMichal Simek 				"mfs	%0, rmsr \n\t"		\
814dbdc9a5SMichal Simek 				"nop \n\t"			\
824dbdc9a5SMichal Simek 				"ori	%0, %0, %1 \n\t"	\
834dbdc9a5SMichal Simek 				"mts	rmsr, %0 \n\t"		\
844dbdc9a5SMichal Simek 				"nop \n\t"			\
854dbdc9a5SMichal Simek 				: "=r"(tmp)			\
864dbdc9a5SMichal Simek 				: "i"(MSR_IE)			\
874dbdc9a5SMichal Simek 				: "memory");			\
884dbdc9a5SMichal Simek 	} while (0)
894dbdc9a5SMichal Simek 
904dbdc9a5SMichal Simek # endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
914dbdc9a5SMichal Simek 
924dbdc9a5SMichal Simek #define local_save_flags(flags)					\
934dbdc9a5SMichal Simek 	do {							\
944dbdc9a5SMichal Simek 		asm volatile ("# local_save_flags \n\t"		\
954dbdc9a5SMichal Simek 				"mfs	%0, rmsr \n\t"		\
964dbdc9a5SMichal Simek 				"nop	\n\t"			\
974dbdc9a5SMichal Simek 				: "=r"(flags)			\
984dbdc9a5SMichal Simek 				:				\
994dbdc9a5SMichal Simek 				: "memory");			\
1004dbdc9a5SMichal Simek 	} while (0)
1014dbdc9a5SMichal Simek 
1024dbdc9a5SMichal Simek #define local_irq_restore(flags)			\
1034dbdc9a5SMichal Simek 	do {						\
1044dbdc9a5SMichal Simek 		asm volatile ("# local_irq_restore \n\t"\
1054dbdc9a5SMichal Simek 				"mts	rmsr, %0 \n\t"	\
1064dbdc9a5SMichal Simek 				"nop	\n\t"		\
1074dbdc9a5SMichal Simek 				:			\
1084dbdc9a5SMichal Simek 				: "r"(flags)		\
1094dbdc9a5SMichal Simek 				: "memory");		\
1104dbdc9a5SMichal Simek 	} while (0)
1114dbdc9a5SMichal Simek 
1124dbdc9a5SMichal Simek static inline int irqs_disabled(void)
1134dbdc9a5SMichal Simek {
1144dbdc9a5SMichal Simek 	unsigned long flags;
1154dbdc9a5SMichal Simek 
1164dbdc9a5SMichal Simek 	local_save_flags(flags);
1174dbdc9a5SMichal Simek 	return ((flags & MSR_IE) == 0);
1184dbdc9a5SMichal Simek }
1194dbdc9a5SMichal Simek 
1204dbdc9a5SMichal Simek #define raw_irqs_disabled irqs_disabled
1214dbdc9a5SMichal Simek #define raw_irqs_disabled_flags(flags)	((flags) == 0)
1224dbdc9a5SMichal Simek 
1234dbdc9a5SMichal Simek #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */
124