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