| /* 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 <asm/fence.h> | |
| #include <linux/compiler.h> | |
| /* 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 */ |