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