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