40 lines
1.0 KiB
C
40 lines
1.0 KiB
C
|
/* 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 */
|