1 /*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6 #ifndef MEMORY_H
7 #define MEMORY_H
8
9 #include <stddef.h>
10 #include <stdint.h>
11
12 /* Single-Copy Atomic 64-bit write */
__sca_write64(uint64_t * ptr,uint64_t val)13 static inline void __sca_write64(uint64_t *ptr, uint64_t val)
14 {
15 /* To avoid misra-c2012-2.7 warnings */
16 (void)ptr;
17 (void)val;
18
19 asm volatile(
20 " str %[val], %[ptr]\n"
21 : [ptr] "=m" (*ptr)
22 : [val] "r" (val)
23 );
24 }
25 #define SCA_WRITE64(_p, _v) __sca_write64((void *)(_p), ((uint64_t)(_v)))
26
27 /* Single-Copy Atomic 64-bit write with RELEASE memory ordering semantics*/
__sca_write64_release(uint64_t * ptr,uint64_t val)28 static inline void __sca_write64_release(uint64_t *ptr, uint64_t val)
29 {
30 asm volatile(
31 " stlr %[val], %[ptr]\n"
32 : [ptr] "=Q" (*ptr)
33 : [val] "r" (val)
34 );
35 }
36 #define SCA_WRITE64_RELEASE(_p, _v) __sca_write64_release((void *)(_p), ((uint64_t)(_v)))
37
38 /* Single-Copy Atomic 64-bit read */
__sca_read64(uint64_t * ptr)39 static inline uint64_t __sca_read64(uint64_t *ptr)
40 {
41 uint64_t val;
42
43 /* To avoid misra-c2012-2.7 warnings */
44 (void)ptr;
45
46 asm volatile(
47 " ldr %[val], %[ptr]\n"
48 : [val] "=r" (val)
49 : [ptr] "m" (*ptr)
50 );
51
52 return val;
53 }
54 #define SCA_READ64(_p) ((typeof(*(_p)))__sca_read64((void *)(_p)))
55
56 /* Single-Copy Atomic 64-bit read with ACQUIRE memory ordering semantics */
__sca_read64_acquire(uint64_t * ptr)57 static inline uint64_t __sca_read64_acquire(uint64_t *ptr)
58 {
59 uint64_t val;
60
61 /* To avoid misra-c2012-2.7 warnings */
62 (void)ptr;
63
64 asm volatile(
65 " ldar %[val], %[ptr]\n"
66 : [val] "=r" (val)
67 : [ptr] "Q" (*ptr)
68 );
69
70 return val;
71 }
72 #define SCA_READ64_ACQUIRE(_p) ((typeof(*(_p)))__sca_read64_acquire((void *)(_p)))
73
74 #endif /* MEMORY_H */
75