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