xref: /dpdk/lib/eal/riscv/include/rte_atomic.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
1f22e705eSMichal Mazurek /* SPDX-License-Identifier: BSD-3-Clause
2f22e705eSMichal Mazurek  * Copyright(c) 2022 StarFive
3f22e705eSMichal Mazurek  * Copyright(c) 2022 SiFive
4f22e705eSMichal Mazurek  * Copyright(c) 2022 Semihalf
5f22e705eSMichal Mazurek  * All rights reserved.
6f22e705eSMichal Mazurek  */
7f22e705eSMichal Mazurek 
8f22e705eSMichal Mazurek #ifndef RTE_ATOMIC_RISCV_H
9f22e705eSMichal Mazurek #define RTE_ATOMIC_RISCV_H
10f22e705eSMichal Mazurek 
11f22e705eSMichal Mazurek #ifndef RTE_FORCE_INTRINSICS
12f22e705eSMichal Mazurek #  error Platform must be built with RTE_FORCE_INTRINSICS
13f22e705eSMichal Mazurek #endif
14f22e705eSMichal Mazurek 
15f22e705eSMichal Mazurek #include <stdint.h>
16f22e705eSMichal Mazurek #include <rte_common.h>
17f22e705eSMichal Mazurek #include <rte_config.h>
18f22e705eSMichal Mazurek #include "generic/rte_atomic.h"
19f22e705eSMichal Mazurek 
20*719834a6SMattias Rönnblom #ifdef __cplusplus
21*719834a6SMattias Rönnblom extern "C" {
22*719834a6SMattias Rönnblom #endif
23*719834a6SMattias Rönnblom 
24f22e705eSMichal Mazurek #define rte_mb()	asm volatile("fence rw, rw" : : : "memory")
25f22e705eSMichal Mazurek 
26f22e705eSMichal Mazurek #define rte_wmb()	asm volatile("fence w, w" : : : "memory")
27f22e705eSMichal Mazurek 
28f22e705eSMichal Mazurek #define rte_rmb()	asm volatile("fence r, r" : : : "memory")
29f22e705eSMichal Mazurek 
30f22e705eSMichal Mazurek #define rte_smp_mb()	rte_mb()
31f22e705eSMichal Mazurek 
32f22e705eSMichal Mazurek #define rte_smp_wmb()	rte_wmb()
33f22e705eSMichal Mazurek 
34f22e705eSMichal Mazurek #define rte_smp_rmb()	rte_rmb()
35f22e705eSMichal Mazurek 
36f22e705eSMichal Mazurek #define rte_io_mb()	asm volatile("fence iorw, iorw" : : : "memory")
37f22e705eSMichal Mazurek 
38f22e705eSMichal Mazurek #define rte_io_wmb()	asm volatile("fence orw, ow" : : : "memory")
39f22e705eSMichal Mazurek 
40f22e705eSMichal Mazurek #define rte_io_rmb()	asm volatile("fence ir, ir" : : : "memory")
41f22e705eSMichal Mazurek 
42f22e705eSMichal Mazurek static __rte_always_inline void
431ec6a845STyler Retzlaff rte_atomic_thread_fence(rte_memory_order memorder)
44f22e705eSMichal Mazurek {
451ec6a845STyler Retzlaff 	__rte_atomic_thread_fence(memorder);
46f22e705eSMichal Mazurek }
47f22e705eSMichal Mazurek 
48f22e705eSMichal Mazurek #ifdef __cplusplus
49f22e705eSMichal Mazurek }
50f22e705eSMichal Mazurek #endif
51f22e705eSMichal Mazurek 
52f22e705eSMichal Mazurek #endif /* RTE_ATOMIC_RISCV_H */
53