1*f5478dedSAntonio Nino Diaz /* 2*f5478dedSAntonio Nino Diaz * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. 3*f5478dedSAntonio Nino Diaz * 4*f5478dedSAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 5*f5478dedSAntonio Nino Diaz */ 6*f5478dedSAntonio Nino Diaz 7*f5478dedSAntonio Nino Diaz #ifndef ARCH_HELPERS_H 8*f5478dedSAntonio Nino Diaz #define ARCH_HELPERS_H 9*f5478dedSAntonio Nino Diaz 10*f5478dedSAntonio Nino Diaz #include <arch.h> 11*f5478dedSAntonio Nino Diaz #include <cdefs.h> 12*f5478dedSAntonio Nino Diaz #include <stdint.h> 13*f5478dedSAntonio Nino Diaz #include <string.h> 14*f5478dedSAntonio Nino Diaz 15*f5478dedSAntonio Nino Diaz /********************************************************************** 16*f5478dedSAntonio Nino Diaz * Macros which create inline functions to read or write CPU system 17*f5478dedSAntonio Nino Diaz * registers 18*f5478dedSAntonio Nino Diaz *********************************************************************/ 19*f5478dedSAntonio Nino Diaz 20*f5478dedSAntonio Nino Diaz #define _DEFINE_COPROCR_WRITE_FUNC(_name, coproc, opc1, CRn, CRm, opc2) \ 21*f5478dedSAntonio Nino Diaz static inline void write_## _name(u_register_t v) \ 22*f5478dedSAntonio Nino Diaz { \ 23*f5478dedSAntonio Nino Diaz __asm__ volatile ("mcr "#coproc","#opc1",%0,"#CRn","#CRm","#opc2 : : "r" (v));\ 24*f5478dedSAntonio Nino Diaz } 25*f5478dedSAntonio Nino Diaz 26*f5478dedSAntonio Nino Diaz #define _DEFINE_COPROCR_READ_FUNC(_name, coproc, opc1, CRn, CRm, opc2) \ 27*f5478dedSAntonio Nino Diaz static inline u_register_t read_ ## _name(void) \ 28*f5478dedSAntonio Nino Diaz { \ 29*f5478dedSAntonio Nino Diaz u_register_t v; \ 30*f5478dedSAntonio Nino Diaz __asm__ volatile ("mrc "#coproc","#opc1",%0,"#CRn","#CRm","#opc2 : "=r" (v));\ 31*f5478dedSAntonio Nino Diaz return v; \ 32*f5478dedSAntonio Nino Diaz } 33*f5478dedSAntonio Nino Diaz 34*f5478dedSAntonio Nino Diaz /* 35*f5478dedSAntonio Nino Diaz * The undocumented %Q and %R extended asm are used to implemented the below 36*f5478dedSAntonio Nino Diaz * 64 bit `mrrc` and `mcrr` instructions. 37*f5478dedSAntonio Nino Diaz */ 38*f5478dedSAntonio Nino Diaz 39*f5478dedSAntonio Nino Diaz #define _DEFINE_COPROCR_WRITE_FUNC_64(_name, coproc, opc1, CRm) \ 40*f5478dedSAntonio Nino Diaz static inline void write64_## _name(uint64_t v) \ 41*f5478dedSAntonio Nino Diaz { \ 42*f5478dedSAntonio Nino Diaz __asm__ volatile ("mcrr "#coproc","#opc1", %Q0, %R0,"#CRm : : "r" (v));\ 43*f5478dedSAntonio Nino Diaz } 44*f5478dedSAntonio Nino Diaz 45*f5478dedSAntonio Nino Diaz #define _DEFINE_COPROCR_READ_FUNC_64(_name, coproc, opc1, CRm) \ 46*f5478dedSAntonio Nino Diaz static inline uint64_t read64_## _name(void) \ 47*f5478dedSAntonio Nino Diaz { uint64_t v; \ 48*f5478dedSAntonio Nino Diaz __asm__ volatile ("mrrc "#coproc","#opc1", %Q0, %R0,"#CRm : "=r" (v));\ 49*f5478dedSAntonio Nino Diaz return v; \ 50*f5478dedSAntonio Nino Diaz } 51*f5478dedSAntonio Nino Diaz 52*f5478dedSAntonio Nino Diaz #define _DEFINE_SYSREG_READ_FUNC(_name, _reg_name) \ 53*f5478dedSAntonio Nino Diaz static inline u_register_t read_ ## _name(void) \ 54*f5478dedSAntonio Nino Diaz { \ 55*f5478dedSAntonio Nino Diaz u_register_t v; \ 56*f5478dedSAntonio Nino Diaz __asm__ volatile ("mrs %0, " #_reg_name : "=r" (v)); \ 57*f5478dedSAntonio Nino Diaz return v; \ 58*f5478dedSAntonio Nino Diaz } 59*f5478dedSAntonio Nino Diaz 60*f5478dedSAntonio Nino Diaz #define _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name) \ 61*f5478dedSAntonio Nino Diaz static inline void write_ ## _name(u_register_t v) \ 62*f5478dedSAntonio Nino Diaz { \ 63*f5478dedSAntonio Nino Diaz __asm__ volatile ("msr " #_reg_name ", %0" : : "r" (v)); \ 64*f5478dedSAntonio Nino Diaz } 65*f5478dedSAntonio Nino Diaz 66*f5478dedSAntonio Nino Diaz #define _DEFINE_SYSREG_WRITE_CONST_FUNC(_name, _reg_name) \ 67*f5478dedSAntonio Nino Diaz static inline void write_ ## _name(const u_register_t v) \ 68*f5478dedSAntonio Nino Diaz { \ 69*f5478dedSAntonio Nino Diaz __asm__ volatile ("msr " #_reg_name ", %0" : : "i" (v)); \ 70*f5478dedSAntonio Nino Diaz } 71*f5478dedSAntonio Nino Diaz 72*f5478dedSAntonio Nino Diaz /* Define read function for coproc register */ 73*f5478dedSAntonio Nino Diaz #define DEFINE_COPROCR_READ_FUNC(_name, ...) \ 74*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_READ_FUNC(_name, __VA_ARGS__) 75*f5478dedSAntonio Nino Diaz 76*f5478dedSAntonio Nino Diaz /* Define write function for coproc register */ 77*f5478dedSAntonio Nino Diaz #define DEFINE_COPROCR_WRITE_FUNC(_name, ...) \ 78*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_WRITE_FUNC(_name, __VA_ARGS__) 79*f5478dedSAntonio Nino Diaz 80*f5478dedSAntonio Nino Diaz /* Define read & write function for coproc register */ 81*f5478dedSAntonio Nino Diaz #define DEFINE_COPROCR_RW_FUNCS(_name, ...) \ 82*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_READ_FUNC(_name, __VA_ARGS__) \ 83*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_WRITE_FUNC(_name, __VA_ARGS__) 84*f5478dedSAntonio Nino Diaz 85*f5478dedSAntonio Nino Diaz /* Define 64 bit read function for coproc register */ 86*f5478dedSAntonio Nino Diaz #define DEFINE_COPROCR_READ_FUNC_64(_name, ...) \ 87*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_READ_FUNC_64(_name, __VA_ARGS__) 88*f5478dedSAntonio Nino Diaz 89*f5478dedSAntonio Nino Diaz /* Define 64 bit write function for coproc register */ 90*f5478dedSAntonio Nino Diaz #define DEFINE_COPROCR_WRITE_FUNC_64(_name, ...) \ 91*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_WRITE_FUNC_64(_name, __VA_ARGS__) 92*f5478dedSAntonio Nino Diaz 93*f5478dedSAntonio Nino Diaz /* Define 64 bit read & write function for coproc register */ 94*f5478dedSAntonio Nino Diaz #define DEFINE_COPROCR_RW_FUNCS_64(_name, ...) \ 95*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_READ_FUNC_64(_name, __VA_ARGS__) \ 96*f5478dedSAntonio Nino Diaz _DEFINE_COPROCR_WRITE_FUNC_64(_name, __VA_ARGS__) 97*f5478dedSAntonio Nino Diaz 98*f5478dedSAntonio Nino Diaz /* Define read & write function for system register */ 99*f5478dedSAntonio Nino Diaz #define DEFINE_SYSREG_RW_FUNCS(_name) \ 100*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_READ_FUNC(_name, _name) \ 101*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_WRITE_FUNC(_name, _name) 102*f5478dedSAntonio Nino Diaz 103*f5478dedSAntonio Nino Diaz /********************************************************************** 104*f5478dedSAntonio Nino Diaz * Macros to create inline functions for tlbi operations 105*f5478dedSAntonio Nino Diaz *********************************************************************/ 106*f5478dedSAntonio Nino Diaz 107*f5478dedSAntonio Nino Diaz #define _DEFINE_TLBIOP_FUNC(_op, coproc, opc1, CRn, CRm, opc2) \ 108*f5478dedSAntonio Nino Diaz static inline void tlbi##_op(void) \ 109*f5478dedSAntonio Nino Diaz { \ 110*f5478dedSAntonio Nino Diaz u_register_t v = 0; \ 111*f5478dedSAntonio Nino Diaz __asm__ volatile ("mcr "#coproc","#opc1",%0,"#CRn","#CRm","#opc2 : : "r" (v));\ 112*f5478dedSAntonio Nino Diaz } 113*f5478dedSAntonio Nino Diaz 114*f5478dedSAntonio Nino Diaz #define _DEFINE_BPIOP_FUNC(_op, coproc, opc1, CRn, CRm, opc2) \ 115*f5478dedSAntonio Nino Diaz static inline void bpi##_op(void) \ 116*f5478dedSAntonio Nino Diaz { \ 117*f5478dedSAntonio Nino Diaz u_register_t v = 0; \ 118*f5478dedSAntonio Nino Diaz __asm__ volatile ("mcr "#coproc","#opc1",%0,"#CRn","#CRm","#opc2 : : "r" (v));\ 119*f5478dedSAntonio Nino Diaz } 120*f5478dedSAntonio Nino Diaz 121*f5478dedSAntonio Nino Diaz #define _DEFINE_TLBIOP_PARAM_FUNC(_op, coproc, opc1, CRn, CRm, opc2) \ 122*f5478dedSAntonio Nino Diaz static inline void tlbi##_op(u_register_t v) \ 123*f5478dedSAntonio Nino Diaz { \ 124*f5478dedSAntonio Nino Diaz __asm__ volatile ("mcr "#coproc","#opc1",%0,"#CRn","#CRm","#opc2 : : "r" (v));\ 125*f5478dedSAntonio Nino Diaz } 126*f5478dedSAntonio Nino Diaz 127*f5478dedSAntonio Nino Diaz /* Define function for simple TLBI operation */ 128*f5478dedSAntonio Nino Diaz #define DEFINE_TLBIOP_FUNC(_op, ...) \ 129*f5478dedSAntonio Nino Diaz _DEFINE_TLBIOP_FUNC(_op, __VA_ARGS__) 130*f5478dedSAntonio Nino Diaz 131*f5478dedSAntonio Nino Diaz /* Define function for TLBI operation with register parameter */ 132*f5478dedSAntonio Nino Diaz #define DEFINE_TLBIOP_PARAM_FUNC(_op, ...) \ 133*f5478dedSAntonio Nino Diaz _DEFINE_TLBIOP_PARAM_FUNC(_op, __VA_ARGS__) 134*f5478dedSAntonio Nino Diaz 135*f5478dedSAntonio Nino Diaz /* Define function for simple BPI operation */ 136*f5478dedSAntonio Nino Diaz #define DEFINE_BPIOP_FUNC(_op, ...) \ 137*f5478dedSAntonio Nino Diaz _DEFINE_BPIOP_FUNC(_op, __VA_ARGS__) 138*f5478dedSAntonio Nino Diaz 139*f5478dedSAntonio Nino Diaz /********************************************************************** 140*f5478dedSAntonio Nino Diaz * Macros to create inline functions for DC operations 141*f5478dedSAntonio Nino Diaz *********************************************************************/ 142*f5478dedSAntonio Nino Diaz #define _DEFINE_DCOP_PARAM_FUNC(_op, coproc, opc1, CRn, CRm, opc2) \ 143*f5478dedSAntonio Nino Diaz static inline void dc##_op(u_register_t v) \ 144*f5478dedSAntonio Nino Diaz { \ 145*f5478dedSAntonio Nino Diaz __asm__ volatile ("mcr "#coproc","#opc1",%0,"#CRn","#CRm","#opc2 : : "r" (v));\ 146*f5478dedSAntonio Nino Diaz } 147*f5478dedSAntonio Nino Diaz 148*f5478dedSAntonio Nino Diaz /* Define function for DC operation with register parameter */ 149*f5478dedSAntonio Nino Diaz #define DEFINE_DCOP_PARAM_FUNC(_op, ...) \ 150*f5478dedSAntonio Nino Diaz _DEFINE_DCOP_PARAM_FUNC(_op, __VA_ARGS__) 151*f5478dedSAntonio Nino Diaz 152*f5478dedSAntonio Nino Diaz /********************************************************************** 153*f5478dedSAntonio Nino Diaz * Macros to create inline functions for system instructions 154*f5478dedSAntonio Nino Diaz *********************************************************************/ 155*f5478dedSAntonio Nino Diaz /* Define function for simple system instruction */ 156*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_FUNC(_op) \ 157*f5478dedSAntonio Nino Diaz static inline void _op(void) \ 158*f5478dedSAntonio Nino Diaz { \ 159*f5478dedSAntonio Nino Diaz __asm__ (#_op); \ 160*f5478dedSAntonio Nino Diaz } 161*f5478dedSAntonio Nino Diaz 162*f5478dedSAntonio Nino Diaz 163*f5478dedSAntonio Nino Diaz /* Define function for system instruction with type specifier */ 164*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_TYPE_FUNC(_op, _type) \ 165*f5478dedSAntonio Nino Diaz static inline void _op ## _type(void) \ 166*f5478dedSAntonio Nino Diaz { \ 167*f5478dedSAntonio Nino Diaz __asm__ (#_op " " #_type); \ 168*f5478dedSAntonio Nino Diaz } 169*f5478dedSAntonio Nino Diaz 170*f5478dedSAntonio Nino Diaz /* Define function for system instruction with register parameter */ 171*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_TYPE_PARAM_FUNC(_op, _type) \ 172*f5478dedSAntonio Nino Diaz static inline void _op ## _type(u_register_t v) \ 173*f5478dedSAntonio Nino Diaz { \ 174*f5478dedSAntonio Nino Diaz __asm__ (#_op " " #_type ", %0" : : "r" (v)); \ 175*f5478dedSAntonio Nino Diaz } 176*f5478dedSAntonio Nino Diaz 177*f5478dedSAntonio Nino Diaz void flush_dcache_range(uintptr_t addr, size_t size); 178*f5478dedSAntonio Nino Diaz void clean_dcache_range(uintptr_t addr, size_t size); 179*f5478dedSAntonio Nino Diaz void inv_dcache_range(uintptr_t addr, size_t size); 180*f5478dedSAntonio Nino Diaz 181*f5478dedSAntonio Nino Diaz void dcsw_op_louis(u_register_t op_type); 182*f5478dedSAntonio Nino Diaz void dcsw_op_all(u_register_t op_type); 183*f5478dedSAntonio Nino Diaz 184*f5478dedSAntonio Nino Diaz void disable_mmu_secure(void); 185*f5478dedSAntonio Nino Diaz void disable_mmu_icache_secure(void); 186*f5478dedSAntonio Nino Diaz 187*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(wfi) 188*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(wfe) 189*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(sev) 190*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, sy) 191*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, sy) 192*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, st) 193*f5478dedSAntonio Nino Diaz 194*f5478dedSAntonio Nino Diaz /* dmb ld is not valid for armv7/thumb machines */ 195*f5478dedSAntonio Nino Diaz #if ARM_ARCH_MAJOR != 7 196*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ld) 197*f5478dedSAntonio Nino Diaz #endif 198*f5478dedSAntonio Nino Diaz 199*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, ish) 200*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, ishst) 201*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ish) 202*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ishst) 203*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(isb) 204*f5478dedSAntonio Nino Diaz 205*f5478dedSAntonio Nino Diaz void __dead2 smc(uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3, 206*f5478dedSAntonio Nino Diaz uint32_t r4, uint32_t r5, uint32_t r6, uint32_t r7); 207*f5478dedSAntonio Nino Diaz 208*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(spsr) 209*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cpsr) 210*f5478dedSAntonio Nino Diaz 211*f5478dedSAntonio Nino Diaz /******************************************************************************* 212*f5478dedSAntonio Nino Diaz * System register accessor prototypes 213*f5478dedSAntonio Nino Diaz ******************************************************************************/ 214*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC(mpidr, MPIDR) 215*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC(midr, MIDR) 216*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC(id_pfr0, ID_PFR0) 217*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC(id_pfr1, ID_PFR1) 218*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC(isr, ISR) 219*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC(clidr, CLIDR) 220*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC_64(cntpct, CNTPCT_64) 221*f5478dedSAntonio Nino Diaz 222*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(scr, SCR) 223*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(ctr, CTR) 224*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(sctlr, SCTLR) 225*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(actlr, ACTLR) 226*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(hsctlr, HSCTLR) 227*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(hcr, HCR) 228*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(hcptr, HCPTR) 229*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(cntfrq, CNTFRQ) 230*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(cnthctl, CNTHCTL) 231*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(mair0, MAIR0) 232*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(mair1, MAIR1) 233*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(hmair0, HMAIR0) 234*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(ttbcr, TTBCR) 235*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(htcr, HTCR) 236*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(ttbr0, TTBR0) 237*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(ttbr0, TTBR0_64) 238*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(ttbr1, TTBR1) 239*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(httbr, HTTBR_64) 240*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(vpidr, VPIDR) 241*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(vmpidr, VMPIDR) 242*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(vttbr, VTTBR_64) 243*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(ttbr1, TTBR1_64) 244*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(cntvoff, CNTVOFF_64) 245*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(csselr, CSSELR) 246*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(hstr, HSTR) 247*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(cnthp_ctl_el2, CNTHP_CTL) 248*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(cnthp_tval_el2, CNTHP_TVAL) 249*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(cnthp_cval_el2, CNTHP_CVAL_64) 250*f5478dedSAntonio Nino Diaz 251*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_enable(x) (((x) >> CNTP_CTL_ENABLE_SHIFT) & \ 252*f5478dedSAntonio Nino Diaz CNTP_CTL_ENABLE_MASK) 253*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_imask(x) (((x) >> CNTP_CTL_IMASK_SHIFT) & \ 254*f5478dedSAntonio Nino Diaz CNTP_CTL_IMASK_MASK) 255*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_istatus(x) (((x) >> CNTP_CTL_ISTATUS_SHIFT) & \ 256*f5478dedSAntonio Nino Diaz CNTP_CTL_ISTATUS_MASK) 257*f5478dedSAntonio Nino Diaz 258*f5478dedSAntonio Nino Diaz #define set_cntp_ctl_enable(x) ((x) |= U(1) << CNTP_CTL_ENABLE_SHIFT) 259*f5478dedSAntonio Nino Diaz #define set_cntp_ctl_imask(x) ((x) |= U(1) << CNTP_CTL_IMASK_SHIFT) 260*f5478dedSAntonio Nino Diaz 261*f5478dedSAntonio Nino Diaz #define clr_cntp_ctl_enable(x) ((x) &= ~(U(1) << CNTP_CTL_ENABLE_SHIFT)) 262*f5478dedSAntonio Nino Diaz #define clr_cntp_ctl_imask(x) ((x) &= ~(U(1) << CNTP_CTL_IMASK_SHIFT)) 263*f5478dedSAntonio Nino Diaz 264*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_sre_el1, ICC_SRE) 265*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_sre_el2, ICC_HSRE) 266*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_sre_el3, ICC_MSRE) 267*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_pmr_el1, ICC_PMR) 268*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_rpr_el1, ICC_RPR) 269*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_igrpen1_el3, ICC_MGRPEN1) 270*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_igrpen1_el1, ICC_IGRPEN1) 271*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_igrpen0_el1, ICC_IGRPEN0) 272*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_hppir0_el1, ICC_HPPIR0) 273*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_hppir1_el1, ICC_HPPIR1) 274*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_iar0_el1, ICC_IAR0) 275*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_iar1_el1, ICC_IAR1) 276*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_eoir0_el1, ICC_EOIR0) 277*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(icc_eoir1_el1, ICC_EOIR1) 278*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(icc_sgi0r_el1, ICC_SGI0R_EL1_64) 279*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_WRITE_FUNC_64(icc_sgi1r, ICC_SGI1R_EL1_64) 280*f5478dedSAntonio Nino Diaz 281*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(hdcr, HDCR) 282*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(cnthp_ctl, CNTHP_CTL) 283*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_READ_FUNC(pmcr, PMCR) 284*f5478dedSAntonio Nino Diaz 285*f5478dedSAntonio Nino Diaz /* 286*f5478dedSAntonio Nino Diaz * Address translation 287*f5478dedSAntonio Nino Diaz */ 288*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_WRITE_FUNC(ats1cpr, ATS1CPR) 289*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_WRITE_FUNC(ats1hr, ATS1HR) 290*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(par, PAR_64) 291*f5478dedSAntonio Nino Diaz 292*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(nsacr, NSACR) 293*f5478dedSAntonio Nino Diaz 294*f5478dedSAntonio Nino Diaz /* AArch32 coproc registers for 32bit MMU descriptor support */ 295*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(prrr, PRRR) 296*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(nmrr, NMRR) 297*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(dacr, DACR) 298*f5478dedSAntonio Nino Diaz 299*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(amcntenset0, AMCNTENSET0) 300*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(amcntenset1, AMCNTENSET1) 301*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(amcntenclr0, AMCNTENCLR0) 302*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS(amcntenclr1, AMCNTENCLR1) 303*f5478dedSAntonio Nino Diaz 304*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(amevcntr00, AMEVCNTR00) 305*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(amevcntr01, AMEVCNTR01) 306*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(amevcntr02, AMEVCNTR02) 307*f5478dedSAntonio Nino Diaz DEFINE_COPROCR_RW_FUNCS_64(amevcntr03, AMEVCNTR03) 308*f5478dedSAntonio Nino Diaz 309*f5478dedSAntonio Nino Diaz /* 310*f5478dedSAntonio Nino Diaz * TLBI operation prototypes 311*f5478dedSAntonio Nino Diaz */ 312*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_FUNC(all, TLBIALL) 313*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_FUNC(allis, TLBIALLIS) 314*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_PARAM_FUNC(mva, TLBIMVA) 315*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_PARAM_FUNC(mvaa, TLBIMVAA) 316*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_PARAM_FUNC(mvaais, TLBIMVAAIS) 317*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_PARAM_FUNC(mvahis, TLBIMVAHIS) 318*f5478dedSAntonio Nino Diaz 319*f5478dedSAntonio Nino Diaz /* 320*f5478dedSAntonio Nino Diaz * BPI operation prototypes. 321*f5478dedSAntonio Nino Diaz */ 322*f5478dedSAntonio Nino Diaz DEFINE_BPIOP_FUNC(allis, BPIALLIS) 323*f5478dedSAntonio Nino Diaz 324*f5478dedSAntonio Nino Diaz /* 325*f5478dedSAntonio Nino Diaz * DC operation prototypes 326*f5478dedSAntonio Nino Diaz */ 327*f5478dedSAntonio Nino Diaz DEFINE_DCOP_PARAM_FUNC(civac, DCCIMVAC) 328*f5478dedSAntonio Nino Diaz DEFINE_DCOP_PARAM_FUNC(ivac, DCIMVAC) 329*f5478dedSAntonio Nino Diaz DEFINE_DCOP_PARAM_FUNC(cvac, DCCMVAC) 330*f5478dedSAntonio Nino Diaz 331*f5478dedSAntonio Nino Diaz /* Previously defined accessor functions with incomplete register names */ 332*f5478dedSAntonio Nino Diaz #define dsb() dsbsy() 333*f5478dedSAntonio Nino Diaz #define dmb() dmbsy() 334*f5478dedSAntonio Nino Diaz 335*f5478dedSAntonio Nino Diaz /* dmb ld is not valid for armv7/thumb machines, so alias it to dmb */ 336*f5478dedSAntonio Nino Diaz #if ARM_ARCH_MAJOR == 7 337*f5478dedSAntonio Nino Diaz #define dmbld() dmb() 338*f5478dedSAntonio Nino Diaz #endif 339*f5478dedSAntonio Nino Diaz 340*f5478dedSAntonio Nino Diaz #define IS_IN_SECURE() \ 341*f5478dedSAntonio Nino Diaz (GET_NS_BIT(read_scr()) == 0) 342*f5478dedSAntonio Nino Diaz 343*f5478dedSAntonio Nino Diaz #define IS_IN_HYP() (GET_M32(read_cpsr()) == MODE32_hyp) 344*f5478dedSAntonio Nino Diaz #define IS_IN_SVC() (GET_M32(read_cpsr()) == MODE32_svc) 345*f5478dedSAntonio Nino Diaz #define IS_IN_MON() (GET_M32(read_cpsr()) == MODE32_mon) 346*f5478dedSAntonio Nino Diaz #define IS_IN_EL2() IS_IN_HYP() 347*f5478dedSAntonio Nino Diaz /* If EL3 is AArch32, then secure PL1 and monitor mode correspond to EL3 */ 348*f5478dedSAntonio Nino Diaz #define IS_IN_EL3() \ 349*f5478dedSAntonio Nino Diaz ((GET_M32(read_cpsr()) == MODE32_mon) || \ 350*f5478dedSAntonio Nino Diaz (IS_IN_SECURE() && (GET_M32(read_cpsr()) != MODE32_usr))) 351*f5478dedSAntonio Nino Diaz 352*f5478dedSAntonio Nino Diaz static inline unsigned int get_current_el(void) 353*f5478dedSAntonio Nino Diaz { 354*f5478dedSAntonio Nino Diaz if (IS_IN_EL3()) { 355*f5478dedSAntonio Nino Diaz return 3U; 356*f5478dedSAntonio Nino Diaz } else if (IS_IN_EL2()) { 357*f5478dedSAntonio Nino Diaz return 2U; 358*f5478dedSAntonio Nino Diaz } else { 359*f5478dedSAntonio Nino Diaz return 1U; 360*f5478dedSAntonio Nino Diaz } 361*f5478dedSAntonio Nino Diaz } 362*f5478dedSAntonio Nino Diaz 363*f5478dedSAntonio Nino Diaz /* Macros for compatibility with AArch64 system registers */ 364*f5478dedSAntonio Nino Diaz #define read_mpidr_el1() read_mpidr() 365*f5478dedSAntonio Nino Diaz 366*f5478dedSAntonio Nino Diaz #define read_scr_el3() read_scr() 367*f5478dedSAntonio Nino Diaz #define write_scr_el3(_v) write_scr(_v) 368*f5478dedSAntonio Nino Diaz 369*f5478dedSAntonio Nino Diaz #define read_hcr_el2() read_hcr() 370*f5478dedSAntonio Nino Diaz #define write_hcr_el2(_v) write_hcr(_v) 371*f5478dedSAntonio Nino Diaz 372*f5478dedSAntonio Nino Diaz #define read_cpacr_el1() read_cpacr() 373*f5478dedSAntonio Nino Diaz #define write_cpacr_el1(_v) write_cpacr(_v) 374*f5478dedSAntonio Nino Diaz 375*f5478dedSAntonio Nino Diaz #define read_cntfrq_el0() read_cntfrq() 376*f5478dedSAntonio Nino Diaz #define write_cntfrq_el0(_v) write_cntfrq(_v) 377*f5478dedSAntonio Nino Diaz #define read_isr_el1() read_isr() 378*f5478dedSAntonio Nino Diaz 379*f5478dedSAntonio Nino Diaz #define read_cntpct_el0() read64_cntpct() 380*f5478dedSAntonio Nino Diaz 381*f5478dedSAntonio Nino Diaz #define read_ctr_el0() read_ctr() 382*f5478dedSAntonio Nino Diaz 383*f5478dedSAntonio Nino Diaz #define write_icc_sgi0r_el1(_v) write64_icc_sgi0r_el1(_v) 384*f5478dedSAntonio Nino Diaz 385*f5478dedSAntonio Nino Diaz #define read_daif() read_cpsr() 386*f5478dedSAntonio Nino Diaz #define write_daif(flags) write_cpsr(flags) 387*f5478dedSAntonio Nino Diaz 388*f5478dedSAntonio Nino Diaz #define read_cnthp_cval_el2() read64_cnthp_cval_el2() 389*f5478dedSAntonio Nino Diaz #define write_cnthp_cval_el2(v) write64_cnthp_cval_el2(v) 390*f5478dedSAntonio Nino Diaz 391*f5478dedSAntonio Nino Diaz #define read_amcntenset0_el0() read_amcntenset0() 392*f5478dedSAntonio Nino Diaz #define read_amcntenset1_el0() read_amcntenset1() 393*f5478dedSAntonio Nino Diaz 394*f5478dedSAntonio Nino Diaz /* Helper functions to manipulate CPSR */ 395*f5478dedSAntonio Nino Diaz static inline void enable_irq(void) 396*f5478dedSAntonio Nino Diaz { 397*f5478dedSAntonio Nino Diaz /* 398*f5478dedSAntonio Nino Diaz * The compiler memory barrier will prevent the compiler from 399*f5478dedSAntonio Nino Diaz * scheduling non-volatile memory access after the write to the 400*f5478dedSAntonio Nino Diaz * register. 401*f5478dedSAntonio Nino Diaz * 402*f5478dedSAntonio Nino Diaz * This could happen if some initialization code issues non-volatile 403*f5478dedSAntonio Nino Diaz * accesses to an area used by an interrupt handler, in the assumption 404*f5478dedSAntonio Nino Diaz * that it is safe as the interrupts are disabled at the time it does 405*f5478dedSAntonio Nino Diaz * that (according to program order). However, non-volatile accesses 406*f5478dedSAntonio Nino Diaz * are not necessarily in program order relatively with volatile inline 407*f5478dedSAntonio Nino Diaz * assembly statements (and volatile accesses). 408*f5478dedSAntonio Nino Diaz */ 409*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 410*f5478dedSAntonio Nino Diaz __asm__ volatile ("cpsie i"); 411*f5478dedSAntonio Nino Diaz isb(); 412*f5478dedSAntonio Nino Diaz } 413*f5478dedSAntonio Nino Diaz 414*f5478dedSAntonio Nino Diaz static inline void enable_serror(void) 415*f5478dedSAntonio Nino Diaz { 416*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 417*f5478dedSAntonio Nino Diaz __asm__ volatile ("cpsie a"); 418*f5478dedSAntonio Nino Diaz isb(); 419*f5478dedSAntonio Nino Diaz } 420*f5478dedSAntonio Nino Diaz 421*f5478dedSAntonio Nino Diaz static inline void enable_fiq(void) 422*f5478dedSAntonio Nino Diaz { 423*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 424*f5478dedSAntonio Nino Diaz __asm__ volatile ("cpsie f"); 425*f5478dedSAntonio Nino Diaz isb(); 426*f5478dedSAntonio Nino Diaz } 427*f5478dedSAntonio Nino Diaz 428*f5478dedSAntonio Nino Diaz static inline void disable_irq(void) 429*f5478dedSAntonio Nino Diaz { 430*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 431*f5478dedSAntonio Nino Diaz __asm__ volatile ("cpsid i"); 432*f5478dedSAntonio Nino Diaz isb(); 433*f5478dedSAntonio Nino Diaz } 434*f5478dedSAntonio Nino Diaz 435*f5478dedSAntonio Nino Diaz static inline void disable_serror(void) 436*f5478dedSAntonio Nino Diaz { 437*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 438*f5478dedSAntonio Nino Diaz __asm__ volatile ("cpsid a"); 439*f5478dedSAntonio Nino Diaz isb(); 440*f5478dedSAntonio Nino Diaz } 441*f5478dedSAntonio Nino Diaz 442*f5478dedSAntonio Nino Diaz static inline void disable_fiq(void) 443*f5478dedSAntonio Nino Diaz { 444*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 445*f5478dedSAntonio Nino Diaz __asm__ volatile ("cpsid f"); 446*f5478dedSAntonio Nino Diaz isb(); 447*f5478dedSAntonio Nino Diaz } 448*f5478dedSAntonio Nino Diaz 449*f5478dedSAntonio Nino Diaz #endif /* ARCH_HELPERS_H */ 450