barrier.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copied from the kernel sources:
  4. *
  5. * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
  6. */
  7. #ifndef _TOOLS_LINUX_ASM_POWERPC_BARRIER_H
  8. #define _TOOLS_LINUX_ASM_POWERPC_BARRIER_H
  9. /*
  10. * Memory barrier.
  11. * The sync instruction guarantees that all memory accesses initiated
  12. * by this processor have been performed (with respect to all other
  13. * mechanisms that access memory). The eieio instruction is a barrier
  14. * providing an ordering (separately) for (a) cacheable stores and (b)
  15. * loads and stores to non-cacheable memory (e.g. I/O devices).
  16. *
  17. * mb() prevents loads and stores being reordered across this point.
  18. * rmb() prevents loads being reordered across this point.
  19. * wmb() prevents stores being reordered across this point.
  20. *
  21. * *mb() variants without smp_ prefix must order all types of memory
  22. * operations with one another. sync is the only instruction sufficient
  23. * to do this.
  24. */
  25. #define mb() __asm__ __volatile__ ("sync" : : : "memory")
  26. #define rmb() __asm__ __volatile__ ("sync" : : : "memory")
  27. #define wmb() __asm__ __volatile__ ("sync" : : : "memory")
  28. #if defined(__powerpc64__)
  29. #define smp_lwsync() __asm__ __volatile__ ("lwsync" : : : "memory")
  30. #define smp_store_release(p, v) \
  31. do { \
  32. smp_lwsync(); \
  33. WRITE_ONCE(*p, v); \
  34. } while (0)
  35. #define smp_load_acquire(p) \
  36. ({ \
  37. typeof(*p) ___p1 = READ_ONCE(*p); \
  38. smp_lwsync(); \
  39. ___p1; \
  40. })
  41. #endif /* defined(__powerpc64__) */
  42. #endif /* _TOOLS_LINUX_ASM_POWERPC_BARRIER_H */