162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <linux/compiler.h>
362306a36Sopenharmony_ci#if defined(__i386__) || defined(__x86_64__)
462306a36Sopenharmony_ci#include "../../arch/x86/include/asm/barrier.h"
562306a36Sopenharmony_ci#elif defined(__arm__)
662306a36Sopenharmony_ci#include "../../arch/arm/include/asm/barrier.h"
762306a36Sopenharmony_ci#elif defined(__aarch64__)
862306a36Sopenharmony_ci#include "../../arch/arm64/include/asm/barrier.h"
962306a36Sopenharmony_ci#elif defined(__powerpc__)
1062306a36Sopenharmony_ci#include "../../arch/powerpc/include/asm/barrier.h"
1162306a36Sopenharmony_ci#elif defined(__s390__)
1262306a36Sopenharmony_ci#include "../../arch/s390/include/asm/barrier.h"
1362306a36Sopenharmony_ci#elif defined(__sh__)
1462306a36Sopenharmony_ci#include "../../arch/sh/include/asm/barrier.h"
1562306a36Sopenharmony_ci#elif defined(__sparc__)
1662306a36Sopenharmony_ci#include "../../arch/sparc/include/asm/barrier.h"
1762306a36Sopenharmony_ci#elif defined(__tile__)
1862306a36Sopenharmony_ci#include "../../arch/tile/include/asm/barrier.h"
1962306a36Sopenharmony_ci#elif defined(__alpha__)
2062306a36Sopenharmony_ci#include "../../arch/alpha/include/asm/barrier.h"
2162306a36Sopenharmony_ci#elif defined(__mips__)
2262306a36Sopenharmony_ci#include "../../arch/mips/include/asm/barrier.h"
2362306a36Sopenharmony_ci#elif defined(__ia64__)
2462306a36Sopenharmony_ci#include "../../arch/ia64/include/asm/barrier.h"
2562306a36Sopenharmony_ci#elif defined(__xtensa__)
2662306a36Sopenharmony_ci#include "../../arch/xtensa/include/asm/barrier.h"
2762306a36Sopenharmony_ci#else
2862306a36Sopenharmony_ci#include <asm-generic/barrier.h>
2962306a36Sopenharmony_ci#endif
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/*
3262306a36Sopenharmony_ci * Generic fallback smp_*() definitions for archs that haven't
3362306a36Sopenharmony_ci * been updated yet.
3462306a36Sopenharmony_ci */
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#ifndef smp_rmb
3762306a36Sopenharmony_ci# define smp_rmb()	rmb()
3862306a36Sopenharmony_ci#endif
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#ifndef smp_wmb
4162306a36Sopenharmony_ci# define smp_wmb()	wmb()
4262306a36Sopenharmony_ci#endif
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#ifndef smp_mb
4562306a36Sopenharmony_ci# define smp_mb()	mb()
4662306a36Sopenharmony_ci#endif
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#ifndef smp_store_release
4962306a36Sopenharmony_ci# define smp_store_release(p, v)		\
5062306a36Sopenharmony_cido {						\
5162306a36Sopenharmony_ci	smp_mb();				\
5262306a36Sopenharmony_ci	WRITE_ONCE(*p, v);			\
5362306a36Sopenharmony_ci} while (0)
5462306a36Sopenharmony_ci#endif
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#ifndef smp_load_acquire
5762306a36Sopenharmony_ci# define smp_load_acquire(p)			\
5862306a36Sopenharmony_ci({						\
5962306a36Sopenharmony_ci	typeof(*p) ___p1 = READ_ONCE(*p);	\
6062306a36Sopenharmony_ci	smp_mb();				\
6162306a36Sopenharmony_ci	___p1;					\
6262306a36Sopenharmony_ci})
6362306a36Sopenharmony_ci#endif
64