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 * +----------------------------+ 2153a6e53c8SArvind 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 * +----------------------------+ 273*4286d16fSArvind Ram Prakash * | FEAT_UINJ | 274*4286d16fSArvind Ram Prakash * +----------------------------+ 275aaaf2cc3SSona Mathew */ 276fd1dd4cbSAndre Przywara 2770dfa07b6SOlivier Deprez __attribute__((always_inline)) 27829a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void) 27929a24134SAntonio Nino Diaz { 28029a24134SAntonio Nino Diaz /* The Generic Timer is always present in an ARMv8-A implementation */ 28129a24134SAntonio Nino Diaz return true; 28229a24134SAntonio Nino Diaz } 28329a24134SAntonio Nino Diaz 284aaaf2cc3SSona Mathew /* FEAT_PAN: Privileged access never */ 285a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_pan, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_PAN_SHIFT, 286d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_PAN_MASK, 1U, ENABLE_FEAT_PAN, 287d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 28830f05b4fSManish Pandey 289aaaf2cc3SSona Mathew /* FEAT_VHE: Virtualization Host Extensions */ 290a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_vhe, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_VHE_SHIFT, 291d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_VHE_MASK, 1U, ENABLE_FEAT_VHE, 292d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 29337596fcbSDaniel Boulby 294aaaf2cc3SSona Mathew /* FEAT_TTCNP: Translation table common not private */ 295aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttcnp, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_CNP_SHIFT, 296f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_CNP_MASK, 1U, 297f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 2982559b2c8SAntonio Nino Diaz 299aaaf2cc3SSona Mathew /* FEAT_UAO: User access override */ 300aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_uao, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_UAO_SHIFT, 301f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_UAO_MASK, 1U, 302f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 3039ff5f754SJuan Pablo Conde 3049ff5f754SJuan Pablo Conde /* If any of the fields is not zero, QARMA3 algorithm is present */ 305aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_pacqarma3, id_aa64isar2_el1, 0, 306aaaf2cc3SSona Mathew ((ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) | 307f396aec8SArvind Ram Prakash (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT)), 1U, 308f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 3099ff5f754SJuan Pablo Conde 310b0b7609eSBoyan Karatotev /* FEAT_PAUTH: Pointer Authentication */ 3110dfa07b6SOlivier Deprez __attribute__((always_inline)) 312b0b7609eSBoyan Karatotev static inline bool is_feat_pauth_present(void) 313b86048c4SAntonio Nino Diaz { 3149ff5f754SJuan Pablo Conde uint64_t mask_id_aa64isar1 = 3159ff5f754SJuan Pablo Conde (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) | 316b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) | 317b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) | 318b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT); 319b86048c4SAntonio Nino Diaz 3209ff5f754SJuan Pablo Conde /* 3219ff5f754SJuan Pablo Conde * If any of the fields is not zero or QARMA3 is present, 3229ff5f754SJuan Pablo Conde * PAuth is present 3239ff5f754SJuan Pablo Conde */ 3249ff5f754SJuan Pablo Conde return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U || 3259ff5f754SJuan Pablo Conde is_feat_pacqarma3_present()); 326b86048c4SAntonio Nino Diaz } 327b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(feat_pauth, is_feat_pauth_present, ENABLE_PAUTH) 328b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(ctx_pauth, is_feat_pauth_present, CTX_INCLUDE_PAUTH_REGS) 329b86048c4SAntonio Nino Diaz 330f396aec8SArvind Ram Prakash #if (ENABLE_FEAT_IDTE3 && IMAGE_BL31) 331f396aec8SArvind Ram Prakash __attribute__((always_inline)) 332f396aec8SArvind Ram Prakash static inline void update_feat_pauth_idreg_field(size_t security_state) 333f396aec8SArvind Ram Prakash { 334f396aec8SArvind Ram Prakash uint64_t mask_id_aa64isar1 = 335f396aec8SArvind Ram Prakash (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) | 336f396aec8SArvind Ram Prakash (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) | 337f396aec8SArvind Ram Prakash (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) | 338f396aec8SArvind Ram Prakash (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT); 339f396aec8SArvind Ram Prakash 340f396aec8SArvind Ram Prakash uint64_t mask_id_aa64isar2 = 341f396aec8SArvind Ram Prakash (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_MASK) | 342f396aec8SArvind Ram Prakash (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_MASK); 343f396aec8SArvind Ram Prakash 344f396aec8SArvind Ram Prakash per_world_context_t *per_world_ctx = &per_world_context[security_state]; 345f396aec8SArvind Ram Prakash perworld_idregs_t *perworld_idregs = 346f396aec8SArvind Ram Prakash &(per_world_ctx->idregs); 347f396aec8SArvind Ram Prakash 348f396aec8SArvind Ram Prakash if ((SHOULD_ID_FIELD_DISABLE(ENABLE_PAUTH, FEAT_ENABLE_NS, 349f396aec8SArvind Ram Prakash security_state)) && 350f396aec8SArvind Ram Prakash (SHOULD_ID_FIELD_DISABLE(CTX_INCLUDE_PAUTH_REGS, 351f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS, 352f396aec8SArvind Ram Prakash security_state))) { 353f396aec8SArvind Ram Prakash perworld_idregs->id_aa64isar1_el1 &= ~(mask_id_aa64isar1); 354f396aec8SArvind Ram Prakash perworld_idregs->id_aa64isar2_el1 &= ~(mask_id_aa64isar2); 355f396aec8SArvind Ram Prakash } 356f396aec8SArvind Ram Prakash } 357f396aec8SArvind Ram Prakash #endif 358f396aec8SArvind Ram Prakash 359025b1b81SJohn Powell /* 360025b1b81SJohn Powell * FEAT_PAUTH_LR 361025b1b81SJohn Powell * This feature has a non-standard discovery method so define this function 362025b1b81SJohn Powell * manually then call use the CREATE_FEATURE_SUPPORTED macro with it. This 363025b1b81SJohn Powell * feature is enabled with ENABLE_PAUTH when present. 364025b1b81SJohn Powell */ 365025b1b81SJohn Powell __attribute__((always_inline)) 366025b1b81SJohn Powell static inline bool is_feat_pauth_lr_present(void) 367025b1b81SJohn Powell { 368025b1b81SJohn Powell /* 369025b1b81SJohn Powell * FEAT_PAUTH_LR support is indicated by up to 3 fields, if one or more 370025b1b81SJohn Powell * of these is 0b0110 then the feature is present. 371025b1b81SJohn Powell * 1) id_aa64isr1_el1.api 372025b1b81SJohn Powell * 2) id_aa64isr1_el1.apa 373025b1b81SJohn Powell * 3) id_aa64isr2_el1.apa3 374025b1b81SJohn Powell */ 375025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_API_SHIFT, ID_AA64ISAR1_API_MASK) == 0b0110) { 376025b1b81SJohn Powell return true; 377025b1b81SJohn Powell } 378025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_APA_SHIFT, ID_AA64ISAR1_APA_MASK) == 0b0110) { 379025b1b81SJohn Powell return true; 380025b1b81SJohn Powell } 381025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar2_el1(), ID_AA64ISAR2_APA3_SHIFT, ID_AA64ISAR2_APA3_MASK) == 0b0110) { 382025b1b81SJohn Powell return true; 383025b1b81SJohn Powell } 384025b1b81SJohn Powell return false; 385025b1b81SJohn Powell } 386025b1b81SJohn Powell CREATE_FEATURE_SUPPORTED(feat_pauth_lr, is_feat_pauth_lr_present, ENABLE_FEAT_PAUTH_LR) 387025b1b81SJohn Powell 388aaaf2cc3SSona Mathew /* FEAT_TTST: Small translation tables */ 389aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttst, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_ST_SHIFT, 390f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_ST_MASK, 1U, 391f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 392cedfa04bSSathees Balya 393aaaf2cc3SSona Mathew /* FEAT_BTI: Branch target identification */ 39410ecd580SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_bti, id_aa64pfr1_el1, ID_AA64PFR1_EL1_BT_SHIFT, 395d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_BT_MASK, BTI_IMPLEMENTED, ENABLE_BTI, 396d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 3979fc59639SAlexei Fedorov 398aaaf2cc3SSona Mathew /* FEAT_MTE2: Memory tagging extension */ 399aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_mte2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_MTE_SHIFT, 400d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_MTE_MASK, MTE_IMPLEMENTED_ELX, ENABLE_FEAT_MTE2, 401d508bab3SArvind Ram Prakash FEAT_ENABLE_SECURE | FEAT_ENABLE_NS) 40230f05b4fSManish Pandey 403aaaf2cc3SSona Mathew /* FEAT_SSBS: Speculative store bypass safe */ 404aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ssbs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SSBS_SHIFT, 405f396aec8SArvind Ram Prakash ID_AA64PFR1_EL1_SSBS_MASK, 1U, 406f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 40730f05b4fSManish Pandey 408aaaf2cc3SSona Mathew /* FEAT_NMI: Non-maskable interrupts */ 409aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_nmi, id_aa64pfr1_el1, ID_AA64PFR1_EL1_NMI_SHIFT, 410f396aec8SArvind Ram Prakash ID_AA64PFR1_EL1_NMI_MASK, NMI_IMPLEMENTED, 411f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 41230f05b4fSManish Pandey 413aaaf2cc3SSona Mathew /* FEAT_EBEP */ 414f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_ebep, id_aa64dfr1_el1, ID_AA64DFR1_EBEP_SHIFT, 415f396aec8SArvind Ram Prakash ID_AA64DFR1_EBEP_MASK, 1U, ENABLE_FEAT_EBEP, 416f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 41730f05b4fSManish Pandey 418aaaf2cc3SSona Mathew /* FEAT_SEBEP */ 419f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_PRESENT(feat_sebep, id_aa64dfr0_el1, ID_AA64DFR0_SEBEP_SHIFT, 420f396aec8SArvind Ram Prakash ID_AA64DFR0_SEBEP_MASK, SEBEP_IMPLEMENTED, 421f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 42230f05b4fSManish Pandey 423aaaf2cc3SSona Mathew /* FEAT_SEL2: Secure EL2 */ 424a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sel2, id_aa64pfr0_el1, ID_AA64PFR0_SEL2_SHIFT, 425d508bab3SArvind Ram Prakash ID_AA64PFR0_SEL2_MASK, 1U, ENABLE_FEAT_SEL2, 426d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 427aaaf2cc3SSona Mathew 428aaaf2cc3SSona Mathew /* FEAT_TWED: Delayed trapping of WFE */ 429a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_twed, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_TWED_SHIFT, 430d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_TWED_MASK, 1U, ENABLE_FEAT_TWED, 431d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 432aaaf2cc3SSona Mathew 433aaaf2cc3SSona Mathew /* FEAT_FGT: Fine-grained traps */ 434a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_fgt, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT, 435d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_FGT_MASK, 1U, ENABLE_FEAT_FGT, 436d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 437aaaf2cc3SSona Mathew 43833e6aaacSArvind Ram Prakash /* FEAT_FGT2: Fine-grained traps extended */ 43933e6aaacSArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgt2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT, 440d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_FGT_MASK, FGT2_IMPLEMENTED, ENABLE_FEAT_FGT2, 441d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 44233e6aaacSArvind Ram Prakash 4434274b526SArvind Ram Prakash /* FEAT_FGWTE3: Fine-grained write traps EL3 */ 4444274b526SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgwte3, id_aa64mmfr4_el1, ID_AA64MMFR4_EL1_FGWTE3_SHIFT, 4454274b526SArvind Ram Prakash ID_AA64MMFR4_EL1_FGWTE3_MASK, FGWTE3_IMPLEMENTED, 446d508bab3SArvind Ram Prakash ENABLE_FEAT_FGWTE3, FEAT_ENABLE_ALL_WORLDS) 4474274b526SArvind Ram Prakash 448aaaf2cc3SSona Mathew /* FEAT_ECV: Enhanced Counter Virtualization */ 449a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_ecv, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT, 450d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_ECV_MASK, 1U, ENABLE_FEAT_ECV, 451d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 452aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ecv_v2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT, 453d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_ECV_MASK, ID_AA64MMFR0_EL1_ECV_SELF_SYNCH, 454d508bab3SArvind Ram Prakash ENABLE_FEAT_ECV, FEAT_ENABLE_ALL_WORLDS) 455623f6140SAndre Przywara 456aaaf2cc3SSona Mathew /* FEAT_RNG: Random number generator */ 457a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_rng, id_aa64isar0_el1, ID_AA64ISAR0_RNDR_SHIFT, 458d508bab3SArvind Ram Prakash ID_AA64ISAR0_RNDR_MASK, 1U, ENABLE_FEAT_RNG, 459d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 460623f6140SAndre Przywara 461aaaf2cc3SSona Mathew /* FEAT_TCR2: Support TCR2_ELx regs */ 462aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_tcr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_TCRX_SHIFT, 463d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_TCRX_MASK, 1U, ENABLE_FEAT_TCR2, 464d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 465aaaf2cc3SSona Mathew 466aaaf2cc3SSona Mathew /* FEAT_S2POE */ 467a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2POE_SHIFT, 468d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S2POE_MASK, 1U, ENABLE_FEAT_S2POE, 469d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 470aaaf2cc3SSona Mathew 471aaaf2cc3SSona Mathew /* FEAT_S1POE */ 472a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1POE_SHIFT, 473d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S1POE_MASK, 1U, ENABLE_FEAT_S1POE, 474d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 475aaaf2cc3SSona Mathew 4760dfa07b6SOlivier Deprez __attribute__((always_inline)) 477062b6c6bSMark Brown static inline bool is_feat_sxpoe_supported(void) 478062b6c6bSMark Brown { 479062b6c6bSMark Brown return is_feat_s1poe_supported() || is_feat_s2poe_supported(); 480062b6c6bSMark Brown } 481062b6c6bSMark Brown 482aaaf2cc3SSona Mathew /* FEAT_S2PIE */ 483a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2PIE_SHIFT, 484d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S2PIE_MASK, 1U, ENABLE_FEAT_S2PIE, 485d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 486aaaf2cc3SSona Mathew 487aaaf2cc3SSona Mathew /* FEAT_S1PIE */ 488a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1PIE_SHIFT, 489d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S1PIE_MASK, 1U, ENABLE_FEAT_S1PIE, 490d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 491aaaf2cc3SSona Mathew 4926d0433f0SJayanth Dodderi Chidanand /* FEAT_THE: Translation Hardening Extension */ 4936d0433f0SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_the, id_aa64pfr1_el1, ID_AA64PFR1_EL1_THE_SHIFT, 494d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_THE_MASK, THE_IMPLEMENTED, ENABLE_FEAT_THE, 495d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 4966d0433f0SJayanth Dodderi Chidanand 4974ec4e545SJayanth Dodderi Chidanand /* FEAT_SCTLR2 */ 4984ec4e545SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_sctlr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_SCTLR2_SHIFT, 4994ec4e545SJayanth Dodderi Chidanand ID_AA64MMFR3_EL1_SCTLR2_MASK, SCTLR2_IMPLEMENTED, 500d508bab3SArvind Ram Prakash ENABLE_FEAT_SCTLR2, 501d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 5024ec4e545SJayanth Dodderi Chidanand 50330655136SGovindraj Raja /* FEAT_D128 */ 50430655136SGovindraj Raja CREATE_FEATURE_FUNCS(feat_d128, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_D128_SHIFT, 50530655136SGovindraj Raja ID_AA64MMFR3_EL1_D128_MASK, D128_IMPLEMENTED, 506d508bab3SArvind Ram Prakash ENABLE_FEAT_D128, FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 50730655136SGovindraj Raja 50809a4bcb8SGirish Pathak /* FEAT_RME_GPC2 */ 509f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_rme_gpc2, id_aa64pfr0_el1, 51009a4bcb8SGirish Pathak ID_AA64PFR0_FEAT_RME_SHIFT, ID_AA64PFR0_FEAT_RME_MASK, 51109a4bcb8SGirish Pathak RME_GPC2_IMPLEMENTED) 51209a4bcb8SGirish Pathak 5135e827bf0STimothy Hayes /* FEAT_RME_GDI */ 5145e827bf0STimothy Hayes CREATE_FEATURE_FUNCS(feat_rme_gdi, id_aa64mmfr4_el1, 5155e827bf0STimothy Hayes ID_AA64MMFR4_EL1_RME_GDI_SHIFT, 5165e827bf0STimothy Hayes ID_AA64MMFR4_EL1_RME_GDI_MASK, RME_GDI_IMPLEMENTED, 517f396aec8SArvind Ram Prakash ENABLE_FEAT_RME_GDI, FEAT_ENABLE_ALL_WORLDS) 5185e827bf0STimothy Hayes 519a57e18e4SArvind Ram Prakash /* FEAT_FPMR */ 520a57e18e4SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fpmr, id_aa64pfr2_el1, ID_AA64PFR2_EL1_FPMR_SHIFT, 521a57e18e4SArvind Ram Prakash ID_AA64PFR2_EL1_FPMR_MASK, FPMR_IMPLEMENTED, 522d508bab3SArvind Ram Prakash ENABLE_FEAT_FPMR, FEAT_ENABLE_NS) 5236b8df7b9SArvind Ram Prakash /* FEAT_MOPS */ 5246b8df7b9SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_mops, id_aa64isar2_el1, ID_AA64ISAR2_EL1_MOPS_SHIFT, 5256b8df7b9SArvind Ram Prakash ID_AA64ISAR2_EL1_MOPS_MASK, MOPS_IMPLEMENTED, 526d508bab3SArvind Ram Prakash ENABLE_FEAT_MOPS, FEAT_ENABLE_ALL_WORLDS) 527a57e18e4SArvind Ram Prakash 5280dfa07b6SOlivier Deprez __attribute__((always_inline)) 529062b6c6bSMark Brown static inline bool is_feat_sxpie_supported(void) 530062b6c6bSMark Brown { 531062b6c6bSMark Brown return is_feat_s1pie_supported() || is_feat_s2pie_supported(); 532062b6c6bSMark Brown } 533062b6c6bSMark Brown 534a8d5d3d5SAndre Przywara /* FEAT_GCS: Guarded Control Stack */ 535a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_gcs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_GCS_SHIFT, 536d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_GCS_MASK, 1U, ENABLE_FEAT_GCS, 537d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 538688ab57bSMark Brown 539a8d5d3d5SAndre Przywara /* FEAT_AMU: Activity Monitors Extension */ 540a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_amu, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT, 541d508bab3SArvind Ram Prakash ID_AA64PFR0_AMU_MASK, 1U, ENABLE_FEAT_AMU, 542d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 543aaaf2cc3SSona Mathew 54483ec7e45SBoyan Karatotev /* Auxiliary counters for FEAT_AMU */ 545f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_amu_aux, amcfgr_el0, 546f396aec8SArvind Ram Prakash AMCFGR_EL0_NCG_SHIFT, AMCFGR_EL0_NCG_MASK, 1U) 547f396aec8SArvind Ram Prakash 548f396aec8SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_amu_aux, is_feat_amu_aux_present, 549f396aec8SArvind Ram Prakash ENABLE_AMU_AUXILIARY_COUNTERS) 55083ec7e45SBoyan Karatotev 551aaaf2cc3SSona Mathew /* FEAT_AMUV1P1: AMU Extension v1.1 */ 552aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_amuv1p1, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT, 553d508bab3SArvind Ram Prakash ID_AA64PFR0_AMU_MASK, ID_AA64PFR0_AMU_V1P1, ENABLE_FEAT_AMUv1p1, 554d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 555873d4241Sjohpow01 556dbcc44a1SAlexei Fedorov /* 557dbcc44a1SAlexei Fedorov * Return MPAM version: 558dbcc44a1SAlexei Fedorov * 559dbcc44a1SAlexei Fedorov * 0x00: None Armv8.0 or later 560dbcc44a1SAlexei Fedorov * 0x01: v0.1 Armv8.4 or later 561dbcc44a1SAlexei Fedorov * 0x10: v1.0 Armv8.2 or later 562dbcc44a1SAlexei Fedorov * 0x11: v1.1 Armv8.4 or later 563dbcc44a1SAlexei Fedorov * 564dbcc44a1SAlexei Fedorov */ 5650dfa07b6SOlivier Deprez __attribute__((always_inline)) 566aaaf2cc3SSona Mathew static inline bool is_feat_mpam_present(void) 567dbcc44a1SAlexei Fedorov { 568aaaf2cc3SSona Mathew unsigned int ret = (unsigned int)((((read_id_aa64pfr0_el1() >> 569dbcc44a1SAlexei Fedorov ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) | 570aaaf2cc3SSona Mathew ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_MPAM_FRAC_SHIFT) 571aaaf2cc3SSona Mathew & ID_AA64PFR1_MPAM_FRAC_MASK)); 572aaaf2cc3SSona Mathew return ret; 573dbcc44a1SAlexei Fedorov } 574dbcc44a1SAlexei Fedorov 575aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mpam, is_feat_mpam_present, ENABLE_FEAT_MPAM) 5769448f2b8SAndre Przywara 577c42aefd3SArvind Ram Prakash 578f396aec8SArvind Ram Prakash #if (ENABLE_FEAT_IDTE3 && IMAGE_BL31) 579f396aec8SArvind Ram Prakash __attribute__((always_inline)) 580f396aec8SArvind Ram Prakash static inline void update_feat_mpam_idreg_field(size_t security_state) 581f396aec8SArvind Ram Prakash { 582f396aec8SArvind Ram Prakash if (SHOULD_ID_FIELD_DISABLE(ENABLE_FEAT_MPAM, 583f396aec8SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM, security_state)) { 584f396aec8SArvind Ram Prakash per_world_context_t *per_world_ctx = 585f396aec8SArvind Ram Prakash &per_world_context[security_state]; 586f396aec8SArvind Ram Prakash perworld_idregs_t *perworld_idregs = 587f396aec8SArvind Ram Prakash &(per_world_ctx->idregs); 588f396aec8SArvind Ram Prakash 589f396aec8SArvind Ram Prakash perworld_idregs->id_aa64pfr0_el1 &= 590f396aec8SArvind Ram Prakash ~((u_register_t)ID_AA64PFR0_MPAM_MASK 591f396aec8SArvind Ram Prakash << ID_AA64PFR0_MPAM_SHIFT); 592f396aec8SArvind Ram Prakash 593f396aec8SArvind Ram Prakash perworld_idregs->id_aa64pfr1_el1 &= 594f396aec8SArvind Ram Prakash ~((u_register_t)ID_AA64PFR1_MPAM_FRAC_MASK 595f396aec8SArvind Ram Prakash << ID_AA64PFR1_MPAM_FRAC_SHIFT); 596f396aec8SArvind Ram Prakash } 597f396aec8SArvind Ram Prakash } 598f396aec8SArvind Ram Prakash #endif 599c42aefd3SArvind Ram Prakash 600c42aefd3SArvind Ram Prakash /* FEAT_MPAM_PE_BW_CTRL: MPAM PE-side bandwidth controls */ 601c42aefd3SArvind Ram Prakash __attribute__((always_inline)) 602c42aefd3SArvind Ram Prakash static inline bool is_feat_mpam_pe_bw_ctrl_present(void) 603c42aefd3SArvind Ram Prakash { 604c42aefd3SArvind Ram Prakash if (is_feat_mpam_present()) { 605c42aefd3SArvind Ram Prakash return ((unsigned long long)(read_mpamidr_el1() & 606c42aefd3SArvind Ram Prakash MPAMIDR_HAS_BW_CTRL_BIT) != 0U); 607c42aefd3SArvind Ram Prakash } 608c42aefd3SArvind Ram Prakash return false; 609c42aefd3SArvind Ram Prakash } 610c42aefd3SArvind Ram Prakash 611c42aefd3SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_mpam_pe_bw_ctrl, is_feat_mpam_pe_bw_ctrl_present, 612c42aefd3SArvind Ram Prakash ENABLE_FEAT_MPAM_PE_BW_CTRL) 613c42aefd3SArvind Ram Prakash 61483271d5aSArvind Ram Prakash /* 61583271d5aSArvind Ram Prakash * FEAT_DebugV8P9: Debug extension. This function checks the field 3:0 of 61683271d5aSArvind Ram Prakash * ID_AA64DFR0 Aarch64 Debug Feature Register 0 for the version of 61783271d5aSArvind Ram Prakash * Feat_Debug supported. The value of the field determines feature presence 61883271d5aSArvind Ram Prakash * 61983271d5aSArvind Ram Prakash * 0b0110 - Arm v8.0 debug 62083271d5aSArvind Ram Prakash * 0b0111 - Arm v8.0 debug architecture with Virtualization host extensions 62183271d5aSArvind Ram Prakash * 0x1000 - FEAT_Debugv8p2 is supported 62283271d5aSArvind Ram Prakash * 0x1001 - FEAT_Debugv8p4 is supported 62383271d5aSArvind Ram Prakash * 0x1010 - FEAT_Debugv8p8 is supported 62483271d5aSArvind Ram Prakash * 0x1011 - FEAT_Debugv8p9 is supported 62583271d5aSArvind Ram Prakash * 62683271d5aSArvind Ram Prakash */ 627f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_debugv8p9, id_aa64dfr0_el1, 628f396aec8SArvind Ram Prakash ID_AA64DFR0_DEBUGVER_SHIFT, ID_AA64DFR0_DEBUGVER_MASK, 629f396aec8SArvind Ram Prakash DEBUGVER_V8P9_IMPLEMENTED, ENABLE_FEAT_DEBUGV8P9, 630f396aec8SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 63183271d5aSArvind Ram Prakash 632a8d5d3d5SAndre Przywara /* FEAT_HCX: Extended Hypervisor Configuration Register */ 633a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_hcx, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_HCX_SHIFT, 634d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_HCX_MASK, 1U, ENABLE_FEAT_HCX, 635d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 636cb4ec47bSjohpow01 637aaaf2cc3SSona Mathew /* FEAT_RNG_TRAP: Trapping support */ 63879c0c7faSBoyan Karatotev CREATE_FEATURE_FUNCS(feat_rng_trap, id_aa64pfr1_el1, ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT, 639d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_RNDR_TRAP_MASK, RNG_TRAP_IMPLEMENTED, ENABLE_FEAT_RNG_TRAP, 640d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 641ff86e0b4SJuan Pablo Conde 642aaaf2cc3SSona Mathew /* Return the RME version, zero if not supported. */ 643f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_rme, id_aa64pfr0_el1, 644f396aec8SArvind Ram Prakash ID_AA64PFR0_FEAT_RME_SHIFT, ID_AA64PFR0_FEAT_RME_MASK, 1U) 645f396aec8SArvind Ram Prakash 646f396aec8SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_rme, is_feat_rme_present, ENABLE_RME) 64781c272b3SZelalem Aweke 648aaaf2cc3SSona Mathew /* FEAT_SB: Speculation barrier instruction */ 649aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sb, id_aa64isar1_el1, ID_AA64ISAR1_SB_SHIFT, 650f396aec8SArvind Ram Prakash ID_AA64ISAR1_SB_MASK, 1U, 651f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6526a0da736SJayanth Dodderi Chidanand 6537e84f3cfSTushar Khandelwal /* FEAT_MEC: Memory Encryption Contexts */ 6547e84f3cfSTushar Khandelwal CREATE_FEATURE_FUNCS(feat_mec, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_MEC_SHIFT, 655d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_MEC_MASK, 1U, ENABLE_FEAT_MEC, 656d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6577e84f3cfSTushar Khandelwal 65830019d86SSona Mathew /* 65930019d86SSona Mathew * FEAT_CSV2: Cache Speculation Variant 2. This checks bit fields[56-59] 66030019d86SSona Mathew * of id_aa64pfr0_el1 register and can be used to check for below features: 66130019d86SSona Mathew * FEAT_CSV2_2: Cache Speculation Variant CSV2_2. 66230019d86SSona Mathew * FEAT_CSV2_3: Cache Speculation Variant CSV2_3. 66330019d86SSona Mathew * 0b0000 - Feature FEAT_CSV2 is not implemented. 66430019d86SSona Mathew * 0b0001 - Feature FEAT_CSV2 is implemented, but FEAT_CSV2_2 and FEAT_CSV2_3 66530019d86SSona Mathew * are not implemented. 66630019d86SSona Mathew * 0b0010 - Feature FEAT_CSV2_2 is implemented but FEAT_CSV2_3 is not 66730019d86SSona Mathew * implemented. 66830019d86SSona Mathew * 0b0011 - Feature FEAT_CSV2_3 is implemented. 66930019d86SSona Mathew */ 67030019d86SSona Mathew 671aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_2, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT, 672d508bab3SArvind Ram Prakash ID_AA64PFR0_CSV2_MASK, CSV2_2_IMPLEMENTED, ENABLE_FEAT_CSV2_2, 673d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 674aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_3, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT, 675d508bab3SArvind Ram Prakash ID_AA64PFR0_CSV2_MASK, CSV2_3_IMPLEMENTED, ENABLE_FEAT_CSV2_3, 676d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6777db710f0SAndre Przywara 678a8d5d3d5SAndre Przywara /* FEAT_SPE: Statistical Profiling Extension */ 679f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_spe, id_aa64dfr0_el1, ID_AA64DFR0_PMS_SHIFT, 680d508bab3SArvind Ram Prakash ID_AA64DFR0_PMS_MASK, 1U, ENABLE_SPE_FOR_NS, 681d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6827db710f0SAndre Przywara 683a8d5d3d5SAndre Przywara /* FEAT_SVE: Scalable Vector Extension */ 684a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sve, id_aa64pfr0_el1, ID_AA64PFR0_SVE_SHIFT, 685d508bab3SArvind Ram Prakash ID_AA64PFR0_SVE_MASK, 1U, ENABLE_SVE_FOR_NS, 686d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6877db710f0SAndre Przywara 688a8d5d3d5SAndre Przywara /* FEAT_RAS: Reliability, Accessibility, Serviceability */ 689aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ras, id_aa64pfr0_el1, ID_AA64PFR0_RAS_SHIFT, 690d508bab3SArvind Ram Prakash ID_AA64PFR0_RAS_MASK, 1U, ENABLE_FEAT_RAS, 691d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6926a0da736SJayanth Dodderi Chidanand 693a8d5d3d5SAndre Przywara /* FEAT_DIT: Data Independent Timing instructions */ 694aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_dit, id_aa64pfr0_el1, ID_AA64PFR0_DIT_SHIFT, 695d508bab3SArvind Ram Prakash ID_AA64PFR0_DIT_MASK, 1U, ENABLE_FEAT_DIT, 696d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6976437a09aSAndre Przywara 698aaaf2cc3SSona Mathew /* FEAT_SYS_REG_TRACE */ 699f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_sys_reg_trace, id_aa64dfr0_el1, 700f396aec8SArvind Ram Prakash ID_AA64DFR0_TRACEVER_SHIFT, ID_AA64DFR0_TRACEVER_MASK, 701f396aec8SArvind Ram Prakash 1U, ENABLE_SYS_REG_TRACE_FOR_NS, 702d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 7036437a09aSAndre Przywara 704a8d5d3d5SAndre Przywara /* FEAT_TRF: TraceFilter */ 705f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_trf, id_aa64dfr0_el1, ID_AA64DFR0_TRACEFILT_SHIFT, 706d508bab3SArvind Ram Prakash ID_AA64DFR0_TRACEFILT_MASK, 1U, ENABLE_TRF_FOR_NS, 707d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 7086437a09aSAndre Przywara 709a8d5d3d5SAndre Przywara /* FEAT_NV2: Enhanced Nested Virtualization */ 710aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_nv2, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_NV_SHIFT, 711d508bab3SArvind Ram Prakash ID_AA64MMFR2_EL1_NV_MASK, NV2_IMPLEMENTED, CTX_INCLUDE_NEVE_REGS, 712d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 7136a0da736SJayanth Dodderi Chidanand 714a8d5d3d5SAndre Przywara /* FEAT_BRBE: Branch Record Buffer Extension */ 715f396aec8SArvind Ram Prakash CREATE_PERCPU_FEATURE_FUNCS(feat_brbe, id_aa64dfr0_el1, ID_AA64DFR0_BRBE_SHIFT, 716d508bab3SArvind Ram Prakash ID_AA64DFR0_BRBE_MASK, 1U, ENABLE_BRBE_FOR_NS, 717d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 7182b0bc4e0SJayanth Dodderi Chidanand 719a8d5d3d5SAndre Przywara /* FEAT_TRBE: Trace Buffer Extension */ 720f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_trbe, id_aa64dfr0_el1, ID_AA64DFR0_TRACEBUFFER_SHIFT, 721f396aec8SArvind Ram Prakash ID_AA64DFR0_TRACEBUFFER_MASK, 1U) 722f396aec8SArvind Ram Prakash 723f396aec8SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_trbe, is_feat_trbe_present, ENABLE_TRBE_FOR_NS) 724f396aec8SArvind Ram Prakash 725f396aec8SArvind Ram Prakash CREATE_PERCPU_IDREG_UPDATE(feat_trbe, id_aa64dfr0_el1, ID_AA64DFR0_TRACEBUFFER_SHIFT, 726f396aec8SArvind Ram Prakash ID_AA64DFR0_TRACEBUFFER_MASK, 727f396aec8SArvind Ram Prakash ENABLE_TRBE_FOR_NS && !check_if_trbe_disable_affected_core(), 728f396aec8SArvind Ram Prakash FEAT_ENABLE_NS) 7292b0bc4e0SJayanth Dodderi Chidanand 730aaaf2cc3SSona Mathew /* FEAT_SME_FA64: Full A64 Instruction support in streaming SVE mode */ 731aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sme_fa64, id_aa64smfr0_el1, ID_AA64SMFR0_EL1_SME_FA64_SHIFT, 732f396aec8SArvind Ram Prakash ID_AA64SMFR0_EL1_SME_FA64_MASK, 1U, 733f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 734aaaf2cc3SSona Mathew 735a8d5d3d5SAndre Przywara /* FEAT_SMEx: Scalar Matrix Extension */ 736a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sme, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT, 737d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_SME_MASK, 1U, ENABLE_SME_FOR_NS, 738d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 739aaaf2cc3SSona Mathew 740aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_sme2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT, 741d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_SME_MASK, SME2_IMPLEMENTED, ENABLE_SME2_FOR_NS, 742d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 74303d3c0d7SJayanth Dodderi Chidanand 7443a6e53c8SArvind Ram Prakash /* FEAT_LS64_ACCDATA: Support for 64-byte EL0 stores with status */ 74519d52a83SAndre Przywara CREATE_FEATURE_FUNCS(feat_ls64_accdata, id_aa64isar1_el1, ID_AA64ISAR1_LS64_SHIFT, 74619d52a83SAndre Przywara ID_AA64ISAR1_LS64_MASK, LS64_ACCDATA_IMPLEMENTED, 747d508bab3SArvind Ram Prakash ENABLE_FEAT_LS64_ACCDATA, FEAT_ENABLE_ALL_WORLDS) 74819d52a83SAndre Przywara 7493a6e53c8SArvind Ram Prakash /* FEAT_AIE: Memory Attribute Index Enhancement */ 750cc2523bbSAndre Przywara CREATE_FEATURE_FUNCS(feat_aie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_AIE_SHIFT, 751d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_AIE_MASK, 1U, ENABLE_FEAT_AIE, 752d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 753cc2523bbSAndre Przywara 7543a6e53c8SArvind Ram Prakash /* FEAT_PFAR: Physical Fault Address Register Extension */ 755b3bcfd12SAndre Przywara CREATE_FEATURE_FUNCS(feat_pfar, id_aa64pfr1_el1, ID_AA64PFR1_EL1_PFAR_SHIFT, 756d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_PFAR_MASK, 1U, ENABLE_FEAT_PFAR, 757d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 758b3bcfd12SAndre Przywara 759f396aec8SArvind Ram Prakash /* FEAT_IDTE3: Trapping lower EL ID Register access to EL3 */ 760f396aec8SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_idte3, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_IDS_SHIFT, 761f396aec8SArvind Ram Prakash ID_AA64MMFR2_EL1_IDS_MASK, 2U, ENABLE_FEAT_IDTE3, 762f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 763f396aec8SArvind Ram Prakash 764bff074ddSJavier Almansa Sobrino /******************************************************************************* 765bff074ddSJavier Almansa Sobrino * Function to get hardware granularity support 766bff074ddSJavier Almansa Sobrino ******************************************************************************/ 767bff074ddSJavier Almansa Sobrino 7680dfa07b6SOlivier Deprez __attribute__((always_inline)) 769aaaf2cc3SSona Mathew static inline bool is_feat_tgran4K_present(void) 770bff074ddSJavier Almansa Sobrino { 771aaaf2cc3SSona Mathew unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(), 772aaaf2cc3SSona Mathew ID_AA64MMFR0_EL1_TGRAN4_SHIFT, ID_REG_FIELD_MASK); 773aaaf2cc3SSona Mathew return (tgranx < 8U); 774bff074ddSJavier Almansa Sobrino } 775bff074ddSJavier Almansa Sobrino 776aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_tgran16K, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_TGRAN16_SHIFT, 777f396aec8SArvind Ram Prakash ID_AA64MMFR0_EL1_TGRAN16_MASK, TGRAN16_IMPLEMENTED, 778f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 779aaaf2cc3SSona Mathew 7800dfa07b6SOlivier Deprez __attribute__((always_inline)) 781aaaf2cc3SSona Mathew static inline bool is_feat_tgran64K_present(void) 782bff074ddSJavier Almansa Sobrino { 783aaaf2cc3SSona Mathew unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(), 784aaaf2cc3SSona Mathew ID_AA64MMFR0_EL1_TGRAN64_SHIFT, ID_REG_FIELD_MASK); 785aaaf2cc3SSona Mathew return (tgranx < 8U); 786bff074ddSJavier Almansa Sobrino } 787bff074ddSJavier Almansa Sobrino 788aaaf2cc3SSona Mathew /* FEAT_PMUV3 */ 789f396aec8SArvind Ram Prakash _CREATE_FEATURE_PRESENT(feat_pmuv3, id_aa64dfr0_el1, ID_AA64DFR0_PMUVER_SHIFT, 790aaaf2cc3SSona Mathew ID_AA64DFR0_PMUVER_MASK, 1U) 791aaaf2cc3SSona Mathew 792aaaf2cc3SSona Mathew /* FEAT_MTPMU */ 7930dfa07b6SOlivier Deprez __attribute__((always_inline)) 794aaaf2cc3SSona Mathew static inline bool is_feat_mtpmu_present(void) 795bff074ddSJavier Almansa Sobrino { 796aaaf2cc3SSona Mathew unsigned int mtpmu = ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_MTPMU_SHIFT, 797aaaf2cc3SSona Mathew ID_AA64DFR0_MTPMU_MASK); 7989e51f15eSSona Mathew return (mtpmu != 0U) && (mtpmu != MTPMU_NOT_IMPLEMENTED); 79983a4dae1SBoyan Karatotev } 80083a4dae1SBoyan Karatotev 801aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mtpmu, is_feat_mtpmu_present, DISABLE_MTPMU) 802aaaf2cc3SSona Mathew 803f396aec8SArvind Ram Prakash CREATE_PERCPU_IDREG_UPDATE(feat_mtpmu, id_aa64dfr0_el1, ID_AA64DFR0_MTPMU_SHIFT, 804f396aec8SArvind Ram Prakash ID_AA64DFR0_MTPMU_MASK, DISABLE_MTPMU, 805f396aec8SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 806f396aec8SArvind Ram Prakash 8078cef63d6SBoyan Karatotev /************************************************************************* 8088cef63d6SBoyan Karatotev * Function to identify the presence of FEAT_GCIE (GICv5 CPU interface 8098cef63d6SBoyan Karatotev * extension). 8108cef63d6SBoyan Karatotev ************************************************************************/ 8118cef63d6SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_gcie, id_aa64pfr2_el1, ID_AA64PFR2_EL1_GCIE_SHIFT, 812d508bab3SArvind Ram Prakash ID_AA64PFR2_EL1_GCIE_MASK, 1U, ENABLE_FEAT_GCIE, 813d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 8148cef63d6SBoyan Karatotev 815a1032bebSJohn Powell CREATE_FEATURE_FUNCS(feat_cpa2, id_aa64isar3_el1, ID_AA64ISAR3_EL1_CPA_SHIFT, 816a1032bebSJohn Powell ID_AA64ISAR3_EL1_CPA_MASK, CPA2_IMPLEMENTED, 817d508bab3SArvind Ram Prakash ENABLE_FEAT_CPA2, FEAT_ENABLE_ALL_WORLDS) 818a1032bebSJohn Powell 819*4286d16fSArvind Ram Prakash /* FEAT_UINJ: Injection of Undefined Instruction exceptions */ 820*4286d16fSArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_uinj, id_aa64pfr2_el1, ID_AA64PFR2_EL1_UINJ_SHIFT, 821*4286d16fSArvind Ram Prakash ID_AA64PFR2_EL1_UINJ_MASK, UINJ_IMPLEMENTED, 822*4286d16fSArvind Ram Prakash ENABLE_FEAT_UINJ, FEAT_ENABLE_ALL_WORLDS) 8232559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */ 824