xref: /linux/arch/riscv/include/asm/irqflags.h (revision 90d32e92011eaae8e70a9169b4e7acf4ca8f9d3a)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2012 Regents of the University of California
4  */
5 
6 
7 #ifndef _ASM_RISCV_IRQFLAGS_H
8 #define _ASM_RISCV_IRQFLAGS_H
9 
10 #include <asm/csr.h>
11 
12 /* read interrupt enabled status */
13 static inline unsigned long arch_local_save_flags(void)
14 {
15 	return csr_read(CSR_STATUS);
16 }
17 
18 /* unconditionally enable interrupts */
19 static inline void arch_local_irq_enable(void)
20 {
21 	csr_set(CSR_STATUS, SR_IE);
22 }
23 
24 /* unconditionally disable interrupts */
25 static inline void arch_local_irq_disable(void)
26 {
27 	csr_clear(CSR_STATUS, SR_IE);
28 }
29 
30 /* get status and disable interrupts */
31 static inline unsigned long arch_local_irq_save(void)
32 {
33 	return csr_read_clear(CSR_STATUS, SR_IE);
34 }
35 
36 /* test flags */
37 static inline int arch_irqs_disabled_flags(unsigned long flags)
38 {
39 	return !(flags & SR_IE);
40 }
41 
42 /* test hardware interrupt enable bit */
43 static inline int arch_irqs_disabled(void)
44 {
45 	return arch_irqs_disabled_flags(arch_local_save_flags());
46 }
47 
48 /* set interrupt enabled status */
49 static inline void arch_local_irq_restore(unsigned long flags)
50 {
51 	csr_set(CSR_STATUS, flags & SR_IE);
52 }
53 
54 #endif /* _ASM_RISCV_IRQFLAGS_H */
55