• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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