/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copied from the kernel sources to tools/arch/riscv: * * Copyright (C) 2012 ARM Ltd. * Copyright (C) 2013 Regents of the University of California * Copyright (C) 2017 SiFive */ #ifndef _TOOLS_LINUX_ASM_RISCV_BARRIER_H #define _TOOLS_LINUX_ASM_RISCV_BARRIER_H #include #include /* These barriers need to enforce ordering on both devices and memory. */ #define mb() RISCV_FENCE(iorw, iorw) #define rmb() RISCV_FENCE(ir, ir) #define wmb() RISCV_FENCE(ow, ow) /* These barriers do not need to enforce ordering on devices, just memory. */ #define smp_mb() RISCV_FENCE(rw, rw) #define smp_rmb() RISCV_FENCE(r, r) #define smp_wmb() RISCV_FENCE(w, w) #define smp_store_release(p, v) \ do { \ RISCV_FENCE(rw, w); \ WRITE_ONCE(*p, v); \ } while (0) #define smp_load_acquire(p) \ ({ \ typeof(*p) ___p1 = READ_ONCE(*p); \ RISCV_FENCE(r, rw); \ ___p1; \ }) #endif /* _TOOLS_LINUX_ASM_RISCV_BARRIER_H */