GNU Linux-libre 4.4.287-gnu1
[releases.git] / arch / microblaze / include / asm / irqflags.h
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 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
28 static 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
38 static 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
50 static 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
64 static 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
77 static 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
92 static 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
103 static 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
112 static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
113 {
114         return (flags & MSR_IE) == 0;
115 }
116
117 static 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 */