12559b2c8SAntonio Nino Diaz /* 2b0b7609eSBoyan Karatotev * Copyright (c) 2019-2025, Arm Limited. All rights reserved. 32559b2c8SAntonio Nino Diaz * 42559b2c8SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 52559b2c8SAntonio Nino Diaz */ 62559b2c8SAntonio Nino Diaz 72559b2c8SAntonio Nino Diaz #ifndef ARCH_FEATURES_H 82559b2c8SAntonio Nino Diaz #define ARCH_FEATURES_H 92559b2c8SAntonio Nino Diaz 102559b2c8SAntonio Nino Diaz #include <stdbool.h> 112559b2c8SAntonio Nino Diaz 122559b2c8SAntonio Nino Diaz #include <arch_helpers.h> 13ce485955SAndre Przywara #include <common/feat_detect.h> 14f396aec8SArvind Ram Prakash #include <lib/cpus/errata.h> 15f396aec8SArvind Ram Prakash #include <lib/el3_runtime/context_mgmt.h> 16f396aec8SArvind Ram Prakash #include <lib/el3_runtime/cpu_data.h> 172559b2c8SAntonio Nino Diaz 18d508bab3SArvind Ram Prakash #if ENABLE_RME 19d508bab3SArvind Ram Prakash #define FEAT_ENABLE_ALL_WORLDS \ 20d508bab3SArvind Ram Prakash ((1u << CPU_CONTEXT_SECURE) | \ 21d508bab3SArvind Ram Prakash (1u << CPU_CONTEXT_NS) | \ 22d508bab3SArvind Ram Prakash (1u << CPU_CONTEXT_REALM)) 23d508bab3SArvind Ram Prakash #define FEAT_ENABLE_REALM (1 << CPU_CONTEXT_REALM) 24d508bab3SArvind Ram Prakash #else 25d508bab3SArvind Ram Prakash #define FEAT_ENABLE_ALL_WORLDS \ 26d508bab3SArvind Ram Prakash ((1u << CPU_CONTEXT_SECURE) | \ 27d508bab3SArvind Ram Prakash (1u << CPU_CONTEXT_NS)) 28d508bab3SArvind Ram Prakash #define FEAT_ENABLE_REALM U(0) 29d508bab3SArvind Ram Prakash #endif 30d508bab3SArvind Ram Prakash 31d508bab3SArvind Ram Prakash #define FEAT_ENABLE_SECURE (1 << CPU_CONTEXT_SECURE) 32d508bab3SArvind Ram Prakash #define FEAT_ENABLE_NS (1 << CPU_CONTEXT_NS) 33d508bab3SArvind Ram Prakash 34aaaf2cc3SSona Mathew #define ISOLATE_FIELD(reg, feat, mask) \ 35aaaf2cc3SSona Mathew ((unsigned int)(((reg) >> (feat)) & mask)) 36a8d5d3d5SAndre Przywara 37f396aec8SArvind Ram Prakash #define SHOULD_ID_FIELD_DISABLE(guard, enabled_worlds, world) \ 38f396aec8SArvind Ram Prakash (((guard) == 0U) || ((((enabled_worlds) >> (world)) & 1U) == 0U)) 39f396aec8SArvind Ram Prakash 40f396aec8SArvind Ram Prakash 41aaaf2cc3SSona Mathew #define CREATE_FEATURE_SUPPORTED(name, read_func, guard) \ 420dfa07b6SOlivier Deprez __attribute__((always_inline)) \ 43a8d5d3d5SAndre Przywara static inline bool is_ ## name ## _supported(void) \ 44a8d5d3d5SAndre Przywara { \ 45a8d5d3d5SAndre Przywara if ((guard) == FEAT_STATE_DISABLED) { \ 46a8d5d3d5SAndre Przywara return false; \ 47a8d5d3d5SAndre Przywara } \ 48a8d5d3d5SAndre Przywara if ((guard) == FEAT_STATE_ALWAYS) { \ 49a8d5d3d5SAndre Przywara return true; \ 50a8d5d3d5SAndre Przywara } \ 51aaaf2cc3SSona Mathew return read_func(); \ 52a8d5d3d5SAndre Przywara } 53a8d5d3d5SAndre Przywara 54f396aec8SArvind Ram Prakash /* 55f396aec8SArvind Ram Prakash * CREATE_IDREG_UPDATE and CREATE_PERCPU_IDREG_UPDATE are two macros that 56f396aec8SArvind Ram Prakash * generate the update_feat_abc_idreg_field() function based on how its 57f396aec8SArvind Ram Prakash * corresponding ID register is cached. 58f396aec8SArvind Ram Prakash * The function disables ID register fields related to a feature if the build 59f396aec8SArvind Ram Prakash * flag for that feature is 0 or if the feature should be disabled for that 60f396aec8SArvind Ram Prakash * world. If the particular field has to be disabled, its field in the cached 61f396aec8SArvind Ram Prakash * ID register is set to 0. 62f396aec8SArvind Ram Prakash * 63f396aec8SArvind Ram Prakash * Note: For most ID register fields, a value of 0 represents 64f396aec8SArvind Ram Prakash * the Unimplemented state, and hence we use this macro to show features 65f396aec8SArvind Ram Prakash * disabled in EL3 as unimplemented to lower ELs. However, certain feature's 66f396aec8SArvind Ram Prakash * ID Register fields (like ID_AA64MMFR4_EL1.E2H0) deviate from this convention, 67f396aec8SArvind Ram Prakash * where 0 does not represent Unimplemented. 68f396aec8SArvind Ram Prakash * For those features, a custom update_feat_abc_idreg_field() 69f396aec8SArvind Ram Prakash * needs to be created. This custom function should set the field to the 70f396aec8SArvind Ram Prakash * feature's unimplemented state value if the feature is disabled in EL3. 71f396aec8SArvind Ram Prakash * 72f396aec8SArvind Ram Prakash * For example: 73f396aec8SArvind Ram Prakash * 74f396aec8SArvind Ram Prakash * __attribute__((always_inline)) 75f396aec8SArvind Ram Prakash * static inline void update_feat_abc_idreg_field(size_t security_state) 76f396aec8SArvind Ram Prakash * { 77f396aec8SArvind Ram Prakash * if (SHOULD_ID_FIELD_DISABLE(guard, enabled_worlds, security_state)) { 78f396aec8SArvind Ram Prakash * per_world_context_t *per_world_ctx = 79f396aec8SArvind Ram Prakash * &per_world_context[security_state]; 80f396aec8SArvind Ram Prakash * perworld_idregs_t *perworld_idregs = &(per_world_ctx->idregs); 81f396aec8SArvind Ram Prakash * 82f396aec8SArvind Ram Prakash * perworld_idregs->idreg &= 83f396aec8SArvind Ram Prakash * ~((u_register_t)mask << idfield); 84f396aec8SArvind Ram Prakash * perworld_idregs->idreg |= 85f396aec8SArvind Ram Prakash * (((u_register_t)<unimplemented state value> & mask) << idfield); 86f396aec8SArvind Ram Prakash * } 87f396aec8SArvind Ram Prakash * } 88f396aec8SArvind Ram Prakash */ 89f396aec8SArvind Ram Prakash 90f396aec8SArvind Ram Prakash #if (ENABLE_FEAT_IDTE3 && IMAGE_BL31) 91f396aec8SArvind Ram Prakash #define CREATE_IDREG_UPDATE(name, idreg, idfield, mask, guard, enabled_worlds) \ 92f396aec8SArvind Ram Prakash __attribute__((always_inline)) \ 93f396aec8SArvind Ram Prakash static inline void update_ ## name ## _idreg_field(size_t security_state) \ 94f396aec8SArvind Ram Prakash { \ 95f396aec8SArvind Ram Prakash if (SHOULD_ID_FIELD_DISABLE(guard, enabled_worlds, security_state)) { \ 96f396aec8SArvind Ram Prakash per_world_context_t *per_world_ctx = \ 97f396aec8SArvind Ram Prakash &per_world_context[security_state]; \ 98f396aec8SArvind Ram Prakash perworld_idregs_t *perworld_idregs = &(per_world_ctx->idregs); \ 99f396aec8SArvind Ram Prakash perworld_idregs->idreg &= ~((u_register_t)mask << idfield); \ 100f396aec8SArvind Ram Prakash } \ 101f396aec8SArvind Ram Prakash } 102f396aec8SArvind Ram Prakash #define CREATE_PERCPU_IDREG_UPDATE(name, idreg, idfield, mask, guard, \ 103f396aec8SArvind Ram Prakash enabled_worlds) \ 104f396aec8SArvind Ram Prakash __attribute__((always_inline)) \ 105f396aec8SArvind Ram Prakash static inline void update_ ## name ## _idreg_field(size_t security_state) \ 106f396aec8SArvind Ram Prakash { \ 107f396aec8SArvind Ram Prakash if (SHOULD_ID_FIELD_DISABLE(guard, enabled_worlds, security_state)) { \ 108f396aec8SArvind Ram Prakash percpu_idregs_t *percpu_idregs = \ 109f396aec8SArvind Ram Prakash &(get_cpu_data(idregs[security_state]));\ 110f396aec8SArvind Ram Prakash percpu_idregs->idreg &= ~((u_register_t)mask << idfield); \ 111f396aec8SArvind Ram Prakash } \ 112f396aec8SArvind Ram Prakash } 113f396aec8SArvind Ram Prakash #else 114f396aec8SArvind Ram Prakash #define CREATE_IDREG_UPDATE(name, idreg, idfield, mask, guard, enabled_worlds) 115f396aec8SArvind Ram Prakash #define CREATE_PERCPU_IDREG_UPDATE(name, idreg, idfield, mask, guard, \ 116f396aec8SArvind Ram Prakash enabled_worlds) 117f396aec8SArvind Ram Prakash #endif 118f396aec8SArvind Ram Prakash 119f396aec8SArvind Ram Prakash #define _CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval) \ 1200dfa07b6SOlivier Deprez __attribute__((always_inline)) \ 121aaaf2cc3SSona Mathew static inline bool is_ ## name ## _present(void) \ 122a8d5d3d5SAndre Przywara { \ 123aaaf2cc3SSona Mathew return (ISOLATE_FIELD(read_ ## idreg(), idfield, mask) >= idval) \ 124aaaf2cc3SSona Mathew ? true : false; \ 125aaaf2cc3SSona Mathew } 126aaaf2cc3SSona Mathew 127f396aec8SArvind Ram Prakash #define CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval, \ 128f396aec8SArvind Ram Prakash enabled_worlds) \ 129f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval) \ 130f396aec8SArvind Ram Prakash CREATE_IDREG_UPDATE(name, idreg, idfield, mask, 1U, enabled_worlds) 131f396aec8SArvind Ram Prakash 132f396aec8SArvind Ram Prakash #define CREATE_PERCPU_FEATURE_PRESENT(name, idreg, idfield, mask, idval, \ 133f396aec8SArvind Ram Prakash enabled_worlds) \ 134f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval) \ 135f396aec8SArvind Ram Prakash CREATE_PERCPU_IDREG_UPDATE(name, idreg, idfield, mask, 1U, \ 136f396aec8SArvind Ram Prakash enabled_worlds) 137f396aec8SArvind Ram Prakash 138d508bab3SArvind Ram Prakash #define CREATE_FEATURE_FUNCS(name, idreg, idfield, mask, idval, guard, \ 139d508bab3SArvind Ram Prakash enabled_worlds) \ 140f396aec8SArvind Ram Prakash CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval, \ 141f396aec8SArvind Ram Prakash enabled_worlds) \ 142aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(name, is_ ## name ## _present, guard) 143aaaf2cc3SSona Mathew 144f396aec8SArvind Ram Prakash #define CREATE_PERCPU_FEATURE_FUNCS(name, idreg, idfield, mask, idval, guard, \ 145f396aec8SArvind Ram Prakash enabled_worlds) \ 146f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_PRESENT(name, idreg, idfield, mask, idval, \ 147f396aec8SArvind Ram Prakash enabled_worlds) \ 148f396aec8SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(name, is_ ## name ## _present, guard) 149aaaf2cc3SSona Mathew 150aaaf2cc3SSona Mathew /* +----------------------------+ 151aaaf2cc3SSona Mathew * | Features supported | 152aaaf2cc3SSona Mathew * +----------------------------+ 153aaaf2cc3SSona Mathew * | GENTIMER | 154aaaf2cc3SSona Mathew * +----------------------------+ 155aaaf2cc3SSona Mathew * | FEAT_PAN | 156aaaf2cc3SSona Mathew * +----------------------------+ 157aaaf2cc3SSona Mathew * | FEAT_VHE | 158aaaf2cc3SSona Mathew * +----------------------------+ 159aaaf2cc3SSona Mathew * | FEAT_TTCNP | 160aaaf2cc3SSona Mathew * +----------------------------+ 161aaaf2cc3SSona Mathew * | FEAT_UAO | 162aaaf2cc3SSona Mathew * +----------------------------+ 163aaaf2cc3SSona Mathew * | FEAT_PACQARMA3 | 164aaaf2cc3SSona Mathew * +----------------------------+ 165aaaf2cc3SSona Mathew * | FEAT_PAUTH | 166aaaf2cc3SSona Mathew * +----------------------------+ 167aaaf2cc3SSona Mathew * | FEAT_TTST | 168aaaf2cc3SSona Mathew * +----------------------------+ 169aaaf2cc3SSona Mathew * | FEAT_BTI | 170aaaf2cc3SSona Mathew * +----------------------------+ 171aaaf2cc3SSona Mathew * | FEAT_MTE2 | 172aaaf2cc3SSona Mathew * +----------------------------+ 173aaaf2cc3SSona Mathew * | FEAT_SSBS | 174aaaf2cc3SSona Mathew * +----------------------------+ 175aaaf2cc3SSona Mathew * | FEAT_NMI | 176aaaf2cc3SSona Mathew * +----------------------------+ 177aaaf2cc3SSona Mathew * | FEAT_GCS | 178aaaf2cc3SSona Mathew * +----------------------------+ 179aaaf2cc3SSona Mathew * | FEAT_EBEP | 180aaaf2cc3SSona Mathew * +----------------------------+ 181aaaf2cc3SSona Mathew * | FEAT_SEBEP | 182aaaf2cc3SSona Mathew * +----------------------------+ 183aaaf2cc3SSona Mathew * | FEAT_SEL2 | 184aaaf2cc3SSona Mathew * +----------------------------+ 185aaaf2cc3SSona Mathew * | FEAT_TWED | 186aaaf2cc3SSona Mathew * +----------------------------+ 187aaaf2cc3SSona Mathew * | FEAT_FGT | 188aaaf2cc3SSona Mathew * +----------------------------+ 189aaaf2cc3SSona Mathew * | FEAT_EC/ECV2 | 190aaaf2cc3SSona Mathew * +----------------------------+ 191aaaf2cc3SSona Mathew * | FEAT_RNG | 192aaaf2cc3SSona Mathew * +----------------------------+ 193aaaf2cc3SSona Mathew * | FEAT_TCR2 | 194aaaf2cc3SSona Mathew * +----------------------------+ 195aaaf2cc3SSona Mathew * | FEAT_S2POE | 196aaaf2cc3SSona Mathew * +----------------------------+ 197aaaf2cc3SSona Mathew * | FEAT_S1POE | 198aaaf2cc3SSona Mathew * +----------------------------+ 199aaaf2cc3SSona Mathew * | FEAT_S2PIE | 200aaaf2cc3SSona Mathew * +----------------------------+ 201aaaf2cc3SSona Mathew * | FEAT_S1PIE | 202aaaf2cc3SSona Mathew * +----------------------------+ 203aaaf2cc3SSona Mathew * | FEAT_AMU/AMUV1P1 | 204aaaf2cc3SSona Mathew * +----------------------------+ 205aaaf2cc3SSona Mathew * | FEAT_MPAM | 206aaaf2cc3SSona Mathew * +----------------------------+ 207aaaf2cc3SSona Mathew * | FEAT_HCX | 208aaaf2cc3SSona Mathew * +----------------------------+ 209aaaf2cc3SSona Mathew * | FEAT_RNG_TRAP | 210aaaf2cc3SSona Mathew * +----------------------------+ 211aaaf2cc3SSona Mathew * | FEAT_RME | 212aaaf2cc3SSona Mathew * +----------------------------+ 213aaaf2cc3SSona Mathew * | FEAT_SB | 214aaaf2cc3SSona Mathew * +----------------------------+ 215*3a6e53c8SArvind Ram Prakash * | FEAT_CSV2_2/CSV2_3 | 216aaaf2cc3SSona Mathew * +----------------------------+ 217aaaf2cc3SSona Mathew * | FEAT_SPE | 218aaaf2cc3SSona Mathew * +----------------------------+ 219aaaf2cc3SSona Mathew * | FEAT_SVE | 220aaaf2cc3SSona Mathew * +----------------------------+ 221aaaf2cc3SSona Mathew * | FEAT_RAS | 222aaaf2cc3SSona Mathew * +----------------------------+ 223aaaf2cc3SSona Mathew * | FEAT_DIT | 224aaaf2cc3SSona Mathew * +----------------------------+ 225aaaf2cc3SSona Mathew * | FEAT_SYS_REG_TRACE | 226aaaf2cc3SSona Mathew * +----------------------------+ 227aaaf2cc3SSona Mathew * | FEAT_TRF | 228aaaf2cc3SSona Mathew * +----------------------------+ 2293c0ebab5SArvind Ram Prakash * | FEAT_NV2 | 230aaaf2cc3SSona Mathew * +----------------------------+ 231aaaf2cc3SSona Mathew * | FEAT_BRBE | 232aaaf2cc3SSona Mathew * +----------------------------+ 233aaaf2cc3SSona Mathew * | FEAT_TRBE | 234aaaf2cc3SSona Mathew * +----------------------------+ 235aaaf2cc3SSona Mathew * | FEAT_SME/SME2 | 236aaaf2cc3SSona Mathew * +----------------------------+ 237aaaf2cc3SSona Mathew * | FEAT_PMUV3 | 238aaaf2cc3SSona Mathew * +----------------------------+ 239aaaf2cc3SSona Mathew * | FEAT_MTPMU | 240aaaf2cc3SSona Mathew * +----------------------------+ 24133e6aaacSArvind Ram Prakash * | FEAT_FGT2 | 24233e6aaacSArvind Ram Prakash * +----------------------------+ 2436d0433f0SJayanth Dodderi Chidanand * | FEAT_THE | 2446d0433f0SJayanth Dodderi Chidanand * +----------------------------+ 2454ec4e545SJayanth Dodderi Chidanand * | FEAT_SCTLR2 | 2464ec4e545SJayanth Dodderi Chidanand * +----------------------------+ 24730655136SGovindraj Raja * | FEAT_D128 | 24830655136SGovindraj Raja * +----------------------------+ 24919d52a83SAndre Przywara * | FEAT_LS64_ACCDATA | 25019d52a83SAndre Przywara * +----------------------------+ 251a57e18e4SArvind Ram Prakash * | FEAT_FPMR | 252a57e18e4SArvind Ram Prakash * +----------------------------+ 2536b8df7b9SArvind Ram Prakash * | FEAT_MOPS | 2546b8df7b9SArvind Ram Prakash * +----------------------------+ 255025b1b81SJohn Powell * | FEAT_PAUTH_LR | 256025b1b81SJohn Powell * +----------------------------+ 2574274b526SArvind Ram Prakash * | FEAT_FGWTE3 | 2584274b526SArvind Ram Prakash * +----------------------------+ 259c42aefd3SArvind Ram Prakash * | FEAT_MPAM_PE_BW_CTRL | 260c42aefd3SArvind Ram Prakash * +----------------------------+ 261a1032bebSJohn Powell * | FEAT_CPA2 | 262a1032bebSJohn Powell * +----------------------------+ 263cc2523bbSAndre Przywara * | FEAT_AIE | 264cc2523bbSAndre Przywara * +----------------------------+ 265b3bcfd12SAndre Przywara * | FEAT_PFAR | 266b3bcfd12SAndre Przywara * +----------------------------+ 26709a4bcb8SGirish Pathak * | FEAT_RME_GPC2 | 26809a4bcb8SGirish Pathak * +----------------------------+ 2695e827bf0STimothy Hayes * | FEAT_RME_GDI | 2705e827bf0STimothy Hayes * +----------------------------+ 271f396aec8SArvind Ram Prakash * | FEAT_IDTE3 | 272f396aec8SArvind Ram Prakash * +----------------------------+ 273aaaf2cc3SSona Mathew */ 274fd1dd4cbSAndre Przywara 2750dfa07b6SOlivier Deprez __attribute__((always_inline)) 27629a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void) 27729a24134SAntonio Nino Diaz { 27829a24134SAntonio Nino Diaz /* The Generic Timer is always present in an ARMv8-A implementation */ 27929a24134SAntonio Nino Diaz return true; 28029a24134SAntonio Nino Diaz } 28129a24134SAntonio Nino Diaz 282aaaf2cc3SSona Mathew /* FEAT_PAN: Privileged access never */ 283a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_pan, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_PAN_SHIFT, 284d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_PAN_MASK, 1U, ENABLE_FEAT_PAN, 285d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 28630f05b4fSManish Pandey 287aaaf2cc3SSona Mathew /* FEAT_VHE: Virtualization Host Extensions */ 288a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_vhe, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_VHE_SHIFT, 289d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_VHE_MASK, 1U, ENABLE_FEAT_VHE, 290d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 29137596fcbSDaniel Boulby 292aaaf2cc3SSona Mathew /* FEAT_TTCNP: Translation table common not private */ 293aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttcnp, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_CNP_SHIFT, 294f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_CNP_MASK, 1U, 295f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 2962559b2c8SAntonio Nino Diaz 297aaaf2cc3SSona Mathew /* FEAT_UAO: User access override */ 298aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_uao, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_UAO_SHIFT, 299f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_UAO_MASK, 1U, 300f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 3019ff5f754SJuan Pablo Conde 3029ff5f754SJuan Pablo Conde /* If any of the fields is not zero, QARMA3 algorithm is present */ 303aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_pacqarma3, id_aa64isar2_el1, 0, 304aaaf2cc3SSona Mathew ((ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) | 305f396aec8SArvind Ram Prakash (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT)), 1U, 306f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 3079ff5f754SJuan Pablo Conde 308b0b7609eSBoyan Karatotev /* FEAT_PAUTH: Pointer Authentication */ 3090dfa07b6SOlivier Deprez __attribute__((always_inline)) 310b0b7609eSBoyan Karatotev static inline bool is_feat_pauth_present(void) 311b86048c4SAntonio Nino Diaz { 3129ff5f754SJuan Pablo Conde uint64_t mask_id_aa64isar1 = 3139ff5f754SJuan Pablo Conde (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) | 314b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) | 315b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) | 316b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT); 317b86048c4SAntonio Nino Diaz 3189ff5f754SJuan Pablo Conde /* 3199ff5f754SJuan Pablo Conde * If any of the fields is not zero or QARMA3 is present, 3209ff5f754SJuan Pablo Conde * PAuth is present 3219ff5f754SJuan Pablo Conde */ 3229ff5f754SJuan Pablo Conde return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U || 3239ff5f754SJuan Pablo Conde is_feat_pacqarma3_present()); 324b86048c4SAntonio Nino Diaz } 325b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(feat_pauth, is_feat_pauth_present, ENABLE_PAUTH) 326b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(ctx_pauth, is_feat_pauth_present, CTX_INCLUDE_PAUTH_REGS) 327b86048c4SAntonio Nino Diaz 328f396aec8SArvind Ram Prakash #if (ENABLE_FEAT_IDTE3 && IMAGE_BL31) 329f396aec8SArvind Ram Prakash __attribute__((always_inline)) 330f396aec8SArvind Ram Prakash static inline void update_feat_pauth_idreg_field(size_t security_state) 331f396aec8SArvind Ram Prakash { 332f396aec8SArvind Ram Prakash uint64_t mask_id_aa64isar1 = 333f396aec8SArvind Ram Prakash (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) | 334f396aec8SArvind Ram Prakash (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) | 335f396aec8SArvind Ram Prakash (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) | 336f396aec8SArvind Ram Prakash (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT); 337f396aec8SArvind Ram Prakash 338f396aec8SArvind Ram Prakash uint64_t mask_id_aa64isar2 = 339f396aec8SArvind Ram Prakash (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_MASK) | 340f396aec8SArvind Ram Prakash (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_MASK); 341f396aec8SArvind Ram Prakash 342f396aec8SArvind Ram Prakash per_world_context_t *per_world_ctx = &per_world_context[security_state]; 343f396aec8SArvind Ram Prakash perworld_idregs_t *perworld_idregs = 344f396aec8SArvind Ram Prakash &(per_world_ctx->idregs); 345f396aec8SArvind Ram Prakash 346f396aec8SArvind Ram Prakash if ((SHOULD_ID_FIELD_DISABLE(ENABLE_PAUTH, FEAT_ENABLE_NS, 347f396aec8SArvind Ram Prakash security_state)) && 348f396aec8SArvind Ram Prakash (SHOULD_ID_FIELD_DISABLE(CTX_INCLUDE_PAUTH_REGS, 349f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS, 350f396aec8SArvind Ram Prakash security_state))) { 351f396aec8SArvind Ram Prakash perworld_idregs->id_aa64isar1_el1 &= ~(mask_id_aa64isar1); 352f396aec8SArvind Ram Prakash perworld_idregs->id_aa64isar2_el1 &= ~(mask_id_aa64isar2); 353f396aec8SArvind Ram Prakash } 354f396aec8SArvind Ram Prakash } 355f396aec8SArvind Ram Prakash #endif 356f396aec8SArvind Ram Prakash 357025b1b81SJohn Powell /* 358025b1b81SJohn Powell * FEAT_PAUTH_LR 359025b1b81SJohn Powell * This feature has a non-standard discovery method so define this function 360025b1b81SJohn Powell * manually then call use the CREATE_FEATURE_SUPPORTED macro with it. This 361025b1b81SJohn Powell * feature is enabled with ENABLE_PAUTH when present. 362025b1b81SJohn Powell */ 363025b1b81SJohn Powell __attribute__((always_inline)) 364025b1b81SJohn Powell static inline bool is_feat_pauth_lr_present(void) 365025b1b81SJohn Powell { 366025b1b81SJohn Powell /* 367025b1b81SJohn Powell * FEAT_PAUTH_LR support is indicated by up to 3 fields, if one or more 368025b1b81SJohn Powell * of these is 0b0110 then the feature is present. 369025b1b81SJohn Powell * 1) id_aa64isr1_el1.api 370025b1b81SJohn Powell * 2) id_aa64isr1_el1.apa 371025b1b81SJohn Powell * 3) id_aa64isr2_el1.apa3 372025b1b81SJohn Powell */ 373025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_API_SHIFT, ID_AA64ISAR1_API_MASK) == 0b0110) { 374025b1b81SJohn Powell return true; 375025b1b81SJohn Powell } 376025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_APA_SHIFT, ID_AA64ISAR1_APA_MASK) == 0b0110) { 377025b1b81SJohn Powell return true; 378025b1b81SJohn Powell } 379025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar2_el1(), ID_AA64ISAR2_APA3_SHIFT, ID_AA64ISAR2_APA3_MASK) == 0b0110) { 380025b1b81SJohn Powell return true; 381025b1b81SJohn Powell } 382025b1b81SJohn Powell return false; 383025b1b81SJohn Powell } 384025b1b81SJohn Powell CREATE_FEATURE_SUPPORTED(feat_pauth_lr, is_feat_pauth_lr_present, ENABLE_FEAT_PAUTH_LR) 385025b1b81SJohn Powell 386aaaf2cc3SSona Mathew /* FEAT_TTST: Small translation tables */ 387aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttst, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_ST_SHIFT, 388f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_ST_MASK, 1U, 389f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 390cedfa04bSSathees Balya 391aaaf2cc3SSona Mathew /* FEAT_BTI: Branch target identification */ 39210ecd580SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_bti, id_aa64pfr1_el1, ID_AA64PFR1_EL1_BT_SHIFT, 393d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_BT_MASK, BTI_IMPLEMENTED, ENABLE_BTI, 394d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 3959fc59639SAlexei Fedorov 396aaaf2cc3SSona Mathew /* FEAT_MTE2: Memory tagging extension */ 397aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_mte2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_MTE_SHIFT, 398d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_MTE_MASK, MTE_IMPLEMENTED_ELX, ENABLE_FEAT_MTE2, 399d508bab3SArvind Ram Prakash FEAT_ENABLE_SECURE | FEAT_ENABLE_NS) 40030f05b4fSManish Pandey 401aaaf2cc3SSona Mathew /* FEAT_SSBS: Speculative store bypass safe */ 402aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ssbs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SSBS_SHIFT, 403f396aec8SArvind Ram Prakash ID_AA64PFR1_EL1_SSBS_MASK, 1U, 404f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 40530f05b4fSManish Pandey 406aaaf2cc3SSona Mathew /* FEAT_NMI: Non-maskable interrupts */ 407aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_nmi, id_aa64pfr1_el1, ID_AA64PFR1_EL1_NMI_SHIFT, 408f396aec8SArvind Ram Prakash ID_AA64PFR1_EL1_NMI_MASK, NMI_IMPLEMENTED, 409f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 41030f05b4fSManish Pandey 411aaaf2cc3SSona Mathew /* FEAT_EBEP */ 412f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_ebep, id_aa64dfr1_el1, ID_AA64DFR1_EBEP_SHIFT, 413f396aec8SArvind Ram Prakash ID_AA64DFR1_EBEP_MASK, 1U, ENABLE_FEAT_EBEP, 414f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 41530f05b4fSManish Pandey 416aaaf2cc3SSona Mathew /* FEAT_SEBEP */ 417f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_PRESENT(feat_sebep, id_aa64dfr0_el1, ID_AA64DFR0_SEBEP_SHIFT, 418f396aec8SArvind Ram Prakash ID_AA64DFR0_SEBEP_MASK, SEBEP_IMPLEMENTED, 419f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 42030f05b4fSManish Pandey 421aaaf2cc3SSona Mathew /* FEAT_SEL2: Secure EL2 */ 422a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sel2, id_aa64pfr0_el1, ID_AA64PFR0_SEL2_SHIFT, 423d508bab3SArvind Ram Prakash ID_AA64PFR0_SEL2_MASK, 1U, ENABLE_FEAT_SEL2, 424d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 425aaaf2cc3SSona Mathew 426aaaf2cc3SSona Mathew /* FEAT_TWED: Delayed trapping of WFE */ 427a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_twed, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_TWED_SHIFT, 428d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_TWED_MASK, 1U, ENABLE_FEAT_TWED, 429d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 430aaaf2cc3SSona Mathew 431aaaf2cc3SSona Mathew /* FEAT_FGT: Fine-grained traps */ 432a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_fgt, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT, 433d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_FGT_MASK, 1U, ENABLE_FEAT_FGT, 434d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 435aaaf2cc3SSona Mathew 43633e6aaacSArvind Ram Prakash /* FEAT_FGT2: Fine-grained traps extended */ 43733e6aaacSArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgt2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT, 438d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_FGT_MASK, FGT2_IMPLEMENTED, ENABLE_FEAT_FGT2, 439d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 44033e6aaacSArvind Ram Prakash 4414274b526SArvind Ram Prakash /* FEAT_FGWTE3: Fine-grained write traps EL3 */ 4424274b526SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgwte3, id_aa64mmfr4_el1, ID_AA64MMFR4_EL1_FGWTE3_SHIFT, 4434274b526SArvind Ram Prakash ID_AA64MMFR4_EL1_FGWTE3_MASK, FGWTE3_IMPLEMENTED, 444d508bab3SArvind Ram Prakash ENABLE_FEAT_FGWTE3, FEAT_ENABLE_ALL_WORLDS) 4454274b526SArvind Ram Prakash 446aaaf2cc3SSona Mathew /* FEAT_ECV: Enhanced Counter Virtualization */ 447a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_ecv, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT, 448d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_ECV_MASK, 1U, ENABLE_FEAT_ECV, 449d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 450aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ecv_v2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT, 451d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_ECV_MASK, ID_AA64MMFR0_EL1_ECV_SELF_SYNCH, 452d508bab3SArvind Ram Prakash ENABLE_FEAT_ECV, FEAT_ENABLE_ALL_WORLDS) 453623f6140SAndre Przywara 454aaaf2cc3SSona Mathew /* FEAT_RNG: Random number generator */ 455a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_rng, id_aa64isar0_el1, ID_AA64ISAR0_RNDR_SHIFT, 456d508bab3SArvind Ram Prakash ID_AA64ISAR0_RNDR_MASK, 1U, ENABLE_FEAT_RNG, 457d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 458623f6140SAndre Przywara 459aaaf2cc3SSona Mathew /* FEAT_TCR2: Support TCR2_ELx regs */ 460aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_tcr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_TCRX_SHIFT, 461d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_TCRX_MASK, 1U, ENABLE_FEAT_TCR2, 462d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 463aaaf2cc3SSona Mathew 464aaaf2cc3SSona Mathew /* FEAT_S2POE */ 465a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2POE_SHIFT, 466d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S2POE_MASK, 1U, ENABLE_FEAT_S2POE, 467d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 468aaaf2cc3SSona Mathew 469aaaf2cc3SSona Mathew /* FEAT_S1POE */ 470a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1POE_SHIFT, 471d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S1POE_MASK, 1U, ENABLE_FEAT_S1POE, 472d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 473aaaf2cc3SSona Mathew 4740dfa07b6SOlivier Deprez __attribute__((always_inline)) 475062b6c6bSMark Brown static inline bool is_feat_sxpoe_supported(void) 476062b6c6bSMark Brown { 477062b6c6bSMark Brown return is_feat_s1poe_supported() || is_feat_s2poe_supported(); 478062b6c6bSMark Brown } 479062b6c6bSMark Brown 480aaaf2cc3SSona Mathew /* FEAT_S2PIE */ 481a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2PIE_SHIFT, 482d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S2PIE_MASK, 1U, ENABLE_FEAT_S2PIE, 483d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 484aaaf2cc3SSona Mathew 485aaaf2cc3SSona Mathew /* FEAT_S1PIE */ 486a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1PIE_SHIFT, 487d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S1PIE_MASK, 1U, ENABLE_FEAT_S1PIE, 488d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 489aaaf2cc3SSona Mathew 4906d0433f0SJayanth Dodderi Chidanand /* FEAT_THE: Translation Hardening Extension */ 4916d0433f0SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_the, id_aa64pfr1_el1, ID_AA64PFR1_EL1_THE_SHIFT, 492d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_THE_MASK, THE_IMPLEMENTED, ENABLE_FEAT_THE, 493d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 4946d0433f0SJayanth Dodderi Chidanand 4954ec4e545SJayanth Dodderi Chidanand /* FEAT_SCTLR2 */ 4964ec4e545SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_sctlr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_SCTLR2_SHIFT, 4974ec4e545SJayanth Dodderi Chidanand ID_AA64MMFR3_EL1_SCTLR2_MASK, SCTLR2_IMPLEMENTED, 498d508bab3SArvind Ram Prakash ENABLE_FEAT_SCTLR2, 499d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 5004ec4e545SJayanth Dodderi Chidanand 50130655136SGovindraj Raja /* FEAT_D128 */ 50230655136SGovindraj Raja CREATE_FEATURE_FUNCS(feat_d128, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_D128_SHIFT, 50330655136SGovindraj Raja ID_AA64MMFR3_EL1_D128_MASK, D128_IMPLEMENTED, 504d508bab3SArvind Ram Prakash ENABLE_FEAT_D128, FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 50530655136SGovindraj Raja 50609a4bcb8SGirish Pathak /* FEAT_RME_GPC2 */ 507f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_rme_gpc2, id_aa64pfr0_el1, 50809a4bcb8SGirish Pathak ID_AA64PFR0_FEAT_RME_SHIFT, ID_AA64PFR0_FEAT_RME_MASK, 50909a4bcb8SGirish Pathak RME_GPC2_IMPLEMENTED) 51009a4bcb8SGirish Pathak 5115e827bf0STimothy Hayes /* FEAT_RME_GDI */ 5125e827bf0STimothy Hayes CREATE_FEATURE_FUNCS(feat_rme_gdi, id_aa64mmfr4_el1, 5135e827bf0STimothy Hayes ID_AA64MMFR4_EL1_RME_GDI_SHIFT, 5145e827bf0STimothy Hayes ID_AA64MMFR4_EL1_RME_GDI_MASK, RME_GDI_IMPLEMENTED, 515f396aec8SArvind Ram Prakash ENABLE_FEAT_RME_GDI, FEAT_ENABLE_ALL_WORLDS) 5165e827bf0STimothy Hayes 517a57e18e4SArvind Ram Prakash /* FEAT_FPMR */ 518a57e18e4SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fpmr, id_aa64pfr2_el1, ID_AA64PFR2_EL1_FPMR_SHIFT, 519a57e18e4SArvind Ram Prakash ID_AA64PFR2_EL1_FPMR_MASK, FPMR_IMPLEMENTED, 520d508bab3SArvind Ram Prakash ENABLE_FEAT_FPMR, FEAT_ENABLE_NS) 5216b8df7b9SArvind Ram Prakash /* FEAT_MOPS */ 5226b8df7b9SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_mops, id_aa64isar2_el1, ID_AA64ISAR2_EL1_MOPS_SHIFT, 5236b8df7b9SArvind Ram Prakash ID_AA64ISAR2_EL1_MOPS_MASK, MOPS_IMPLEMENTED, 524d508bab3SArvind Ram Prakash ENABLE_FEAT_MOPS, FEAT_ENABLE_ALL_WORLDS) 525a57e18e4SArvind Ram Prakash 5260dfa07b6SOlivier Deprez __attribute__((always_inline)) 527062b6c6bSMark Brown static inline bool is_feat_sxpie_supported(void) 528062b6c6bSMark Brown { 529062b6c6bSMark Brown return is_feat_s1pie_supported() || is_feat_s2pie_supported(); 530062b6c6bSMark Brown } 531062b6c6bSMark Brown 532a8d5d3d5SAndre Przywara /* FEAT_GCS: Guarded Control Stack */ 533a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_gcs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_GCS_SHIFT, 534d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_GCS_MASK, 1U, ENABLE_FEAT_GCS, 535d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 536688ab57bSMark Brown 537a8d5d3d5SAndre Przywara /* FEAT_AMU: Activity Monitors Extension */ 538a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_amu, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT, 539d508bab3SArvind Ram Prakash ID_AA64PFR0_AMU_MASK, 1U, ENABLE_FEAT_AMU, 540d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 541aaaf2cc3SSona Mathew 54283ec7e45SBoyan Karatotev /* Auxiliary counters for FEAT_AMU */ 543f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_amu_aux, amcfgr_el0, 544f396aec8SArvind Ram Prakash AMCFGR_EL0_NCG_SHIFT, AMCFGR_EL0_NCG_MASK, 1U) 545f396aec8SArvind Ram Prakash 546f396aec8SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_amu_aux, is_feat_amu_aux_present, 547f396aec8SArvind Ram Prakash ENABLE_AMU_AUXILIARY_COUNTERS) 54883ec7e45SBoyan Karatotev 549aaaf2cc3SSona Mathew /* FEAT_AMUV1P1: AMU Extension v1.1 */ 550aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_amuv1p1, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT, 551d508bab3SArvind Ram Prakash ID_AA64PFR0_AMU_MASK, ID_AA64PFR0_AMU_V1P1, ENABLE_FEAT_AMUv1p1, 552d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 553873d4241Sjohpow01 554dbcc44a1SAlexei Fedorov /* 555dbcc44a1SAlexei Fedorov * Return MPAM version: 556dbcc44a1SAlexei Fedorov * 557dbcc44a1SAlexei Fedorov * 0x00: None Armv8.0 or later 558dbcc44a1SAlexei Fedorov * 0x01: v0.1 Armv8.4 or later 559dbcc44a1SAlexei Fedorov * 0x10: v1.0 Armv8.2 or later 560dbcc44a1SAlexei Fedorov * 0x11: v1.1 Armv8.4 or later 561dbcc44a1SAlexei Fedorov * 562dbcc44a1SAlexei Fedorov */ 5630dfa07b6SOlivier Deprez __attribute__((always_inline)) 564aaaf2cc3SSona Mathew static inline bool is_feat_mpam_present(void) 565dbcc44a1SAlexei Fedorov { 566aaaf2cc3SSona Mathew unsigned int ret = (unsigned int)((((read_id_aa64pfr0_el1() >> 567dbcc44a1SAlexei Fedorov ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) | 568aaaf2cc3SSona Mathew ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_MPAM_FRAC_SHIFT) 569aaaf2cc3SSona Mathew & ID_AA64PFR1_MPAM_FRAC_MASK)); 570aaaf2cc3SSona Mathew return ret; 571dbcc44a1SAlexei Fedorov } 572dbcc44a1SAlexei Fedorov 573aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mpam, is_feat_mpam_present, ENABLE_FEAT_MPAM) 5749448f2b8SAndre Przywara 575c42aefd3SArvind Ram Prakash 576f396aec8SArvind Ram Prakash #if (ENABLE_FEAT_IDTE3 && IMAGE_BL31) 577f396aec8SArvind Ram Prakash __attribute__((always_inline)) 578f396aec8SArvind Ram Prakash static inline void update_feat_mpam_idreg_field(size_t security_state) 579f396aec8SArvind Ram Prakash { 580f396aec8SArvind Ram Prakash if (SHOULD_ID_FIELD_DISABLE(ENABLE_FEAT_MPAM, 581f396aec8SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM, security_state)) { 582f396aec8SArvind Ram Prakash per_world_context_t *per_world_ctx = 583f396aec8SArvind Ram Prakash &per_world_context[security_state]; 584f396aec8SArvind Ram Prakash perworld_idregs_t *perworld_idregs = 585f396aec8SArvind Ram Prakash &(per_world_ctx->idregs); 586f396aec8SArvind Ram Prakash 587f396aec8SArvind Ram Prakash perworld_idregs->id_aa64pfr0_el1 &= 588f396aec8SArvind Ram Prakash ~((u_register_t)ID_AA64PFR0_MPAM_MASK 589f396aec8SArvind Ram Prakash << ID_AA64PFR0_MPAM_SHIFT); 590f396aec8SArvind Ram Prakash 591f396aec8SArvind Ram Prakash perworld_idregs->id_aa64pfr1_el1 &= 592f396aec8SArvind Ram Prakash ~((u_register_t)ID_AA64PFR1_MPAM_FRAC_MASK 593f396aec8SArvind Ram Prakash << ID_AA64PFR1_MPAM_FRAC_SHIFT); 594f396aec8SArvind Ram Prakash } 595f396aec8SArvind Ram Prakash } 596f396aec8SArvind Ram Prakash #endif 597c42aefd3SArvind Ram Prakash 598c42aefd3SArvind Ram Prakash /* FEAT_MPAM_PE_BW_CTRL: MPAM PE-side bandwidth controls */ 599c42aefd3SArvind Ram Prakash __attribute__((always_inline)) 600c42aefd3SArvind Ram Prakash static inline bool is_feat_mpam_pe_bw_ctrl_present(void) 601c42aefd3SArvind Ram Prakash { 602c42aefd3SArvind Ram Prakash if (is_feat_mpam_present()) { 603c42aefd3SArvind Ram Prakash return ((unsigned long long)(read_mpamidr_el1() & 604c42aefd3SArvind Ram Prakash MPAMIDR_HAS_BW_CTRL_BIT) != 0U); 605c42aefd3SArvind Ram Prakash } 606c42aefd3SArvind Ram Prakash return false; 607c42aefd3SArvind Ram Prakash } 608c42aefd3SArvind Ram Prakash 609c42aefd3SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_mpam_pe_bw_ctrl, is_feat_mpam_pe_bw_ctrl_present, 610c42aefd3SArvind Ram Prakash ENABLE_FEAT_MPAM_PE_BW_CTRL) 611c42aefd3SArvind Ram Prakash 61283271d5aSArvind Ram Prakash /* 61383271d5aSArvind Ram Prakash * FEAT_DebugV8P9: Debug extension. This function checks the field 3:0 of 61483271d5aSArvind Ram Prakash * ID_AA64DFR0 Aarch64 Debug Feature Register 0 for the version of 61583271d5aSArvind Ram Prakash * Feat_Debug supported. The value of the field determines feature presence 61683271d5aSArvind Ram Prakash * 61783271d5aSArvind Ram Prakash * 0b0110 - Arm v8.0 debug 61883271d5aSArvind Ram Prakash * 0b0111 - Arm v8.0 debug architecture with Virtualization host extensions 61983271d5aSArvind Ram Prakash * 0x1000 - FEAT_Debugv8p2 is supported 62083271d5aSArvind Ram Prakash * 0x1001 - FEAT_Debugv8p4 is supported 62183271d5aSArvind Ram Prakash * 0x1010 - FEAT_Debugv8p8 is supported 62283271d5aSArvind Ram Prakash * 0x1011 - FEAT_Debugv8p9 is supported 62383271d5aSArvind Ram Prakash * 62483271d5aSArvind Ram Prakash */ 625f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_debugv8p9, id_aa64dfr0_el1, 626f396aec8SArvind Ram Prakash ID_AA64DFR0_DEBUGVER_SHIFT, ID_AA64DFR0_DEBUGVER_MASK, 627f396aec8SArvind Ram Prakash DEBUGVER_V8P9_IMPLEMENTED, ENABLE_FEAT_DEBUGV8P9, 628f396aec8SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 62983271d5aSArvind Ram Prakash 630a8d5d3d5SAndre Przywara /* FEAT_HCX: Extended Hypervisor Configuration Register */ 631a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_hcx, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_HCX_SHIFT, 632d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_HCX_MASK, 1U, ENABLE_FEAT_HCX, 633d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 634cb4ec47bSjohpow01 635aaaf2cc3SSona Mathew /* FEAT_RNG_TRAP: Trapping support */ 63679c0c7faSBoyan Karatotev CREATE_FEATURE_FUNCS(feat_rng_trap, id_aa64pfr1_el1, ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT, 637d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_RNDR_TRAP_MASK, RNG_TRAP_IMPLEMENTED, ENABLE_FEAT_RNG_TRAP, 638d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 639ff86e0b4SJuan Pablo Conde 640aaaf2cc3SSona Mathew /* Return the RME version, zero if not supported. */ 641f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_rme, id_aa64pfr0_el1, 642f396aec8SArvind Ram Prakash ID_AA64PFR0_FEAT_RME_SHIFT, ID_AA64PFR0_FEAT_RME_MASK, 1U) 643f396aec8SArvind Ram Prakash 644f396aec8SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_rme, is_feat_rme_present, ENABLE_RME) 64581c272b3SZelalem Aweke 646aaaf2cc3SSona Mathew /* FEAT_SB: Speculation barrier instruction */ 647aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sb, id_aa64isar1_el1, ID_AA64ISAR1_SB_SHIFT, 648f396aec8SArvind Ram Prakash ID_AA64ISAR1_SB_MASK, 1U, 649f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6506a0da736SJayanth Dodderi Chidanand 6517e84f3cfSTushar Khandelwal /* FEAT_MEC: Memory Encryption Contexts */ 6527e84f3cfSTushar Khandelwal CREATE_FEATURE_FUNCS(feat_mec, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_MEC_SHIFT, 653d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_MEC_MASK, 1U, ENABLE_FEAT_MEC, 654d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6557e84f3cfSTushar Khandelwal 65630019d86SSona Mathew /* 65730019d86SSona Mathew * FEAT_CSV2: Cache Speculation Variant 2. This checks bit fields[56-59] 65830019d86SSona Mathew * of id_aa64pfr0_el1 register and can be used to check for below features: 65930019d86SSona Mathew * FEAT_CSV2_2: Cache Speculation Variant CSV2_2. 66030019d86SSona Mathew * FEAT_CSV2_3: Cache Speculation Variant CSV2_3. 66130019d86SSona Mathew * 0b0000 - Feature FEAT_CSV2 is not implemented. 66230019d86SSona Mathew * 0b0001 - Feature FEAT_CSV2 is implemented, but FEAT_CSV2_2 and FEAT_CSV2_3 66330019d86SSona Mathew * are not implemented. 66430019d86SSona Mathew * 0b0010 - Feature FEAT_CSV2_2 is implemented but FEAT_CSV2_3 is not 66530019d86SSona Mathew * implemented. 66630019d86SSona Mathew * 0b0011 - Feature FEAT_CSV2_3 is implemented. 66730019d86SSona Mathew */ 66830019d86SSona Mathew 669aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_2, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT, 670d508bab3SArvind Ram Prakash ID_AA64PFR0_CSV2_MASK, CSV2_2_IMPLEMENTED, ENABLE_FEAT_CSV2_2, 671d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 672aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_3, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT, 673d508bab3SArvind Ram Prakash ID_AA64PFR0_CSV2_MASK, CSV2_3_IMPLEMENTED, ENABLE_FEAT_CSV2_3, 674d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6757db710f0SAndre Przywara 676a8d5d3d5SAndre Przywara /* FEAT_SPE: Statistical Profiling Extension */ 677f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_spe, id_aa64dfr0_el1, ID_AA64DFR0_PMS_SHIFT, 678d508bab3SArvind Ram Prakash ID_AA64DFR0_PMS_MASK, 1U, ENABLE_SPE_FOR_NS, 679d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6807db710f0SAndre Przywara 681a8d5d3d5SAndre Przywara /* FEAT_SVE: Scalable Vector Extension */ 682a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sve, id_aa64pfr0_el1, ID_AA64PFR0_SVE_SHIFT, 683d508bab3SArvind Ram Prakash ID_AA64PFR0_SVE_MASK, 1U, ENABLE_SVE_FOR_NS, 684d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6857db710f0SAndre Przywara 686a8d5d3d5SAndre Przywara /* FEAT_RAS: Reliability, Accessibility, Serviceability */ 687aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ras, id_aa64pfr0_el1, ID_AA64PFR0_RAS_SHIFT, 688d508bab3SArvind Ram Prakash ID_AA64PFR0_RAS_MASK, 1U, ENABLE_FEAT_RAS, 689d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6906a0da736SJayanth Dodderi Chidanand 691a8d5d3d5SAndre Przywara /* FEAT_DIT: Data Independent Timing instructions */ 692aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_dit, id_aa64pfr0_el1, ID_AA64PFR0_DIT_SHIFT, 693d508bab3SArvind Ram Prakash ID_AA64PFR0_DIT_MASK, 1U, ENABLE_FEAT_DIT, 694d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6956437a09aSAndre Przywara 696aaaf2cc3SSona Mathew /* FEAT_SYS_REG_TRACE */ 697f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_sys_reg_trace, id_aa64dfr0_el1, 698f396aec8SArvind Ram Prakash ID_AA64DFR0_TRACEVER_SHIFT, ID_AA64DFR0_TRACEVER_MASK, 699f396aec8SArvind Ram Prakash 1U, ENABLE_SYS_REG_TRACE_FOR_NS, 700d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 7016437a09aSAndre Przywara 702a8d5d3d5SAndre Przywara /* FEAT_TRF: TraceFilter */ 703f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_trf, id_aa64dfr0_el1, ID_AA64DFR0_TRACEFILT_SHIFT, 704d508bab3SArvind Ram Prakash ID_AA64DFR0_TRACEFILT_MASK, 1U, ENABLE_TRF_FOR_NS, 705d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 7066437a09aSAndre Przywara 707a8d5d3d5SAndre Przywara /* FEAT_NV2: Enhanced Nested Virtualization */ 708aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_nv2, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_NV_SHIFT, 709d508bab3SArvind Ram Prakash ID_AA64MMFR2_EL1_NV_MASK, NV2_IMPLEMENTED, CTX_INCLUDE_NEVE_REGS, 710d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 7116a0da736SJayanth Dodderi Chidanand 712a8d5d3d5SAndre Przywara /* FEAT_BRBE: Branch Record Buffer Extension */ 713f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_brbe, id_aa64dfr0_el1, ID_AA64DFR0_BRBE_SHIFT, 714d508bab3SArvind Ram Prakash ID_AA64DFR0_BRBE_MASK, 1U, ENABLE_BRBE_FOR_NS, 715d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 7162b0bc4e0SJayanth Dodderi Chidanand 717a8d5d3d5SAndre Przywara /* FEAT_TRBE: Trace Buffer Extension */ 718f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_trbe, id_aa64dfr0_el1, ID_AA64DFR0_TRACEBUFFER_SHIFT, 719f396aec8SArvind Ram Prakash ID_AA64DFR0_TRACEBUFFER_MASK, 1U) 720f396aec8SArvind Ram Prakash 721f396aec8SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_trbe, is_feat_trbe_present, ENABLE_TRBE_FOR_NS) 722f396aec8SArvind Ram Prakash 723f396aec8SArvind Ram Prakash CREATE_PERCPU_IDREG_UPDATE(feat_trbe, id_aa64dfr0_el1, ID_AA64DFR0_TRACEBUFFER_SHIFT, 724f396aec8SArvind Ram Prakash ID_AA64DFR0_TRACEBUFFER_MASK, 725f396aec8SArvind Ram Prakash ENABLE_TRBE_FOR_NS && !check_if_trbe_disable_affected_core(), 726f396aec8SArvind Ram Prakash FEAT_ENABLE_NS) 7272b0bc4e0SJayanth Dodderi Chidanand 728aaaf2cc3SSona Mathew /* FEAT_SME_FA64: Full A64 Instruction support in streaming SVE mode */ 729aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sme_fa64, id_aa64smfr0_el1, ID_AA64SMFR0_EL1_SME_FA64_SHIFT, 730f396aec8SArvind Ram Prakash ID_AA64SMFR0_EL1_SME_FA64_MASK, 1U, 731f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 732aaaf2cc3SSona Mathew 733a8d5d3d5SAndre Przywara /* FEAT_SMEx: Scalar Matrix Extension */ 734a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sme, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT, 735d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_SME_MASK, 1U, ENABLE_SME_FOR_NS, 736d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 737aaaf2cc3SSona Mathew 738aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_sme2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT, 739d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_SME_MASK, SME2_IMPLEMENTED, ENABLE_SME2_FOR_NS, 740d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 74103d3c0d7SJayanth Dodderi Chidanand 742*3a6e53c8SArvind Ram Prakash /* FEAT_LS64_ACCDATA: Support for 64-byte EL0 stores with status */ 74319d52a83SAndre Przywara CREATE_FEATURE_FUNCS(feat_ls64_accdata, id_aa64isar1_el1, ID_AA64ISAR1_LS64_SHIFT, 74419d52a83SAndre Przywara ID_AA64ISAR1_LS64_MASK, LS64_ACCDATA_IMPLEMENTED, 745d508bab3SArvind Ram Prakash ENABLE_FEAT_LS64_ACCDATA, FEAT_ENABLE_ALL_WORLDS) 74619d52a83SAndre Przywara 747*3a6e53c8SArvind Ram Prakash /* FEAT_AIE: Memory Attribute Index Enhancement */ 748cc2523bbSAndre Przywara CREATE_FEATURE_FUNCS(feat_aie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_AIE_SHIFT, 749d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_AIE_MASK, 1U, ENABLE_FEAT_AIE, 750d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 751cc2523bbSAndre Przywara 752*3a6e53c8SArvind Ram Prakash /* FEAT_PFAR: Physical Fault Address Register Extension */ 753b3bcfd12SAndre Przywara CREATE_FEATURE_FUNCS(feat_pfar, id_aa64pfr1_el1, ID_AA64PFR1_EL1_PFAR_SHIFT, 754d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_PFAR_MASK, 1U, ENABLE_FEAT_PFAR, 755d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 756b3bcfd12SAndre Przywara 757f396aec8SArvind Ram Prakash /* FEAT_IDTE3: Trapping lower EL ID Register access to EL3 */ 758f396aec8SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_idte3, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_IDS_SHIFT, 759f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_IDS_MASK, 2U, ENABLE_FEAT_IDTE3, 760f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 761f396aec8SArvind Ram Prakash 762bff074ddSJavier Almansa Sobrino /******************************************************************************* 763bff074ddSJavier Almansa Sobrino * Function to get hardware granularity support 764bff074ddSJavier Almansa Sobrino ******************************************************************************/ 765bff074ddSJavier Almansa Sobrino 7660dfa07b6SOlivier Deprez __attribute__((always_inline)) 767aaaf2cc3SSona Mathew static inline bool is_feat_tgran4K_present(void) 768bff074ddSJavier Almansa Sobrino { 769aaaf2cc3SSona Mathew unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(), 770aaaf2cc3SSona Mathew ID_AA64MMFR0_EL1_TGRAN4_SHIFT, ID_REG_FIELD_MASK); 771aaaf2cc3SSona Mathew return (tgranx < 8U); 772bff074ddSJavier Almansa Sobrino } 773bff074ddSJavier Almansa Sobrino 774aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_tgran16K, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_TGRAN16_SHIFT, 775f396aec8SArvind Ram Prakash ID_AA64MMFR0_EL1_TGRAN16_MASK, TGRAN16_IMPLEMENTED, 776f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 777aaaf2cc3SSona Mathew 7780dfa07b6SOlivier Deprez __attribute__((always_inline)) 779aaaf2cc3SSona Mathew static inline bool is_feat_tgran64K_present(void) 780bff074ddSJavier Almansa Sobrino { 781aaaf2cc3SSona Mathew unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(), 782aaaf2cc3SSona Mathew ID_AA64MMFR0_EL1_TGRAN64_SHIFT, ID_REG_FIELD_MASK); 783aaaf2cc3SSona Mathew return (tgranx < 8U); 784bff074ddSJavier Almansa Sobrino } 785bff074ddSJavier Almansa Sobrino 786aaaf2cc3SSona Mathew /* FEAT_PMUV3 */ 787f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_pmuv3, id_aa64dfr0_el1, ID_AA64DFR0_PMUVER_SHIFT, 788aaaf2cc3SSona Mathew ID_AA64DFR0_PMUVER_MASK, 1U) 789aaaf2cc3SSona Mathew 790aaaf2cc3SSona Mathew /* FEAT_MTPMU */ 7910dfa07b6SOlivier Deprez __attribute__((always_inline)) 792aaaf2cc3SSona Mathew static inline bool is_feat_mtpmu_present(void) 793bff074ddSJavier Almansa Sobrino { 794aaaf2cc3SSona Mathew unsigned int mtpmu = ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_MTPMU_SHIFT, 795aaaf2cc3SSona Mathew ID_AA64DFR0_MTPMU_MASK); 7969e51f15eSSona Mathew return (mtpmu != 0U) && (mtpmu != MTPMU_NOT_IMPLEMENTED); 79783a4dae1SBoyan Karatotev } 79883a4dae1SBoyan Karatotev 799aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mtpmu, is_feat_mtpmu_present, DISABLE_MTPMU) 800aaaf2cc3SSona Mathew 801f396aec8SArvind Ram Prakash CREATE_PERCPU_IDREG_UPDATE(feat_mtpmu, id_aa64dfr0_el1, ID_AA64DFR0_MTPMU_SHIFT, 802f396aec8SArvind Ram Prakash ID_AA64DFR0_MTPMU_MASK, DISABLE_MTPMU, 803f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 804f396aec8SArvind Ram Prakash 8058cef63d6SBoyan Karatotev /************************************************************************* 8068cef63d6SBoyan Karatotev * Function to identify the presence of FEAT_GCIE (GICv5 CPU interface 8078cef63d6SBoyan Karatotev * extension). 8088cef63d6SBoyan Karatotev ************************************************************************/ 8098cef63d6SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_gcie, id_aa64pfr2_el1, ID_AA64PFR2_EL1_GCIE_SHIFT, 810d508bab3SArvind Ram Prakash ID_AA64PFR2_EL1_GCIE_MASK, 1U, ENABLE_FEAT_GCIE, 811d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 8128cef63d6SBoyan Karatotev 813a1032bebSJohn Powell CREATE_FEATURE_FUNCS(feat_cpa2, id_aa64isar3_el1, ID_AA64ISAR3_EL1_CPA_SHIFT, 814a1032bebSJohn Powell ID_AA64ISAR3_EL1_CPA_MASK, CPA2_IMPLEMENTED, 815d508bab3SArvind Ram Prakash ENABLE_FEAT_CPA2, FEAT_ENABLE_ALL_WORLDS) 816a1032bebSJohn Powell 8172559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */ 818