18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ASM_BARRIER_H
38c2ecf20Sopenharmony_ci#define __ASM_BARRIER_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#if __LINUX_ARM_ARCH__ >= 7 ||		\
108c2ecf20Sopenharmony_ci	(__LINUX_ARM_ARCH__ == 6 && defined(CONFIG_CPU_32v6K))
118c2ecf20Sopenharmony_ci#define sev()	__asm__ __volatile__ ("sev" : : : "memory")
128c2ecf20Sopenharmony_ci#define wfe()	__asm__ __volatile__ ("wfe" : : : "memory")
138c2ecf20Sopenharmony_ci#define wfi()	__asm__ __volatile__ ("wfi" : : : "memory")
148c2ecf20Sopenharmony_ci#else
158c2ecf20Sopenharmony_ci#define wfe()	do { } while (0)
168c2ecf20Sopenharmony_ci#endif
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#if __LINUX_ARM_ARCH__ >= 7
198c2ecf20Sopenharmony_ci#define isb(option) __asm__ __volatile__ ("isb " #option : : : "memory")
208c2ecf20Sopenharmony_ci#define dsb(option) __asm__ __volatile__ ("dsb " #option : : : "memory")
218c2ecf20Sopenharmony_ci#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory")
228c2ecf20Sopenharmony_ci#ifdef CONFIG_THUMB2_KERNEL
238c2ecf20Sopenharmony_ci#define CSDB	".inst.w 0xf3af8014"
248c2ecf20Sopenharmony_ci#else
258c2ecf20Sopenharmony_ci#define CSDB	".inst	0xe320f014"
268c2ecf20Sopenharmony_ci#endif
278c2ecf20Sopenharmony_ci#define csdb() __asm__ __volatile__(CSDB : : : "memory")
288c2ecf20Sopenharmony_ci#elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6
298c2ecf20Sopenharmony_ci#define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \
308c2ecf20Sopenharmony_ci				    : : "r" (0) : "memory")
318c2ecf20Sopenharmony_ci#define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
328c2ecf20Sopenharmony_ci				    : : "r" (0) : "memory")
338c2ecf20Sopenharmony_ci#define dmb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \
348c2ecf20Sopenharmony_ci				    : : "r" (0) : "memory")
358c2ecf20Sopenharmony_ci#elif defined(CONFIG_CPU_FA526)
368c2ecf20Sopenharmony_ci#define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \
378c2ecf20Sopenharmony_ci				    : : "r" (0) : "memory")
388c2ecf20Sopenharmony_ci#define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
398c2ecf20Sopenharmony_ci				    : : "r" (0) : "memory")
408c2ecf20Sopenharmony_ci#define dmb(x) __asm__ __volatile__ ("" : : : "memory")
418c2ecf20Sopenharmony_ci#else
428c2ecf20Sopenharmony_ci#define isb(x) __asm__ __volatile__ ("" : : : "memory")
438c2ecf20Sopenharmony_ci#define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
448c2ecf20Sopenharmony_ci				    : : "r" (0) : "memory")
458c2ecf20Sopenharmony_ci#define dmb(x) __asm__ __volatile__ ("" : : : "memory")
468c2ecf20Sopenharmony_ci#endif
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#ifndef CSDB
498c2ecf20Sopenharmony_ci#define CSDB
508c2ecf20Sopenharmony_ci#endif
518c2ecf20Sopenharmony_ci#ifndef csdb
528c2ecf20Sopenharmony_ci#define csdb()
538c2ecf20Sopenharmony_ci#endif
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci#ifdef CONFIG_ARM_HEAVY_MB
568c2ecf20Sopenharmony_ciextern void (*soc_mb)(void);
578c2ecf20Sopenharmony_ciextern void arm_heavy_mb(void);
588c2ecf20Sopenharmony_ci#define __arm_heavy_mb(x...) do { dsb(x); arm_heavy_mb(); } while (0)
598c2ecf20Sopenharmony_ci#else
608c2ecf20Sopenharmony_ci#define __arm_heavy_mb(x...) dsb(x)
618c2ecf20Sopenharmony_ci#endif
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci#if defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP)
648c2ecf20Sopenharmony_ci#define mb()		__arm_heavy_mb()
658c2ecf20Sopenharmony_ci#define rmb()		dsb()
668c2ecf20Sopenharmony_ci#define wmb()		__arm_heavy_mb(st)
678c2ecf20Sopenharmony_ci#define dma_rmb()	dmb(osh)
688c2ecf20Sopenharmony_ci#define dma_wmb()	dmb(oshst)
698c2ecf20Sopenharmony_ci#else
708c2ecf20Sopenharmony_ci#define mb()		barrier()
718c2ecf20Sopenharmony_ci#define rmb()		barrier()
728c2ecf20Sopenharmony_ci#define wmb()		barrier()
738c2ecf20Sopenharmony_ci#define dma_rmb()	barrier()
748c2ecf20Sopenharmony_ci#define dma_wmb()	barrier()
758c2ecf20Sopenharmony_ci#endif
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci#define __smp_mb()	dmb(ish)
788c2ecf20Sopenharmony_ci#define __smp_rmb()	__smp_mb()
798c2ecf20Sopenharmony_ci#define __smp_wmb()	dmb(ishst)
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_SPECTRE
828c2ecf20Sopenharmony_cistatic inline unsigned long array_index_mask_nospec(unsigned long idx,
838c2ecf20Sopenharmony_ci						    unsigned long sz)
848c2ecf20Sopenharmony_ci{
858c2ecf20Sopenharmony_ci	unsigned long mask;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	asm volatile(
888c2ecf20Sopenharmony_ci		"cmp	%1, %2\n"
898c2ecf20Sopenharmony_ci	"	sbc	%0, %1, %1\n"
908c2ecf20Sopenharmony_ci	CSDB
918c2ecf20Sopenharmony_ci	: "=r" (mask)
928c2ecf20Sopenharmony_ci	: "r" (idx), "Ir" (sz)
938c2ecf20Sopenharmony_ci	: "cc");
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	return mask;
968c2ecf20Sopenharmony_ci}
978c2ecf20Sopenharmony_ci#define array_index_mask_nospec array_index_mask_nospec
988c2ecf20Sopenharmony_ci#endif
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci#include <asm-generic/barrier.h>
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#endif /* !__ASSEMBLY__ */
1038c2ecf20Sopenharmony_ci#endif /* __ASM_BARRIER_H */
104