system.h 1.4 KB

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