Line data Source code
1 0 : /*
2 : * Copyright (c) 2023 Carlo Caione <ccaione@baylibre.com>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_SYS_BARRIER_H_
8 : #define ZEPHYR_INCLUDE_SYS_BARRIER_H_
9 :
10 : #include <zephyr/toolchain.h>
11 :
12 : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH)
13 : # if defined(CONFIG_ARM)
14 : # include <zephyr/arch/arm/barrier.h>
15 : # elif defined(CONFIG_ARM64)
16 : # include <zephyr/arch/arm64/barrier.h>
17 : # endif
18 : #elif defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
19 : #include <zephyr/sys/barrier_builtin.h>
20 : #endif
21 :
22 : #ifdef __cplusplus
23 : extern "C" {
24 : #endif
25 :
26 : /**
27 : * @addtogroup barrier_apis Barrier Services APIs
28 : * @since 3.4
29 : * @version 0.1.0
30 : * @ingroup kernel_apis
31 : * @{
32 : */
33 :
34 : /**
35 : * @brief Full/sequentially-consistent data memory barrier.
36 : *
37 : * This routine acts as a synchronization fence between threads and prevents
38 : * re-ordering of data accesses instructions across the barrier instruction.
39 : */
40 1 : static ALWAYS_INLINE void barrier_dmem_fence_full(void)
41 : {
42 : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH) || defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
43 : z_barrier_dmem_fence_full();
44 : #endif
45 : }
46 :
47 : /**
48 : * @brief Full/sequentially-consistent data synchronization barrier.
49 : *
50 : * This routine acts as a synchronization fence between threads and prevents
51 : * re-ordering of data accesses instructions across the barrier instruction
52 : * like @ref barrier_dmem_fence_full(), but has the additional effect of
53 : * blocking execution of any further instructions, not just loads or stores, or
54 : * both, until synchronization is complete.
55 : *
56 : * @note When not supported by hardware or architecture, this instruction falls
57 : * back to a full/sequentially-consistent data memory barrier.
58 : */
59 1 : static ALWAYS_INLINE void barrier_dsync_fence_full(void)
60 : {
61 : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH) || defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
62 : z_barrier_dsync_fence_full();
63 : #endif
64 : }
65 :
66 : /**
67 : * @brief Full/sequentially-consistent instruction synchronization barrier.
68 : *
69 : * This routine is used to guarantee that any subsequent instructions are
70 : * fetched and to ensure any previously executed context-changing operations,
71 : * such as writes to system control registers, have completed by the time the
72 : * routine completes. In hardware terms, this might mean that the instruction
73 : * pipeline is flushed, for example.
74 : *
75 : * @note When not supported by hardware or architecture, this instruction falls
76 : * back to a compiler barrier.
77 : */
78 1 : static ALWAYS_INLINE void barrier_isync_fence_full(void)
79 : {
80 : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH) || defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
81 : z_barrier_isync_fence_full();
82 : #endif
83 : }
84 :
85 : /** @} */
86 :
87 : #ifdef __cplusplus
88 : } /* extern "C" */
89 : #endif
90 :
91 : #endif /* ZEPHYR_INCLUDE_SYS_ATOMIC_H_ */
|