162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _ASM_IRQFLAGS_H
662306a36Sopenharmony_ci#define _ASM_IRQFLAGS_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __ASSEMBLY__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/compiler.h>
1162306a36Sopenharmony_ci#include <linux/stringify.h>
1262306a36Sopenharmony_ci#include <asm/loongarch.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic inline void arch_local_irq_enable(void)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	u32 flags = CSR_CRMD_IE;
1762306a36Sopenharmony_ci	__asm__ __volatile__(
1862306a36Sopenharmony_ci		"csrxchg %[val], %[mask], %[reg]\n\t"
1962306a36Sopenharmony_ci		: [val] "+r" (flags)
2062306a36Sopenharmony_ci		: [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD)
2162306a36Sopenharmony_ci		: "memory");
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic inline void arch_local_irq_disable(void)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	u32 flags = 0;
2762306a36Sopenharmony_ci	__asm__ __volatile__(
2862306a36Sopenharmony_ci		"csrxchg %[val], %[mask], %[reg]\n\t"
2962306a36Sopenharmony_ci		: [val] "+r" (flags)
3062306a36Sopenharmony_ci		: [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD)
3162306a36Sopenharmony_ci		: "memory");
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic inline unsigned long arch_local_irq_save(void)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	u32 flags = 0;
3762306a36Sopenharmony_ci	__asm__ __volatile__(
3862306a36Sopenharmony_ci		"csrxchg %[val], %[mask], %[reg]\n\t"
3962306a36Sopenharmony_ci		: [val] "+r" (flags)
4062306a36Sopenharmony_ci		: [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD)
4162306a36Sopenharmony_ci		: "memory");
4262306a36Sopenharmony_ci	return flags;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic inline void arch_local_irq_restore(unsigned long flags)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	__asm__ __volatile__(
4862306a36Sopenharmony_ci		"csrxchg %[val], %[mask], %[reg]\n\t"
4962306a36Sopenharmony_ci		: [val] "+r" (flags)
5062306a36Sopenharmony_ci		: [mask] "r" (CSR_CRMD_IE), [reg] "i" (LOONGARCH_CSR_CRMD)
5162306a36Sopenharmony_ci		: "memory");
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline unsigned long arch_local_save_flags(void)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	u32 flags;
5762306a36Sopenharmony_ci	__asm__ __volatile__(
5862306a36Sopenharmony_ci		"csrrd %[val], %[reg]\n\t"
5962306a36Sopenharmony_ci		: [val] "=r" (flags)
6062306a36Sopenharmony_ci		: [reg] "i" (LOONGARCH_CSR_CRMD)
6162306a36Sopenharmony_ci		: "memory");
6262306a36Sopenharmony_ci	return flags;
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline int arch_irqs_disabled_flags(unsigned long flags)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	return !(flags & CSR_CRMD_IE);
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistatic inline int arch_irqs_disabled(void)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	return arch_irqs_disabled_flags(arch_local_save_flags());
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#endif /* #ifndef __ASSEMBLY__ */
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#endif /* _ASM_IRQFLAGS_H */
78