1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_SCORE_IRQFLAGS_H
3 #define _ASM_SCORE_IRQFLAGS_H
4
5 #ifndef __ASSEMBLY__
6
7 #include <linux/types.h>
8
arch_local_save_flags(void)9 static inline unsigned long arch_local_save_flags(void)
10 {
11 unsigned long flags;
12
13 asm volatile(
14 " mfcr r8, cr0 \n"
15 " nop \n"
16 " nop \n"
17 " mv %0, r8 \n"
18 " nop \n"
19 " nop \n"
20 " nop \n"
21 " nop \n"
22 " nop \n"
23 " ldi r9, 0x1 \n"
24 " and %0, %0, r9 \n"
25 : "=r" (flags)
26 :
27 : "r8", "r9");
28 return flags;
29 }
30
arch_local_irq_save(void)31 static inline unsigned long arch_local_irq_save(void)
32 {
33 unsigned long flags;
34
35 asm volatile(
36 " mfcr r8, cr0 \n"
37 " li r9, 0xfffffffe \n"
38 " nop \n"
39 " mv %0, r8 \n"
40 " and r8, r8, r9 \n"
41 " mtcr r8, cr0 \n"
42 " nop \n"
43 " nop \n"
44 " nop \n"
45 " nop \n"
46 " nop \n"
47 : "=r" (flags)
48 :
49 : "r8", "r9", "memory");
50
51 return flags;
52 }
53
arch_local_irq_restore(unsigned long flags)54 static inline void arch_local_irq_restore(unsigned long flags)
55 {
56 asm volatile(
57 " mfcr r8, cr0 \n"
58 " ldi r9, 0x1 \n"
59 " and %0, %0, r9 \n"
60 " or r8, r8, %0 \n"
61 " mtcr r8, cr0 \n"
62 " nop \n"
63 " nop \n"
64 " nop \n"
65 " nop \n"
66 " nop \n"
67 :
68 : "r"(flags)
69 : "r8", "r9", "memory");
70 }
71
arch_local_irq_enable(void)72 static inline void arch_local_irq_enable(void)
73 {
74 asm volatile(
75 " mfcr r8,cr0 \n"
76 " nop \n"
77 " nop \n"
78 " ori r8,0x1 \n"
79 " mtcr r8,cr0 \n"
80 " nop \n"
81 " nop \n"
82 " nop \n"
83 " nop \n"
84 " nop \n"
85 :
86 :
87 : "r8", "memory");
88 }
89
arch_local_irq_disable(void)90 static inline void arch_local_irq_disable(void)
91 {
92 asm volatile(
93 " mfcr r8,cr0 \n"
94 " nop \n"
95 " nop \n"
96 " srli r8,r8,1 \n"
97 " slli r8,r8,1 \n"
98 " mtcr r8,cr0 \n"
99 " nop \n"
100 " nop \n"
101 " nop \n"
102 " nop \n"
103 " nop \n"
104 :
105 :
106 : "r8", "memory");
107 }
108
arch_irqs_disabled_flags(unsigned long flags)109 static inline bool arch_irqs_disabled_flags(unsigned long flags)
110 {
111 return !(flags & 1);
112 }
113
arch_irqs_disabled(void)114 static inline bool arch_irqs_disabled(void)
115 {
116 return arch_irqs_disabled_flags(arch_local_save_flags());
117 }
118
119 #endif /* __ASSEMBLY__ */
120
121 #endif /* _ASM_SCORE_IRQFLAGS_H */
122