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