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