system.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (C) 2011 Andes Technology Corporation
  3. * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #ifndef __ASM_NDS_SYSTEM_H
  8. #define __ASM_NDS_SYSTEM_H
  9. /*
  10. * Interrupt configuring macros.
  11. */
  12. extern int irq_flags;
  13. #define local_irq_enable() \
  14. __asm__ __volatile__ ( \
  15. "mfsr %0, $psw\n\t" \
  16. "andi %0, %0, 0x1\n\t" \
  17. "setgie.e\n\t" \
  18. : \
  19. : "r" (irq_flags) \
  20. )
  21. #define local_irq_disable() \
  22. do { \
  23. int __tmp_dummy; \
  24. __asm__ __volatile__ ( \
  25. "mfsr %0, $psw\n\t" \
  26. "andi %0, %0, 0x1\n\t" \
  27. "setgie.d\n\t" \
  28. "dsb\n\t" \
  29. : "=r" (__tmp_dummy) \
  30. ); \
  31. } while (0)
  32. #define local_irq_save(x) \
  33. __asm__ __volatile__ ( \
  34. "mfsr %0, $psw\n\t" \
  35. "andi %0, %0, 0x1\n\t" \
  36. "setgie.d\n\t" \
  37. "dsb\n\t" \
  38. : "=&r" (x) \
  39. )
  40. #define local_save_flags(x) \
  41. __asm__ __volatile__ ( \
  42. "mfsr %0, $psw\n\t" \
  43. "andi %0, %0, 0x1\n\t" \
  44. "setgie.e\n\t" \
  45. "setgie.d\n\t" \
  46. : "=r" (x) \
  47. )
  48. #define irqs_enabled_from_flags(x) ((x) != 0x1f)
  49. #define local_irq_restore(x) \
  50. do { \
  51. if (irqs_enabled_from_flags(x)) \
  52. local_irq_enable(); \
  53. } while (0)
  54. /*
  55. * Force strict CPU ordering.
  56. */
  57. #define nop() asm volatile ("nop;\n\t" : : )
  58. #define mb() asm volatile ("" : : : "memory")
  59. #define rmb() asm volatile ("" : : : "memory")
  60. #define wmb() asm volatile ("" : : : "memory")
  61. #endif /* __ASM_NDS_SYSTEM_H */