spinlock.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #ifndef SYS_SPINLOCK_H
  2. #define SYS_SPINLOCK_H
  3. #include "typedef.h"
  4. #include "cpu.h"
  5. #include "irq.h"
  6. struct __spinlock {
  7. volatile u32 rwlock;
  8. };
  9. typedef struct __spinlock spinlock_t;
  10. #if 0//CPU_CORE_NUM > 1
  11. #define preempt_disable() \
  12. __local_irq_disable()
  13. #define preempt_enable() \
  14. __local_irq_enable()
  15. #else
  16. #define preempt_disable() \
  17. local_irq_disable()
  18. #define preempt_enable() \
  19. local_irq_enable()
  20. #endif
  21. #if 0//CPU_CORE_NUM > 1
  22. #define spin_acquire(lock) \
  23. do { \
  24. arch_spin_lock(lock); \
  25. }while(0)
  26. #define spin_release(lock) \
  27. do { \
  28. arch_spin_unlock(lock); \
  29. }while(0)
  30. #else
  31. #define spin_acquire(lock) \
  32. do { \
  33. }while(0)
  34. #define spin_release(lock) \
  35. do { \
  36. }while(0)
  37. #endif
  38. #define DEFINE_SPINLOCK(x) \
  39. spinlock_t x = { .rwlock = 0 }
  40. static inline void spin_lock_init(spinlock_t *lock)
  41. {
  42. lock->rwlock = 0;
  43. }
  44. extern u32 spin_lock_cnt[];
  45. #if 1
  46. static inline void spin_lock(spinlock_t *lock)
  47. {
  48. preempt_disable();
  49. /*ASSERT(spin_lock_cnt[current_cpu_id()] == 0);
  50. spin_lock_cnt[current_cpu_id()] = 1;*/
  51. spin_acquire(lock);
  52. }
  53. static inline void spin_unlock(spinlock_t *lock)
  54. {
  55. /*spin_lock_cnt[current_cpu_id()] = 0;*/
  56. spin_release(lock);
  57. preempt_enable();
  58. }
  59. #else
  60. #define spin_lock(lock) \
  61. do { \
  62. preempt_disable(); \
  63. if (!(T2_CON & (1<<0))) { \
  64. T2_CNT = 0; \
  65. T2_PRD = 120000000 / 10; \
  66. T2_CON = 1; \
  67. } \
  68. spin_lock_cnt[current_cpu_id()] = T2_CNT; \
  69. spin_acquire(lock); \
  70. } while (0)
  71. #define spin_unlock(lock) \
  72. do { \
  73. u32 t = T2_CNT;\
  74. if(t < spin_lock_cnt[current_cpu_id()]) \
  75. t += T2_PRD - spin_lock_cnt[current_cpu_id()]; \
  76. else \
  77. t -= spin_lock_cnt[current_cpu_id()]; \
  78. spin_release(lock); \
  79. preempt_enable(); \
  80. if (t > 100000) { /*120000 == 1ms*/ \
  81. printf("???????spinlock: %d, %s\n", t, __func__); \
  82. } \
  83. } while(0)
  84. #endif
  85. /*#define spin_lock_irqsave(lock, flags) \
  86. do { \
  87. local_irq_save(flags); \
  88. spin_acquire((lock)); \
  89. }while(0)
  90. #define spin_unlock_irqrestore(lock, flags) \
  91. do { \
  92. spin_release((lock)); \
  93. local_irq_restore(flags); \
  94. }while(0) */
  95. #endif