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