Commit | Line | Data |
---|---|---|
4dbdc9a5 MS |
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 | ||
df9ee292 | 12 | #include <linux/types.h> |
a3cd613b | 13 | #include <asm/registers.h> |
4dbdc9a5 | 14 | |
12dfc73e | 15 | #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR |
df9ee292 | 16 | |
a2f52699 | 17 | static inline notrace unsigned long arch_local_irq_save(void) |
df9ee292 DH |
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 | ||
a2f52699 | 28 | static inline notrace void arch_local_irq_disable(void) |
df9ee292 DH |
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 | ||
a2f52699 | 38 | static inline notrace void arch_local_irq_enable(void) |
df9ee292 DH |
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 | ||
a2f52699 | 50 | static inline notrace unsigned long arch_local_irq_save(void) |
df9ee292 DH |
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 | ||
a2f52699 | 64 | static inline notrace void arch_local_irq_disable(void) |
df9ee292 DH |
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 | ||
a2f52699 | 77 | static inline notrace void arch_local_irq_enable(void) |
df9ee292 DH |
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 | ||
a2f52699 | 92 | static inline notrace unsigned long arch_local_save_flags(void) |
4dbdc9a5 MS |
93 | { |
94 | unsigned long flags; | |
df9ee292 DH |
95 | asm volatile(" mfs %0, rmsr \n" |
96 | " nop \n" | |
97 | : "=r"(flags) | |
98 | : | |
99 | : "memory"); | |
a3cd613b | 100 | return flags; |
4dbdc9a5 MS |
101 | } |
102 | ||
a2f52699 | 103 | static inline notrace void arch_local_irq_restore(unsigned long flags) |
df9ee292 DH |
104 | { |
105 | asm volatile(" mts rmsr, %0 \n" | |
106 | " nop \n" | |
107 | : | |
108 | : "r"(flags) | |
109 | : "memory"); | |
110 | } | |
111 | ||
a2f52699 | 112 | static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) |
df9ee292 DH |
113 | { |
114 | return (flags & MSR_IE) == 0; | |
115 | } | |
116 | ||
a2f52699 | 117 | static inline notrace bool arch_irqs_disabled(void) |
df9ee292 DH |
118 | { |
119 | return arch_irqs_disabled_flags(arch_local_save_flags()); | |
120 | } | |
4dbdc9a5 MS |
121 | |
122 | #endif /* _ASM_MICROBLAZE_IRQFLAGS_H */ |