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 __ASSEMBLY__ 9 10 #include <linux/compiler.h> 11 #include <linux/stringify.h> 12 #include <asm/compiler.h> 13 #include <asm/loongarch.h> 14 15 static inline void arch_local_irq_enable(void) 16 { 17 u32 flags = CSR_CRMD_IE; 18 __asm__ __volatile__( 19 "csrxchg %[val], %[mask], %[reg]\n\t" 20 : [val] "+r" (flags) 21 : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) 22 : "memory"); 23 } 24 25 static inline void arch_local_irq_disable(void) 26 { 27 u32 flags = 0; 28 __asm__ __volatile__( 29 "csrxchg %[val], %[mask], %[reg]\n\t" 30 : [val] "+r" (flags) 31 : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) 32 : "memory"); 33 } 34 35 static inline unsigned long arch_local_irq_save(void) 36 { 37 u32 flags = 0; 38 __asm__ __volatile__( 39 "csrxchg %[val], %[mask], %[reg]\n\t" 40 : [val] "+r" (flags) 41 : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) 42 : "memory"); 43 return flags; 44 } 45 46 static inline void arch_local_irq_restore(unsigned long flags) 47 { 48 __asm__ __volatile__( 49 "csrxchg %[val], %[mask], %[reg]\n\t" 50 : [val] "+r" (flags) 51 : [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD) 52 : "memory"); 53 } 54 55 static inline unsigned long arch_local_save_flags(void) 56 { 57 u32 flags; 58 __asm__ __volatile__( 59 "csrrd %[val], %[reg]\n\t" 60 : [val] "=r" (flags) 61 : [reg] "i" (LOONGARCH_CSR_CRMD) 62 : "memory"); 63 return flags; 64 } 65 66 static inline int arch_irqs_disabled_flags(unsigned long flags) 67 { 68 return !(flags & CSR_CRMD_IE); 69 } 70 71 static inline int arch_irqs_disabled(void) 72 { 73 return arch_irqs_disabled_flags(arch_local_save_flags()); 74 } 75 76 #endif /* #ifndef __ASSEMBLY__ */ 77 78 #endif /* _ASM_IRQFLAGS_H */ 79