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