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