xref: /rk3399_ARM-atf/include/plat/marvell/odyssey/csr/ody-asm.h (revision 12d80bbbf6031228bdd910eccb03bb185e8df527)
1*4b8b8d74SJaiprakash Singh /***********************license start***********************************
2*4b8b8d74SJaiprakash Singh * Copyright (C) 2021-2026 Marvell.
3*4b8b8d74SJaiprakash Singh * SPDX-License-Identifier: BSD-3-Clause
4*4b8b8d74SJaiprakash Singh * https://spdx.org/licenses
5*4b8b8d74SJaiprakash Singh ***********************license end**************************************/
6*4b8b8d74SJaiprakash Singh 
7*4b8b8d74SJaiprakash Singh /**
8*4b8b8d74SJaiprakash Singh  * @file
9*4b8b8d74SJaiprakash Singh  *
10*4b8b8d74SJaiprakash Singh  * This is file defines ASM primitives for the executive.
11*4b8b8d74SJaiprakash Singh 
12*4b8b8d74SJaiprakash Singh  * <hr>$Revision: 53373 $<hr>
13*4b8b8d74SJaiprakash Singh  *
14*4b8b8d74SJaiprakash Singh  * @defgroup __asm__ Assembly support
15*4b8b8d74SJaiprakash Singh  * @{
16*4b8b8d74SJaiprakash Singh  */
17*4b8b8d74SJaiprakash Singh 
18*4b8b8d74SJaiprakash Singh /* This header file can be included from a .S file.  Keep non-preprocessor
19*4b8b8d74SJaiprakash Singh    things under !__ASSEMBLER__.  */
20*4b8b8d74SJaiprakash Singh #ifndef __ASSEMBLER__
21*4b8b8d74SJaiprakash Singh 
22*4b8b8d74SJaiprakash Singh /* turn the variable name into a string */
23*4b8b8d74SJaiprakash Singh #define __TMP_STR(x) __TMP_STR2(x)
24*4b8b8d74SJaiprakash Singh #define __TMP_STR2(x) #x
25*4b8b8d74SJaiprakash Singh #define __VASTR(...) #__VA_ARGS__
26*4b8b8d74SJaiprakash Singh 
27*4b8b8d74SJaiprakash Singh #define MRS_NV(reg, val) __asm__ ("mrs %x[rd]," #reg : [rd] "=r" (val))
28*4b8b8d74SJaiprakash Singh #define MRS(reg, val) __asm__ volatile ("mrs %x[rd]," #reg : [rd] "=r" (val))
29*4b8b8d74SJaiprakash Singh #define MSR(reg, val) __asm__ volatile ("msr " #reg ",%x[rd]" : : [rd] "r" (val))
30*4b8b8d74SJaiprakash Singh 
31*4b8b8d74SJaiprakash Singh /* Barriers: The ODY uses non-shared memory (not inner or outer shared
32*4b8b8d74SJaiprakash Singh     in ARM speak). Inner or Outer shared instructions won't work */
33*4b8b8d74SJaiprakash Singh #define MB          __asm__ volatile ("dmb sy"      : : : "memory") /* Full memory barrier, like MIPS SYNC */
34*4b8b8d74SJaiprakash Singh #define WMB         __asm__ volatile ("dmb st"      : : : "memory") /* Write memory barrier, like MIPS SYNCW */
35*4b8b8d74SJaiprakash Singh #define RMB         __asm__ volatile ("dmb ld"      : : : "memory") /* Read memory barrier, only necessary on OcteonTX2 */
36*4b8b8d74SJaiprakash Singh #define DSB         __asm__ volatile ("dsb sy"      : : : "memory") /* Core data synchonization barrier */
37*4b8b8d74SJaiprakash Singh #define ISB         __asm__ volatile ("isb"         : : : "memory") /* Instruction synchronization barrier */
38*4b8b8d74SJaiprakash Singh 
39*4b8b8d74SJaiprakash Singh /* other useful stuff */
40*4b8b8d74SJaiprakash Singh #define WFE         __asm__ volatile ("wfe"         : : : "memory") /* Wait for event */
41*4b8b8d74SJaiprakash Singh #define SEV         __asm__ volatile ("sev"         : : : "memory") /* Send global event */
42*4b8b8d74SJaiprakash Singh 
43*4b8b8d74SJaiprakash Singh // prefetch helper
44*4b8b8d74SJaiprakash Singh #define PREFETCH_PREFX(type, address, offset) \
45*4b8b8d74SJaiprakash Singh 	__asm__ volatile ("PRFUM " type ", [%[rbase],%[off]]" : : [rbase] "r" (address), [off] "I" (offset))
46*4b8b8d74SJaiprakash Singh 
47*4b8b8d74SJaiprakash Singh // normal prefetch
48*4b8b8d74SJaiprakash Singh #define PREFETCH(address, offset) PREFETCH_PREFX("PLDL1KEEP", address, offset)
49*4b8b8d74SJaiprakash Singh 
50*4b8b8d74SJaiprakash Singh #define ICACHE_INVALIDATE  { __asm__ volatile ("ic iallu" : : ); }    // invalidate entire icache
51*4b8b8d74SJaiprakash Singh 
52*4b8b8d74SJaiprakash Singh // Do not push to memory, just invalidate
53*4b8b8d74SJaiprakash Singh #define CACHE_I_L2(address) \
54*4b8b8d74SJaiprakash Singh 	{ __asm__ volatile ("dc  ivac, %0" : : "r" (address)); }
55*4b8b8d74SJaiprakash Singh 
56*4b8b8d74SJaiprakash Singh // Push to memory, invalidate
57*4b8b8d74SJaiprakash Singh #define CACHE_WBI_L2(address) \
58*4b8b8d74SJaiprakash Singh 	{ __asm__ volatile ("dc civac, %0" : : "r" (address)); }
59*4b8b8d74SJaiprakash Singh 
60*4b8b8d74SJaiprakash Singh // Push to memory, do not invalidate
61*4b8b8d74SJaiprakash Singh #define CACHE_WB_L2(address) \
62*4b8b8d74SJaiprakash Singh 	{ __asm__ volatile ("dc  cvac, %0" : : "r" (address)); }
63*4b8b8d74SJaiprakash Singh 
64*4b8b8d74SJaiprakash Singh #define STORE_PAIR(ptr, data1, data2) { __asm__ volatile ("stp %x[d1], %x[d2], [%[b]]" : [mem] "+m" (*(__uint128_t *)ptr) : [b] "r" (ptr), [d1] "r" (data1), [d2] "r" (data2)); }
65*4b8b8d74SJaiprakash Singh 
66*4b8b8d74SJaiprakash Singh #endif	/* __ASSEMBLER__ */
67*4b8b8d74SJaiprakash Singh 
68*4b8b8d74SJaiprakash Singh /** @} */
69