irq.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #ifndef __IRQ_H
  2. #define __IRQ_H
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. #define CSR_MSTATUS_MIE 0x8
  7. #define CSR_IRQ_MASK 0xBC0
  8. #define CSR_IRQ_PENDING 0xFC0
  9. #define CSR_DCACHE_INFO 0xCC0
  10. #define csrr(reg) ({ unsigned long __tmp; \
  11. asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \
  12. __tmp; })
  13. #define csrw(reg, val) ({ \
  14. if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \
  15. asm volatile ("csrw " #reg ", %0" :: "i"(val)); \
  16. else \
  17. asm volatile ("csrw " #reg ", %0" :: "r"(val)); })
  18. #define csrs(reg, bit) ({ \
  19. if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \
  20. asm volatile ("csrrs x0, " #reg ", %0" :: "i"(bit)); \
  21. else \
  22. asm volatile ("csrrs x0, " #reg ", %0" :: "r"(bit)); })
  23. #define csrc(reg, bit) ({ \
  24. if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \
  25. asm volatile ("csrrc x0, " #reg ", %0" :: "i"(bit)); \
  26. else \
  27. asm volatile ("csrrc x0, " #reg ", %0" :: "r"(bit)); })
  28. static inline unsigned int irq_getie(void)
  29. {
  30. return (csrr(mstatus) & CSR_MSTATUS_MIE) != 0;
  31. }
  32. static inline void irq_setie(unsigned int ie)
  33. {
  34. if(ie) csrs(mstatus,CSR_MSTATUS_MIE); else csrc(mstatus,CSR_MSTATUS_MIE);
  35. }
  36. static inline unsigned int irq_getmask(void)
  37. {
  38. unsigned int mask;
  39. asm volatile ("csrr %0, %1" : "=r"(mask) : "i"(CSR_IRQ_MASK));
  40. return mask;
  41. }
  42. static inline void irq_setmask(unsigned int mask)
  43. {
  44. asm volatile ("csrw %0, %1" :: "i"(CSR_IRQ_MASK), "r"(mask));
  45. }
  46. static inline unsigned int irq_pending(void)
  47. {
  48. unsigned int pending;
  49. asm volatile ("csrr %0, %1" : "=r"(pending) : "i"(CSR_IRQ_PENDING));
  50. return pending;
  51. }
  52. #ifdef __cplusplus
  53. }
  54. #endif
  55. #endif /* __IRQ_H */