xref: /linux/arch/loongarch/include/asm/irqflags.h (revision ac1ad16f10523c2c60aef0abeb8a850ea6d06ced)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4  */
5 #ifndef _ASM_IRQFLAGS_H
6 #define _ASM_IRQFLAGS_H
7 
8 #ifndef __ASSEMBLER__
9 
10 #include <linux/compiler.h>
11 #include <linux/stringify.h>
12 #include <asm/loongarch.h>
13 
14 static inline void arch_local_irq_enable(void)
15 {
16 	u32 flags = CSR_CRMD_IE;
17 	register u32 mask asm("t0") = CSR_CRMD_IE;
18 
19 	__asm__ __volatile__(
20 		"csrxchg %[val], %[mask], %[reg]\n\t"
21 		: [val] "+r" (flags)
22 		: [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
23 		: "memory");
24 }
25 
26 static inline void arch_local_irq_disable(void)
27 {
28 	u32 flags = 0;
29 	register u32 mask asm("t0") = CSR_CRMD_IE;
30 
31 	__asm__ __volatile__(
32 		"csrxchg %[val], %[mask], %[reg]\n\t"
33 		: [val] "+r" (flags)
34 		: [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
35 		: "memory");
36 }
37 
38 static inline unsigned long arch_local_irq_save(void)
39 {
40 	u32 flags = 0;
41 	register u32 mask asm("t0") = CSR_CRMD_IE;
42 
43 	__asm__ __volatile__(
44 		"csrxchg %[val], %[mask], %[reg]\n\t"
45 		: [val] "+r" (flags)
46 		: [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
47 		: "memory");
48 	return flags;
49 }
50 
51 static inline void arch_local_irq_restore(unsigned long flags)
52 {
53 	register u32 mask asm("t0") = CSR_CRMD_IE;
54 
55 	__asm__ __volatile__(
56 		"csrxchg %[val], %[mask], %[reg]\n\t"
57 		: [val] "+r" (flags)
58 		: [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
59 		: "memory");
60 }
61 
62 static inline unsigned long arch_local_save_flags(void)
63 {
64 	u32 flags;
65 	__asm__ __volatile__(
66 		"csrrd %[val], %[reg]\n\t"
67 		: [val] "=r" (flags)
68 		: [reg] "i" (LOONGARCH_CSR_CRMD)
69 		: "memory");
70 	return flags;
71 }
72 
73 static inline int arch_irqs_disabled_flags(unsigned long flags)
74 {
75 	return !(flags & CSR_CRMD_IE);
76 }
77 
78 static inline int arch_irqs_disabled(void)
79 {
80 	return arch_irqs_disabled_flags(arch_local_save_flags());
81 }
82 
83 #endif /* #ifndef __ASSEMBLER__ */
84 
85 #endif /* _ASM_IRQFLAGS_H */
86