1*f5478dedSAntonio Nino Diaz /* 2*f5478dedSAntonio Nino Diaz * Copyright (c) 2013-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 <stdbool.h> 13*f5478dedSAntonio Nino Diaz #include <stdint.h> 14*f5478dedSAntonio Nino Diaz #include <string.h> 15*f5478dedSAntonio Nino Diaz 16*f5478dedSAntonio Nino Diaz /********************************************************************** 17*f5478dedSAntonio Nino Diaz * Macros which create inline functions to read or write CPU system 18*f5478dedSAntonio Nino Diaz * registers 19*f5478dedSAntonio Nino Diaz *********************************************************************/ 20*f5478dedSAntonio Nino Diaz 21*f5478dedSAntonio Nino Diaz #define _DEFINE_SYSREG_READ_FUNC(_name, _reg_name) \ 22*f5478dedSAntonio Nino Diaz static inline u_register_t read_ ## _name(void) \ 23*f5478dedSAntonio Nino Diaz { \ 24*f5478dedSAntonio Nino Diaz u_register_t v; \ 25*f5478dedSAntonio Nino Diaz __asm__ volatile ("mrs %0, " #_reg_name : "=r" (v)); \ 26*f5478dedSAntonio Nino Diaz return v; \ 27*f5478dedSAntonio Nino Diaz } 28*f5478dedSAntonio Nino Diaz 29*f5478dedSAntonio Nino Diaz #define _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name) \ 30*f5478dedSAntonio Nino Diaz static inline void write_ ## _name(u_register_t v) \ 31*f5478dedSAntonio Nino Diaz { \ 32*f5478dedSAntonio Nino Diaz __asm__ volatile ("msr " #_reg_name ", %0" : : "r" (v)); \ 33*f5478dedSAntonio Nino Diaz } 34*f5478dedSAntonio Nino Diaz 35*f5478dedSAntonio Nino Diaz #define SYSREG_WRITE_CONST(reg_name, v) \ 36*f5478dedSAntonio Nino Diaz __asm__ volatile ("msr " #reg_name ", %0" : : "i" (v)) 37*f5478dedSAntonio Nino Diaz 38*f5478dedSAntonio Nino Diaz /* Define read function for system register */ 39*f5478dedSAntonio Nino Diaz #define DEFINE_SYSREG_READ_FUNC(_name) \ 40*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_READ_FUNC(_name, _name) 41*f5478dedSAntonio Nino Diaz 42*f5478dedSAntonio Nino Diaz /* Define read & write function for system register */ 43*f5478dedSAntonio Nino Diaz #define DEFINE_SYSREG_RW_FUNCS(_name) \ 44*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_READ_FUNC(_name, _name) \ 45*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_WRITE_FUNC(_name, _name) 46*f5478dedSAntonio Nino Diaz 47*f5478dedSAntonio Nino Diaz /* Define read & write function for renamed system register */ 48*f5478dedSAntonio Nino Diaz #define DEFINE_RENAME_SYSREG_RW_FUNCS(_name, _reg_name) \ 49*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_READ_FUNC(_name, _reg_name) \ 50*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name) 51*f5478dedSAntonio Nino Diaz 52*f5478dedSAntonio Nino Diaz /* Define read function for renamed system register */ 53*f5478dedSAntonio Nino Diaz #define DEFINE_RENAME_SYSREG_READ_FUNC(_name, _reg_name) \ 54*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_READ_FUNC(_name, _reg_name) 55*f5478dedSAntonio Nino Diaz 56*f5478dedSAntonio Nino Diaz /* Define write function for renamed system register */ 57*f5478dedSAntonio Nino Diaz #define DEFINE_RENAME_SYSREG_WRITE_FUNC(_name, _reg_name) \ 58*f5478dedSAntonio Nino Diaz _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name) 59*f5478dedSAntonio Nino Diaz 60*f5478dedSAntonio Nino Diaz /********************************************************************** 61*f5478dedSAntonio Nino Diaz * Macros to create inline functions for system instructions 62*f5478dedSAntonio Nino Diaz *********************************************************************/ 63*f5478dedSAntonio Nino Diaz 64*f5478dedSAntonio Nino Diaz /* Define function for simple system instruction */ 65*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_FUNC(_op) \ 66*f5478dedSAntonio Nino Diaz static inline void _op(void) \ 67*f5478dedSAntonio Nino Diaz { \ 68*f5478dedSAntonio Nino Diaz __asm__ (#_op); \ 69*f5478dedSAntonio Nino Diaz } 70*f5478dedSAntonio Nino Diaz 71*f5478dedSAntonio Nino Diaz /* Define function for system instruction with type specifier */ 72*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_TYPE_FUNC(_op, _type) \ 73*f5478dedSAntonio Nino Diaz static inline void _op ## _type(void) \ 74*f5478dedSAntonio Nino Diaz { \ 75*f5478dedSAntonio Nino Diaz __asm__ (#_op " " #_type); \ 76*f5478dedSAntonio Nino Diaz } 77*f5478dedSAntonio Nino Diaz 78*f5478dedSAntonio Nino Diaz /* Define function for system instruction with register parameter */ 79*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_TYPE_PARAM_FUNC(_op, _type) \ 80*f5478dedSAntonio Nino Diaz static inline void _op ## _type(uint64_t v) \ 81*f5478dedSAntonio Nino Diaz { \ 82*f5478dedSAntonio Nino Diaz __asm__ (#_op " " #_type ", %0" : : "r" (v)); \ 83*f5478dedSAntonio Nino Diaz } 84*f5478dedSAntonio Nino Diaz 85*f5478dedSAntonio Nino Diaz /******************************************************************************* 86*f5478dedSAntonio Nino Diaz * TLB maintenance accessor prototypes 87*f5478dedSAntonio Nino Diaz ******************************************************************************/ 88*f5478dedSAntonio Nino Diaz 89*f5478dedSAntonio Nino Diaz #if ERRATA_A57_813419 90*f5478dedSAntonio Nino Diaz /* 91*f5478dedSAntonio Nino Diaz * Define function for TLBI instruction with type specifier that implements 92*f5478dedSAntonio Nino Diaz * the workaround for errata 813419 of Cortex-A57. 93*f5478dedSAntonio Nino Diaz */ 94*f5478dedSAntonio Nino Diaz #define DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_FUNC(_type)\ 95*f5478dedSAntonio Nino Diaz static inline void tlbi ## _type(void) \ 96*f5478dedSAntonio Nino Diaz { \ 97*f5478dedSAntonio Nino Diaz __asm__("tlbi " #_type "\n" \ 98*f5478dedSAntonio Nino Diaz "dsb ish\n" \ 99*f5478dedSAntonio Nino Diaz "tlbi " #_type); \ 100*f5478dedSAntonio Nino Diaz } 101*f5478dedSAntonio Nino Diaz 102*f5478dedSAntonio Nino Diaz /* 103*f5478dedSAntonio Nino Diaz * Define function for TLBI instruction with register parameter that implements 104*f5478dedSAntonio Nino Diaz * the workaround for errata 813419 of Cortex-A57. 105*f5478dedSAntonio Nino Diaz */ 106*f5478dedSAntonio Nino Diaz #define DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_PARAM_FUNC(_type) \ 107*f5478dedSAntonio Nino Diaz static inline void tlbi ## _type(uint64_t v) \ 108*f5478dedSAntonio Nino Diaz { \ 109*f5478dedSAntonio Nino Diaz __asm__("tlbi " #_type ", %0\n" \ 110*f5478dedSAntonio Nino Diaz "dsb ish\n" \ 111*f5478dedSAntonio Nino Diaz "tlbi " #_type ", %0" : : "r" (v)); \ 112*f5478dedSAntonio Nino Diaz } 113*f5478dedSAntonio Nino Diaz #endif /* ERRATA_A57_813419 */ 114*f5478dedSAntonio Nino Diaz 115*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1) 116*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1is) 117*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2) 118*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2is) 119*f5478dedSAntonio Nino Diaz #if ERRATA_A57_813419 120*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_FUNC(alle3) 121*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_FUNC(alle3is) 122*f5478dedSAntonio Nino Diaz #else 123*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3) 124*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3is) 125*f5478dedSAntonio Nino Diaz #endif 126*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, vmalle1) 127*f5478dedSAntonio Nino Diaz 128*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaae1is) 129*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaale1is) 130*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vae2is) 131*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale2is) 132*f5478dedSAntonio Nino Diaz #if ERRATA_A57_813419 133*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_PARAM_FUNC(vae3is) 134*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_PARAM_FUNC(vale3is) 135*f5478dedSAntonio Nino Diaz #else 136*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vae3is) 137*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale3is) 138*f5478dedSAntonio Nino Diaz #endif 139*f5478dedSAntonio Nino Diaz 140*f5478dedSAntonio Nino Diaz /******************************************************************************* 141*f5478dedSAntonio Nino Diaz * Cache maintenance accessor prototypes 142*f5478dedSAntonio Nino Diaz ******************************************************************************/ 143*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, isw) 144*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cisw) 145*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, csw) 146*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvac) 147*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, ivac) 148*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, civac) 149*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvau) 150*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, zva) 151*f5478dedSAntonio Nino Diaz 152*f5478dedSAntonio Nino Diaz /******************************************************************************* 153*f5478dedSAntonio Nino Diaz * Address translation accessor prototypes 154*f5478dedSAntonio Nino Diaz ******************************************************************************/ 155*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1r) 156*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1w) 157*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0r) 158*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0w) 159*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e1r) 160*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e2r) 161*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e3r) 162*f5478dedSAntonio Nino Diaz 163*f5478dedSAntonio Nino Diaz void flush_dcache_range(uintptr_t addr, size_t size); 164*f5478dedSAntonio Nino Diaz void clean_dcache_range(uintptr_t addr, size_t size); 165*f5478dedSAntonio Nino Diaz void inv_dcache_range(uintptr_t addr, size_t size); 166*f5478dedSAntonio Nino Diaz 167*f5478dedSAntonio Nino Diaz void dcsw_op_louis(u_register_t op_type); 168*f5478dedSAntonio Nino Diaz void dcsw_op_all(u_register_t op_type); 169*f5478dedSAntonio Nino Diaz 170*f5478dedSAntonio Nino Diaz void disable_mmu_el1(void); 171*f5478dedSAntonio Nino Diaz void disable_mmu_el3(void); 172*f5478dedSAntonio Nino Diaz void disable_mmu_icache_el1(void); 173*f5478dedSAntonio Nino Diaz void disable_mmu_icache_el3(void); 174*f5478dedSAntonio Nino Diaz 175*f5478dedSAntonio Nino Diaz /******************************************************************************* 176*f5478dedSAntonio Nino Diaz * Misc. accessor prototypes 177*f5478dedSAntonio Nino Diaz ******************************************************************************/ 178*f5478dedSAntonio Nino Diaz 179*f5478dedSAntonio Nino Diaz #define write_daifclr(val) SYSREG_WRITE_CONST(daifclr, val) 180*f5478dedSAntonio Nino Diaz #define write_daifset(val) SYSREG_WRITE_CONST(daifset, val) 181*f5478dedSAntonio Nino Diaz 182*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(par_el1) 183*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_pfr1_el1) 184*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64isar1_el1) 185*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64pfr0_el1) 186*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64dfr0_el1) 187*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(CurrentEl) 188*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(ctr_el0) 189*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(daif) 190*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(spsr_el1) 191*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(spsr_el2) 192*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(spsr_el3) 193*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(elr_el1) 194*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(elr_el2) 195*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(elr_el3) 196*f5478dedSAntonio Nino Diaz 197*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(wfi) 198*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(wfe) 199*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(sev) 200*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, sy) 201*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, sy) 202*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, st) 203*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ld) 204*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, ish) 205*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, nsh) 206*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, ishst) 207*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, oshld) 208*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, oshst) 209*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, osh) 210*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, nshld) 211*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, nshst) 212*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, nsh) 213*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ishld) 214*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ishst) 215*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ish) 216*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(isb) 217*f5478dedSAntonio Nino Diaz 218*f5478dedSAntonio Nino Diaz static inline void enable_irq(void) 219*f5478dedSAntonio Nino Diaz { 220*f5478dedSAntonio Nino Diaz /* 221*f5478dedSAntonio Nino Diaz * The compiler memory barrier will prevent the compiler from 222*f5478dedSAntonio Nino Diaz * scheduling non-volatile memory access after the write to the 223*f5478dedSAntonio Nino Diaz * register. 224*f5478dedSAntonio Nino Diaz * 225*f5478dedSAntonio Nino Diaz * This could happen if some initialization code issues non-volatile 226*f5478dedSAntonio Nino Diaz * accesses to an area used by an interrupt handler, in the assumption 227*f5478dedSAntonio Nino Diaz * that it is safe as the interrupts are disabled at the time it does 228*f5478dedSAntonio Nino Diaz * that (according to program order). However, non-volatile accesses 229*f5478dedSAntonio Nino Diaz * are not necessarily in program order relatively with volatile inline 230*f5478dedSAntonio Nino Diaz * assembly statements (and volatile accesses). 231*f5478dedSAntonio Nino Diaz */ 232*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 233*f5478dedSAntonio Nino Diaz write_daifclr(DAIF_IRQ_BIT); 234*f5478dedSAntonio Nino Diaz isb(); 235*f5478dedSAntonio Nino Diaz } 236*f5478dedSAntonio Nino Diaz 237*f5478dedSAntonio Nino Diaz static inline void enable_fiq(void) 238*f5478dedSAntonio Nino Diaz { 239*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 240*f5478dedSAntonio Nino Diaz write_daifclr(DAIF_FIQ_BIT); 241*f5478dedSAntonio Nino Diaz isb(); 242*f5478dedSAntonio Nino Diaz } 243*f5478dedSAntonio Nino Diaz 244*f5478dedSAntonio Nino Diaz static inline void enable_serror(void) 245*f5478dedSAntonio Nino Diaz { 246*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 247*f5478dedSAntonio Nino Diaz write_daifclr(DAIF_ABT_BIT); 248*f5478dedSAntonio Nino Diaz isb(); 249*f5478dedSAntonio Nino Diaz } 250*f5478dedSAntonio Nino Diaz 251*f5478dedSAntonio Nino Diaz static inline void enable_debug_exceptions(void) 252*f5478dedSAntonio Nino Diaz { 253*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 254*f5478dedSAntonio Nino Diaz write_daifclr(DAIF_DBG_BIT); 255*f5478dedSAntonio Nino Diaz isb(); 256*f5478dedSAntonio Nino Diaz } 257*f5478dedSAntonio Nino Diaz 258*f5478dedSAntonio Nino Diaz static inline void disable_irq(void) 259*f5478dedSAntonio Nino Diaz { 260*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 261*f5478dedSAntonio Nino Diaz write_daifset(DAIF_IRQ_BIT); 262*f5478dedSAntonio Nino Diaz isb(); 263*f5478dedSAntonio Nino Diaz } 264*f5478dedSAntonio Nino Diaz 265*f5478dedSAntonio Nino Diaz static inline void disable_fiq(void) 266*f5478dedSAntonio Nino Diaz { 267*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 268*f5478dedSAntonio Nino Diaz write_daifset(DAIF_FIQ_BIT); 269*f5478dedSAntonio Nino Diaz isb(); 270*f5478dedSAntonio Nino Diaz } 271*f5478dedSAntonio Nino Diaz 272*f5478dedSAntonio Nino Diaz static inline void disable_serror(void) 273*f5478dedSAntonio Nino Diaz { 274*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 275*f5478dedSAntonio Nino Diaz write_daifset(DAIF_ABT_BIT); 276*f5478dedSAntonio Nino Diaz isb(); 277*f5478dedSAntonio Nino Diaz } 278*f5478dedSAntonio Nino Diaz 279*f5478dedSAntonio Nino Diaz static inline void disable_debug_exceptions(void) 280*f5478dedSAntonio Nino Diaz { 281*f5478dedSAntonio Nino Diaz COMPILER_BARRIER(); 282*f5478dedSAntonio Nino Diaz write_daifset(DAIF_DBG_BIT); 283*f5478dedSAntonio Nino Diaz isb(); 284*f5478dedSAntonio Nino Diaz } 285*f5478dedSAntonio Nino Diaz 286*f5478dedSAntonio Nino Diaz #if !ERROR_DEPRECATED 287*f5478dedSAntonio Nino Diaz uint32_t get_afflvl_shift(uint32_t); 288*f5478dedSAntonio Nino Diaz uint32_t mpidr_mask_lower_afflvls(uint64_t, uint32_t); 289*f5478dedSAntonio Nino Diaz 290*f5478dedSAntonio Nino Diaz void __dead2 eret(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3, 291*f5478dedSAntonio Nino Diaz uint64_t x4, uint64_t x5, uint64_t x6, uint64_t x7); 292*f5478dedSAntonio Nino Diaz #endif 293*f5478dedSAntonio Nino Diaz void __dead2 smc(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3, 294*f5478dedSAntonio Nino Diaz uint64_t x4, uint64_t x5, uint64_t x6, uint64_t x7); 295*f5478dedSAntonio Nino Diaz 296*f5478dedSAntonio Nino Diaz /******************************************************************************* 297*f5478dedSAntonio Nino Diaz * System register accessor prototypes 298*f5478dedSAntonio Nino Diaz ******************************************************************************/ 299*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(midr_el1) 300*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(mpidr_el1) 301*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64mmfr0_el1) 302*f5478dedSAntonio Nino Diaz 303*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(scr_el3) 304*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(hcr_el2) 305*f5478dedSAntonio Nino Diaz 306*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vbar_el1) 307*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vbar_el2) 308*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vbar_el3) 309*f5478dedSAntonio Nino Diaz 310*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(sctlr_el1) 311*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(sctlr_el2) 312*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(sctlr_el3) 313*f5478dedSAntonio Nino Diaz 314*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(actlr_el1) 315*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(actlr_el2) 316*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(actlr_el3) 317*f5478dedSAntonio Nino Diaz 318*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(esr_el1) 319*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(esr_el2) 320*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(esr_el3) 321*f5478dedSAntonio Nino Diaz 322*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr0_el1) 323*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr0_el2) 324*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr0_el3) 325*f5478dedSAntonio Nino Diaz 326*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr1_el1) 327*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr1_el2) 328*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr1_el3) 329*f5478dedSAntonio Nino Diaz 330*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(far_el1) 331*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(far_el2) 332*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(far_el3) 333*f5478dedSAntonio Nino Diaz 334*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mair_el1) 335*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mair_el2) 336*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mair_el3) 337*f5478dedSAntonio Nino Diaz 338*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(amair_el1) 339*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(amair_el2) 340*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(amair_el3) 341*f5478dedSAntonio Nino Diaz 342*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(rvbar_el1) 343*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(rvbar_el2) 344*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(rvbar_el3) 345*f5478dedSAntonio Nino Diaz 346*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(rmr_el1) 347*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(rmr_el2) 348*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(rmr_el3) 349*f5478dedSAntonio Nino Diaz 350*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tcr_el1) 351*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tcr_el2) 352*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tcr_el3) 353*f5478dedSAntonio Nino Diaz 354*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr0_el1) 355*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr0_el2) 356*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr0_el3) 357*f5478dedSAntonio Nino Diaz 358*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr1_el1) 359*f5478dedSAntonio Nino Diaz 360*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vttbr_el2) 361*f5478dedSAntonio Nino Diaz 362*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cptr_el2) 363*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cptr_el3) 364*f5478dedSAntonio Nino Diaz 365*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cpacr_el1) 366*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntfrq_el0) 367*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthp_ctl_el2) 368*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthp_tval_el2) 369*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthp_cval_el2) 370*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntps_ctl_el1) 371*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntps_tval_el1) 372*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntps_cval_el1) 373*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntp_ctl_el0) 374*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntp_tval_el0) 375*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntp_cval_el0) 376*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(cntpct_el0) 377*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthctl_el2) 378*f5478dedSAntonio Nino Diaz 379*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_enable(x) (((x) >> CNTP_CTL_ENABLE_SHIFT) & \ 380*f5478dedSAntonio Nino Diaz CNTP_CTL_ENABLE_MASK) 381*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_imask(x) (((x) >> CNTP_CTL_IMASK_SHIFT) & \ 382*f5478dedSAntonio Nino Diaz CNTP_CTL_IMASK_MASK) 383*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_istatus(x) (((x) >> CNTP_CTL_ISTATUS_SHIFT) & \ 384*f5478dedSAntonio Nino Diaz CNTP_CTL_ISTATUS_MASK) 385*f5478dedSAntonio Nino Diaz 386*f5478dedSAntonio Nino Diaz #define set_cntp_ctl_enable(x) ((x) |= (U(1) << CNTP_CTL_ENABLE_SHIFT)) 387*f5478dedSAntonio Nino Diaz #define set_cntp_ctl_imask(x) ((x) |= (U(1) << CNTP_CTL_IMASK_SHIFT)) 388*f5478dedSAntonio Nino Diaz 389*f5478dedSAntonio Nino Diaz #define clr_cntp_ctl_enable(x) ((x) &= ~(U(1) << CNTP_CTL_ENABLE_SHIFT)) 390*f5478dedSAntonio Nino Diaz #define clr_cntp_ctl_imask(x) ((x) &= ~(U(1) << CNTP_CTL_IMASK_SHIFT)) 391*f5478dedSAntonio Nino Diaz 392*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tpidr_el3) 393*f5478dedSAntonio Nino Diaz 394*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntvoff_el2) 395*f5478dedSAntonio Nino Diaz 396*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vpidr_el2) 397*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vmpidr_el2) 398*f5478dedSAntonio Nino Diaz 399*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(isr_el1) 400*f5478dedSAntonio Nino Diaz 401*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mdcr_el2) 402*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mdcr_el3) 403*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(hstr_el2) 404*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(pmcr_el0) 405*f5478dedSAntonio Nino Diaz 406*f5478dedSAntonio Nino Diaz /* GICv3 System Registers */ 407*f5478dedSAntonio Nino Diaz 408*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el1, ICC_SRE_EL1) 409*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el2, ICC_SRE_EL2) 410*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el3, ICC_SRE_EL3) 411*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_pmr_el1, ICC_PMR_EL1) 412*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_rpr_el1, ICC_RPR_EL1) 413*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen1_el3, ICC_IGRPEN1_EL3) 414*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen1_el1, ICC_IGRPEN1_EL1) 415*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen0_el1, ICC_IGRPEN0_EL1) 416*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_hppir0_el1, ICC_HPPIR0_EL1) 417*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_hppir1_el1, ICC_HPPIR1_EL1) 418*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_iar0_el1, ICC_IAR0_EL1) 419*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_iar1_el1, ICC_IAR1_EL1) 420*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir0_el1, ICC_EOIR0_EL1) 421*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir1_el1, ICC_EOIR1_EL1) 422*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_sgi0r_el1, ICC_SGI0R_EL1) 423*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sgi1r, ICC_SGI1R) 424*f5478dedSAntonio Nino Diaz 425*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcgcr_el0, AMCGCR_EL0) 426*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenclr0_el0, AMCNTENCLR0_EL0) 427*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenset0_el0, AMCNTENSET0_EL0) 428*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenclr1_el0, AMCNTENCLR1_EL0) 429*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenset1_el0, AMCNTENSET1_EL0) 430*f5478dedSAntonio Nino Diaz 431*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(mpamidr_el1, MPAMIDR_EL1) 432*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(mpam3_el3, MPAM3_EL3) 433*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(mpam2_el2, MPAM2_EL2) 434*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(mpamhcr_el2, MPAMHCR_EL2) 435*f5478dedSAntonio Nino Diaz 436*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(pmblimitr_el1, PMBLIMITR_EL1) 437*f5478dedSAntonio Nino Diaz 438*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(zcr_el3, ZCR_EL3) 439*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(zcr_el2, ZCR_EL2) 440*f5478dedSAntonio Nino Diaz 441*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erridr_el1, ERRIDR_EL1) 442*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(errselr_el1, ERRSELR_EL1) 443*f5478dedSAntonio Nino Diaz 444*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxfr_el1, ERXFR_EL1) 445*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(erxctlr_el1, ERXCTLR_EL1) 446*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(erxstatus_el1, ERXSTATUS_EL1) 447*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxaddr_el1, ERXADDR_EL1) 448*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxmisc0_el1, ERXMISC0_EL1) 449*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxmisc1_el1, ERXMISC1_EL1) 450*f5478dedSAntonio Nino Diaz 451*f5478dedSAntonio Nino Diaz /* Armv8.3 Pointer Authentication Registers */ 452*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(apgakeylo_el1, APGAKeyLo_EL1) 453*f5478dedSAntonio Nino Diaz 454*f5478dedSAntonio Nino Diaz #define IS_IN_EL(x) \ 455*f5478dedSAntonio Nino Diaz (GET_EL(read_CurrentEl()) == MODE_EL##x) 456*f5478dedSAntonio Nino Diaz 457*f5478dedSAntonio Nino Diaz #define IS_IN_EL1() IS_IN_EL(1) 458*f5478dedSAntonio Nino Diaz #define IS_IN_EL2() IS_IN_EL(2) 459*f5478dedSAntonio Nino Diaz #define IS_IN_EL3() IS_IN_EL(3) 460*f5478dedSAntonio Nino Diaz 461*f5478dedSAntonio Nino Diaz static inline unsigned int get_current_el(void) 462*f5478dedSAntonio Nino Diaz { 463*f5478dedSAntonio Nino Diaz return GET_EL(read_CurrentEl()); 464*f5478dedSAntonio Nino Diaz } 465*f5478dedSAntonio Nino Diaz 466*f5478dedSAntonio Nino Diaz /* 467*f5478dedSAntonio Nino Diaz * Check if an EL is implemented from AA64PFR0 register fields. 468*f5478dedSAntonio Nino Diaz */ 469*f5478dedSAntonio Nino Diaz static inline uint64_t el_implemented(unsigned int el) 470*f5478dedSAntonio Nino Diaz { 471*f5478dedSAntonio Nino Diaz if (el > 3U) { 472*f5478dedSAntonio Nino Diaz return EL_IMPL_NONE; 473*f5478dedSAntonio Nino Diaz } else { 474*f5478dedSAntonio Nino Diaz unsigned int shift = ID_AA64PFR0_EL1_SHIFT * el; 475*f5478dedSAntonio Nino Diaz 476*f5478dedSAntonio Nino Diaz return (read_id_aa64pfr0_el1() >> shift) & ID_AA64PFR0_ELX_MASK; 477*f5478dedSAntonio Nino Diaz } 478*f5478dedSAntonio Nino Diaz } 479*f5478dedSAntonio Nino Diaz 480*f5478dedSAntonio Nino Diaz #if !ERROR_DEPRECATED 481*f5478dedSAntonio Nino Diaz #define EL_IMPLEMENTED(_el) el_implemented(_el) 482*f5478dedSAntonio Nino Diaz #endif 483*f5478dedSAntonio Nino Diaz 484*f5478dedSAntonio Nino Diaz /* Previously defined accesor functions with incomplete register names */ 485*f5478dedSAntonio Nino Diaz 486*f5478dedSAntonio Nino Diaz #define read_current_el() read_CurrentEl() 487*f5478dedSAntonio Nino Diaz 488*f5478dedSAntonio Nino Diaz #define dsb() dsbsy() 489*f5478dedSAntonio Nino Diaz 490*f5478dedSAntonio Nino Diaz #define read_midr() read_midr_el1() 491*f5478dedSAntonio Nino Diaz 492*f5478dedSAntonio Nino Diaz #define read_mpidr() read_mpidr_el1() 493*f5478dedSAntonio Nino Diaz 494*f5478dedSAntonio Nino Diaz #define read_scr() read_scr_el3() 495*f5478dedSAntonio Nino Diaz #define write_scr(_v) write_scr_el3(_v) 496*f5478dedSAntonio Nino Diaz 497*f5478dedSAntonio Nino Diaz #define read_hcr() read_hcr_el2() 498*f5478dedSAntonio Nino Diaz #define write_hcr(_v) write_hcr_el2(_v) 499*f5478dedSAntonio Nino Diaz 500*f5478dedSAntonio Nino Diaz #define read_cpacr() read_cpacr_el1() 501*f5478dedSAntonio Nino Diaz #define write_cpacr(_v) write_cpacr_el1(_v) 502*f5478dedSAntonio Nino Diaz 503*f5478dedSAntonio Nino Diaz #endif /* ARCH_HELPERS_H */ 504