barrier.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __ASM_BARRIER_H
  3. #define __ASM_BARRIER_H
  4. #ifndef __ASSEMBLY__
  5. /* The synchronize caches instruction executes as a nop on systems in
  6. which all memory references are performed in order. */
  7. #define synchronize_caches() __asm__ __volatile__ ("sync" : : : "memory")
  8. #if defined(CONFIG_SMP)
  9. #define mb() do { synchronize_caches(); } while (0)
  10. #define rmb() mb()
  11. #define wmb() mb()
  12. #define dma_rmb() mb()
  13. #define dma_wmb() mb()
  14. #else
  15. #define mb() barrier()
  16. #define rmb() barrier()
  17. #define wmb() barrier()
  18. #define dma_rmb() barrier()
  19. #define dma_wmb() barrier()
  20. #endif
  21. #define __smp_mb() mb()
  22. #define __smp_rmb() mb()
  23. #define __smp_wmb() mb()
  24. #define __smp_store_release(p, v) \
  25. do { \
  26. typeof(p) __p = (p); \
  27. union { typeof(*p) __val; char __c[1]; } __u = \
  28. { .__val = (__force typeof(*p)) (v) }; \
  29. compiletime_assert_atomic_type(*p); \
  30. switch (sizeof(*p)) { \
  31. case 1: \
  32. asm volatile("stb,ma %0,0(%1)" \
  33. : : "r"(*(__u8 *)__u.__c), "r"(__p) \
  34. : "memory"); \
  35. break; \
  36. case 2: \
  37. asm volatile("sth,ma %0,0(%1)" \
  38. : : "r"(*(__u16 *)__u.__c), "r"(__p) \
  39. : "memory"); \
  40. break; \
  41. case 4: \
  42. asm volatile("stw,ma %0,0(%1)" \
  43. : : "r"(*(__u32 *)__u.__c), "r"(__p) \
  44. : "memory"); \
  45. break; \
  46. case 8: \
  47. if (IS_ENABLED(CONFIG_64BIT)) \
  48. asm volatile("std,ma %0,0(%1)" \
  49. : : "r"(*(__u64 *)__u.__c), "r"(__p) \
  50. : "memory"); \
  51. break; \
  52. } \
  53. } while (0)
  54. #define __smp_load_acquire(p) \
  55. ({ \
  56. union { typeof(*p) __val; char __c[1]; } __u; \
  57. typeof(p) __p = (p); \
  58. compiletime_assert_atomic_type(*p); \
  59. switch (sizeof(*p)) { \
  60. case 1: \
  61. asm volatile("ldb,ma 0(%1),%0" \
  62. : "=r"(*(__u8 *)__u.__c) : "r"(__p) \
  63. : "memory"); \
  64. break; \
  65. case 2: \
  66. asm volatile("ldh,ma 0(%1),%0" \
  67. : "=r"(*(__u16 *)__u.__c) : "r"(__p) \
  68. : "memory"); \
  69. break; \
  70. case 4: \
  71. asm volatile("ldw,ma 0(%1),%0" \
  72. : "=r"(*(__u32 *)__u.__c) : "r"(__p) \
  73. : "memory"); \
  74. break; \
  75. case 8: \
  76. if (IS_ENABLED(CONFIG_64BIT)) \
  77. asm volatile("ldd,ma 0(%1),%0" \
  78. : "=r"(*(__u64 *)__u.__c) : "r"(__p) \
  79. : "memory"); \
  80. break; \
  81. } \
  82. __u.__val; \
  83. })
  84. #include <asm-generic/barrier.h>
  85. #endif /* !__ASSEMBLY__ */
  86. #endif /* __ASM_BARRIER_H */