irqflags.h 1.8 KB

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