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 17static inline notrace 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 28static inline notrace 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 38static inline notrace 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 50static inline notrace 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 64static inline notrace 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 77static inline notrace 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 92static inline notrace 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 103static inline notrace 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 112static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) 113{ 114 return (flags & MSR_IE) == 0; 115} 116 117static inline notrace 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