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/types.h> 13 #include <asm/registers.h> 14 15 #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR 16 17 static inline unsigned long arch_local_irq_save(void) 18 { 19 unsigned long flags; 20 asm volatile(" msrclr %0, %1 \n" 21 " nop \n" 22 : "=r"(flags) 23 : "i"(MSR_IE) 24 : "memory"); 25 return flags; 26 } 27 28 static inline void arch_local_irq_disable(void) 29 { 30 /* this uses r0 without declaring it - is that correct? */ 31 asm volatile(" msrclr r0, %0 \n" 32 " nop \n" 33 : 34 : "i"(MSR_IE) 35 : "memory"); 36 } 37 38 static inline void arch_local_irq_enable(void) 39 { 40 /* this uses r0 without declaring it - is that correct? */ 41 asm volatile(" msrset r0, %0 \n" 42 " nop \n" 43 : 44 : "i"(MSR_IE) 45 : "memory"); 46 } 47 48 #else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ 49 50 static inline unsigned long arch_local_irq_save(void) 51 { 52 unsigned long flags, tmp; 53 asm volatile (" mfs %0, rmsr \n" 54 " nop \n" 55 " andi %1, %0, %2 \n" 56 " mts rmsr, %1 \n" 57 " nop \n" 58 : "=r"(flags), "=r"(tmp) 59 : "i"(~MSR_IE) 60 : "memory"); 61 return flags; 62 } 63 64 static inline void arch_local_irq_disable(void) 65 { 66 unsigned long tmp; 67 asm volatile(" mfs %0, rmsr \n" 68 " nop \n" 69 " andi %0, %0, %1 \n" 70 " mts rmsr, %0 \n" 71 " nop \n" 72 : "=r"(tmp) 73 : "i"(~MSR_IE) 74 : "memory"); 75 } 76 77 static inline void arch_local_irq_enable(void) 78 { 79 unsigned long tmp; 80 asm volatile(" mfs %0, rmsr \n" 81 " nop \n" 82 " ori %0, %0, %1 \n" 83 " mts rmsr, %0 \n" 84 " nop \n" 85 : "=r"(tmp) 86 : "i"(MSR_IE) 87 : "memory"); 88 } 89 90 #endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ 91 92 static inline unsigned long arch_local_save_flags(void) 93 { 94 unsigned long flags; 95 asm volatile(" mfs %0, rmsr \n" 96 " nop \n" 97 : "=r"(flags) 98 : 99 : "memory"); 100 return flags; 101 } 102 103 static inline void arch_local_irq_restore(unsigned long flags) 104 { 105 asm volatile(" mts rmsr, %0 \n" 106 " nop \n" 107 : 108 : "r"(flags) 109 : "memory"); 110 } 111 112 static inline bool arch_irqs_disabled_flags(unsigned long flags) 113 { 114 return (flags & MSR_IE) == 0; 115 } 116 117 static inline bool arch_irqs_disabled(void) 118 { 119 return arch_irqs_disabled_flags(arch_local_save_flags()); 120 } 121 122 #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */ 123