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> 142559b2c8SAntonio Nino Diaz 15*d508bab3SArvind Ram Prakash #if ENABLE_RME 16*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_ALL_WORLDS \ 17*d508bab3SArvind Ram Prakash ((1u << CPU_CONTEXT_SECURE) | \ 18*d508bab3SArvind Ram Prakash (1u << CPU_CONTEXT_NS) | \ 19*d508bab3SArvind Ram Prakash (1u << CPU_CONTEXT_REALM)) 20*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_REALM (1 << CPU_CONTEXT_REALM) 21*d508bab3SArvind Ram Prakash #else 22*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_ALL_WORLDS \ 23*d508bab3SArvind Ram Prakash ((1u << CPU_CONTEXT_SECURE) | \ 24*d508bab3SArvind Ram Prakash (1u << CPU_CONTEXT_NS)) 25*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_REALM U(0) 26*d508bab3SArvind Ram Prakash #endif 27*d508bab3SArvind Ram Prakash 28*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_SECURE (1 << CPU_CONTEXT_SECURE) 29*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_NS (1 << CPU_CONTEXT_NS) 30*d508bab3SArvind Ram Prakash 31aaaf2cc3SSona Mathew #define ISOLATE_FIELD(reg, feat, mask) \ 32aaaf2cc3SSona Mathew ((unsigned int)(((reg) >> (feat)) & mask)) 33a8d5d3d5SAndre Przywara 34aaaf2cc3SSona Mathew #define CREATE_FEATURE_SUPPORTED(name, read_func, guard) \ 350dfa07b6SOlivier Deprez __attribute__((always_inline)) \ 36a8d5d3d5SAndre Przywara static inline bool is_ ## name ## _supported(void) \ 37a8d5d3d5SAndre Przywara { \ 38a8d5d3d5SAndre Przywara if ((guard) == FEAT_STATE_DISABLED) { \ 39a8d5d3d5SAndre Przywara return false; \ 40a8d5d3d5SAndre Przywara } \ 41a8d5d3d5SAndre Przywara if ((guard) == FEAT_STATE_ALWAYS) { \ 42a8d5d3d5SAndre Przywara return true; \ 43a8d5d3d5SAndre Przywara } \ 44aaaf2cc3SSona Mathew return read_func(); \ 45a8d5d3d5SAndre Przywara } 46a8d5d3d5SAndre Przywara 47aaaf2cc3SSona Mathew #define CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval) \ 480dfa07b6SOlivier Deprez __attribute__((always_inline)) \ 49aaaf2cc3SSona Mathew static inline bool is_ ## name ## _present(void) \ 50a8d5d3d5SAndre Przywara { \ 51aaaf2cc3SSona Mathew return (ISOLATE_FIELD(read_ ## idreg(), idfield, mask) >= idval) \ 52aaaf2cc3SSona Mathew ? true : false; \ 53aaaf2cc3SSona Mathew } 54aaaf2cc3SSona Mathew 55*d508bab3SArvind Ram Prakash #define CREATE_FEATURE_FUNCS(name, idreg, idfield, mask, idval, guard, \ 56*d508bab3SArvind Ram Prakash enabled_worlds) \ 57aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval) \ 58aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(name, is_ ## name ## _present, guard) 59aaaf2cc3SSona Mathew 60aaaf2cc3SSona Mathew 61aaaf2cc3SSona Mathew /* +----------------------------+ 62aaaf2cc3SSona Mathew * | Features supported | 63aaaf2cc3SSona Mathew * +----------------------------+ 64aaaf2cc3SSona Mathew * | GENTIMER | 65aaaf2cc3SSona Mathew * +----------------------------+ 66aaaf2cc3SSona Mathew * | FEAT_PAN | 67aaaf2cc3SSona Mathew * +----------------------------+ 68aaaf2cc3SSona Mathew * | FEAT_VHE | 69aaaf2cc3SSona Mathew * +----------------------------+ 70aaaf2cc3SSona Mathew * | FEAT_TTCNP | 71aaaf2cc3SSona Mathew * +----------------------------+ 72aaaf2cc3SSona Mathew * | FEAT_UAO | 73aaaf2cc3SSona Mathew * +----------------------------+ 74aaaf2cc3SSona Mathew * | FEAT_PACQARMA3 | 75aaaf2cc3SSona Mathew * +----------------------------+ 76aaaf2cc3SSona Mathew * | FEAT_PAUTH | 77aaaf2cc3SSona Mathew * +----------------------------+ 78aaaf2cc3SSona Mathew * | FEAT_TTST | 79aaaf2cc3SSona Mathew * +----------------------------+ 80aaaf2cc3SSona Mathew * | FEAT_BTI | 81aaaf2cc3SSona Mathew * +----------------------------+ 82aaaf2cc3SSona Mathew * | FEAT_MTE2 | 83aaaf2cc3SSona Mathew * +----------------------------+ 84aaaf2cc3SSona Mathew * | FEAT_SSBS | 85aaaf2cc3SSona Mathew * +----------------------------+ 86aaaf2cc3SSona Mathew * | FEAT_NMI | 87aaaf2cc3SSona Mathew * +----------------------------+ 88aaaf2cc3SSona Mathew * | FEAT_GCS | 89aaaf2cc3SSona Mathew * +----------------------------+ 90aaaf2cc3SSona Mathew * | FEAT_EBEP | 91aaaf2cc3SSona Mathew * +----------------------------+ 92aaaf2cc3SSona Mathew * | FEAT_SEBEP | 93aaaf2cc3SSona Mathew * +----------------------------+ 94aaaf2cc3SSona Mathew * | FEAT_SEL2 | 95aaaf2cc3SSona Mathew * +----------------------------+ 96aaaf2cc3SSona Mathew * | FEAT_TWED | 97aaaf2cc3SSona Mathew * +----------------------------+ 98aaaf2cc3SSona Mathew * | FEAT_FGT | 99aaaf2cc3SSona Mathew * +----------------------------+ 100aaaf2cc3SSona Mathew * | FEAT_EC/ECV2 | 101aaaf2cc3SSona Mathew * +----------------------------+ 102aaaf2cc3SSona Mathew * | FEAT_RNG | 103aaaf2cc3SSona Mathew * +----------------------------+ 104aaaf2cc3SSona Mathew * | FEAT_TCR2 | 105aaaf2cc3SSona Mathew * +----------------------------+ 106aaaf2cc3SSona Mathew * | FEAT_S2POE | 107aaaf2cc3SSona Mathew * +----------------------------+ 108aaaf2cc3SSona Mathew * | FEAT_S1POE | 109aaaf2cc3SSona Mathew * +----------------------------+ 110aaaf2cc3SSona Mathew * | FEAT_S2PIE | 111aaaf2cc3SSona Mathew * +----------------------------+ 112aaaf2cc3SSona Mathew * | FEAT_S1PIE | 113aaaf2cc3SSona Mathew * +----------------------------+ 114aaaf2cc3SSona Mathew * | FEAT_AMU/AMUV1P1 | 115aaaf2cc3SSona Mathew * +----------------------------+ 116aaaf2cc3SSona Mathew * | FEAT_MPAM | 117aaaf2cc3SSona Mathew * +----------------------------+ 118aaaf2cc3SSona Mathew * | FEAT_HCX | 119aaaf2cc3SSona Mathew * +----------------------------+ 120aaaf2cc3SSona Mathew * | FEAT_RNG_TRAP | 121aaaf2cc3SSona Mathew * +----------------------------+ 122aaaf2cc3SSona Mathew * | FEAT_RME | 123aaaf2cc3SSona Mathew * +----------------------------+ 124aaaf2cc3SSona Mathew * | FEAT_SB | 125aaaf2cc3SSona Mathew * +----------------------------+ 126aaaf2cc3SSona Mathew * | FEAT_CSV2/CSV3 | 127aaaf2cc3SSona Mathew * +----------------------------+ 128aaaf2cc3SSona Mathew * | FEAT_SPE | 129aaaf2cc3SSona Mathew * +----------------------------+ 130aaaf2cc3SSona Mathew * | FEAT_SVE | 131aaaf2cc3SSona Mathew * +----------------------------+ 132aaaf2cc3SSona Mathew * | FEAT_RAS | 133aaaf2cc3SSona Mathew * +----------------------------+ 134aaaf2cc3SSona Mathew * | FEAT_DIT | 135aaaf2cc3SSona Mathew * +----------------------------+ 136aaaf2cc3SSona Mathew * | FEAT_SYS_REG_TRACE | 137aaaf2cc3SSona Mathew * +----------------------------+ 138aaaf2cc3SSona Mathew * | FEAT_TRF | 139aaaf2cc3SSona Mathew * +----------------------------+ 1403c0ebab5SArvind Ram Prakash * | FEAT_NV2 | 141aaaf2cc3SSona Mathew * +----------------------------+ 142aaaf2cc3SSona Mathew * | FEAT_BRBE | 143aaaf2cc3SSona Mathew * +----------------------------+ 144aaaf2cc3SSona Mathew * | FEAT_TRBE | 145aaaf2cc3SSona Mathew * +----------------------------+ 146aaaf2cc3SSona Mathew * | FEAT_SME/SME2 | 147aaaf2cc3SSona Mathew * +----------------------------+ 148aaaf2cc3SSona Mathew * | FEAT_PMUV3 | 149aaaf2cc3SSona Mathew * +----------------------------+ 150aaaf2cc3SSona Mathew * | FEAT_MTPMU | 151aaaf2cc3SSona Mathew * +----------------------------+ 15233e6aaacSArvind Ram Prakash * | FEAT_FGT2 | 15333e6aaacSArvind Ram Prakash * +----------------------------+ 1546d0433f0SJayanth Dodderi Chidanand * | FEAT_THE | 1556d0433f0SJayanth Dodderi Chidanand * +----------------------------+ 1564ec4e545SJayanth Dodderi Chidanand * | FEAT_SCTLR2 | 1574ec4e545SJayanth Dodderi Chidanand * +----------------------------+ 15830655136SGovindraj Raja * | FEAT_D128 | 15930655136SGovindraj Raja * +----------------------------+ 16019d52a83SAndre Przywara * | FEAT_LS64_ACCDATA | 16119d52a83SAndre Przywara * +----------------------------+ 162a57e18e4SArvind Ram Prakash * | FEAT_FPMR | 163a57e18e4SArvind Ram Prakash * +----------------------------+ 1646b8df7b9SArvind Ram Prakash * | FEAT_MOPS | 1656b8df7b9SArvind Ram Prakash * +----------------------------+ 166025b1b81SJohn Powell * | FEAT_PAUTH_LR | 167025b1b81SJohn Powell * +----------------------------+ 1684274b526SArvind Ram Prakash * | FEAT_FGWTE3 | 1694274b526SArvind Ram Prakash * +----------------------------+ 170c42aefd3SArvind Ram Prakash * | FEAT_MPAM_PE_BW_CTRL | 171c42aefd3SArvind Ram Prakash * +----------------------------+ 172a1032bebSJohn Powell * | FEAT_CPA2 | 173a1032bebSJohn Powell * +----------------------------+ 174cc2523bbSAndre Przywara * | FEAT_AIE | 175cc2523bbSAndre Przywara * +----------------------------+ 176b3bcfd12SAndre Przywara * | FEAT_PFAR | 177b3bcfd12SAndre Przywara * +----------------------------+ 17809a4bcb8SGirish Pathak * | FEAT_RME_GPC2 | 17909a4bcb8SGirish Pathak * +----------------------------+ 1805e827bf0STimothy Hayes * | FEAT_RME_GDI | 1815e827bf0STimothy Hayes * +----------------------------+ 182aaaf2cc3SSona Mathew */ 183fd1dd4cbSAndre Przywara 1840dfa07b6SOlivier Deprez __attribute__((always_inline)) 18529a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void) 18629a24134SAntonio Nino Diaz { 18729a24134SAntonio Nino Diaz /* The Generic Timer is always present in an ARMv8-A implementation */ 18829a24134SAntonio Nino Diaz return true; 18929a24134SAntonio Nino Diaz } 19029a24134SAntonio Nino Diaz 191aaaf2cc3SSona Mathew /* FEAT_PAN: Privileged access never */ 192a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_pan, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_PAN_SHIFT, 193*d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_PAN_MASK, 1U, ENABLE_FEAT_PAN, 194*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 19530f05b4fSManish Pandey 196aaaf2cc3SSona Mathew /* FEAT_VHE: Virtualization Host Extensions */ 197a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_vhe, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_VHE_SHIFT, 198*d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_VHE_MASK, 1U, ENABLE_FEAT_VHE, 199*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 20037596fcbSDaniel Boulby 201aaaf2cc3SSona Mathew /* FEAT_TTCNP: Translation table common not private */ 202aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttcnp, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_CNP_SHIFT, 203aaaf2cc3SSona Mathew ID_AA64MMFR2_EL1_CNP_MASK, 1U) 2042559b2c8SAntonio Nino Diaz 205aaaf2cc3SSona Mathew /* FEAT_UAO: User access override */ 206aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_uao, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_UAO_SHIFT, 207aaaf2cc3SSona Mathew ID_AA64MMFR2_EL1_UAO_MASK, 1U) 2089ff5f754SJuan Pablo Conde 2099ff5f754SJuan Pablo Conde /* If any of the fields is not zero, QARMA3 algorithm is present */ 210aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_pacqarma3, id_aa64isar2_el1, 0, 211aaaf2cc3SSona Mathew ((ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) | 212aaaf2cc3SSona Mathew (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT)), 1U) 2139ff5f754SJuan Pablo Conde 214b0b7609eSBoyan Karatotev /* FEAT_PAUTH: Pointer Authentication */ 2150dfa07b6SOlivier Deprez __attribute__((always_inline)) 216b0b7609eSBoyan Karatotev static inline bool is_feat_pauth_present(void) 217b86048c4SAntonio Nino Diaz { 2189ff5f754SJuan Pablo Conde uint64_t mask_id_aa64isar1 = 2199ff5f754SJuan Pablo Conde (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) | 220b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) | 221b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) | 222b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT); 223b86048c4SAntonio Nino Diaz 2249ff5f754SJuan Pablo Conde /* 2259ff5f754SJuan Pablo Conde * If any of the fields is not zero or QARMA3 is present, 2269ff5f754SJuan Pablo Conde * PAuth is present 2279ff5f754SJuan Pablo Conde */ 2289ff5f754SJuan Pablo Conde return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U || 2299ff5f754SJuan Pablo Conde is_feat_pacqarma3_present()); 230b86048c4SAntonio Nino Diaz } 231b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(feat_pauth, is_feat_pauth_present, ENABLE_PAUTH) 232b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(ctx_pauth, is_feat_pauth_present, CTX_INCLUDE_PAUTH_REGS) 233b86048c4SAntonio Nino Diaz 234025b1b81SJohn Powell /* 235025b1b81SJohn Powell * FEAT_PAUTH_LR 236025b1b81SJohn Powell * This feature has a non-standard discovery method so define this function 237025b1b81SJohn Powell * manually then call use the CREATE_FEATURE_SUPPORTED macro with it. This 238025b1b81SJohn Powell * feature is enabled with ENABLE_PAUTH when present. 239025b1b81SJohn Powell */ 240025b1b81SJohn Powell __attribute__((always_inline)) 241025b1b81SJohn Powell static inline bool is_feat_pauth_lr_present(void) 242025b1b81SJohn Powell { 243025b1b81SJohn Powell /* 244025b1b81SJohn Powell * FEAT_PAUTH_LR support is indicated by up to 3 fields, if one or more 245025b1b81SJohn Powell * of these is 0b0110 then the feature is present. 246025b1b81SJohn Powell * 1) id_aa64isr1_el1.api 247025b1b81SJohn Powell * 2) id_aa64isr1_el1.apa 248025b1b81SJohn Powell * 3) id_aa64isr2_el1.apa3 249025b1b81SJohn Powell */ 250025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_API_SHIFT, ID_AA64ISAR1_API_MASK) == 0b0110) { 251025b1b81SJohn Powell return true; 252025b1b81SJohn Powell } 253025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_APA_SHIFT, ID_AA64ISAR1_APA_MASK) == 0b0110) { 254025b1b81SJohn Powell return true; 255025b1b81SJohn Powell } 256025b1b81SJohn Powell if (ISOLATE_FIELD(read_id_aa64isar2_el1(), ID_AA64ISAR2_APA3_SHIFT, ID_AA64ISAR2_APA3_MASK) == 0b0110) { 257025b1b81SJohn Powell return true; 258025b1b81SJohn Powell } 259025b1b81SJohn Powell return false; 260025b1b81SJohn Powell } 261025b1b81SJohn Powell CREATE_FEATURE_SUPPORTED(feat_pauth_lr, is_feat_pauth_lr_present, ENABLE_FEAT_PAUTH_LR) 262025b1b81SJohn Powell 263aaaf2cc3SSona Mathew /* FEAT_TTST: Small translation tables */ 264aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttst, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_ST_SHIFT, 265aaaf2cc3SSona Mathew ID_AA64MMFR2_EL1_ST_MASK, 1U) 266cedfa04bSSathees Balya 267aaaf2cc3SSona Mathew /* FEAT_BTI: Branch target identification */ 26810ecd580SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_bti, id_aa64pfr1_el1, ID_AA64PFR1_EL1_BT_SHIFT, 269*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_BT_MASK, BTI_IMPLEMENTED, ENABLE_BTI, 270*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 2719fc59639SAlexei Fedorov 272aaaf2cc3SSona Mathew /* FEAT_MTE2: Memory tagging extension */ 273aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_mte2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_MTE_SHIFT, 274*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_MTE_MASK, MTE_IMPLEMENTED_ELX, ENABLE_FEAT_MTE2, 275*d508bab3SArvind Ram Prakash FEAT_ENABLE_SECURE | FEAT_ENABLE_NS) 27630f05b4fSManish Pandey 277aaaf2cc3SSona Mathew /* FEAT_SSBS: Speculative store bypass safe */ 278aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ssbs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SSBS_SHIFT, 279aaaf2cc3SSona Mathew ID_AA64PFR1_EL1_SSBS_MASK, 1U) 28030f05b4fSManish Pandey 281aaaf2cc3SSona Mathew /* FEAT_NMI: Non-maskable interrupts */ 282aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_nmi, id_aa64pfr1_el1, ID_AA64PFR1_EL1_NMI_SHIFT, 283aaaf2cc3SSona Mathew ID_AA64PFR1_EL1_NMI_MASK, NMI_IMPLEMENTED) 28430f05b4fSManish Pandey 285aaaf2cc3SSona Mathew /* FEAT_EBEP */ 286714a1a93SManish Pandey CREATE_FEATURE_FUNCS(feat_ebep, id_aa64dfr1_el1, ID_AA64DFR1_EBEP_SHIFT, 287714a1a93SManish Pandey ID_AA64DFR1_EBEP_MASK, 1U, ENABLE_FEAT_EBEP) 28830f05b4fSManish Pandey 289aaaf2cc3SSona Mathew /* FEAT_SEBEP */ 290aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sebep, id_aa64dfr0_el1, ID_AA64DFR0_SEBEP_SHIFT, 291aaaf2cc3SSona Mathew ID_AA64DFR0_SEBEP_MASK, SEBEP_IMPLEMENTED) 29230f05b4fSManish Pandey 293aaaf2cc3SSona Mathew /* FEAT_SEL2: Secure EL2 */ 294a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sel2, id_aa64pfr0_el1, ID_AA64PFR0_SEL2_SHIFT, 295*d508bab3SArvind Ram Prakash ID_AA64PFR0_SEL2_MASK, 1U, ENABLE_FEAT_SEL2, 296*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 297aaaf2cc3SSona Mathew 298aaaf2cc3SSona Mathew /* FEAT_TWED: Delayed trapping of WFE */ 299a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_twed, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_TWED_SHIFT, 300*d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_TWED_MASK, 1U, ENABLE_FEAT_TWED, 301*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 302aaaf2cc3SSona Mathew 303aaaf2cc3SSona Mathew /* FEAT_FGT: Fine-grained traps */ 304a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_fgt, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT, 305*d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_FGT_MASK, 1U, ENABLE_FEAT_FGT, 306*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 307aaaf2cc3SSona Mathew 30833e6aaacSArvind Ram Prakash /* FEAT_FGT2: Fine-grained traps extended */ 30933e6aaacSArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgt2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT, 310*d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_FGT_MASK, FGT2_IMPLEMENTED, ENABLE_FEAT_FGT2, 311*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 31233e6aaacSArvind Ram Prakash 3134274b526SArvind Ram Prakash /* FEAT_FGWTE3: Fine-grained write traps EL3 */ 3144274b526SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgwte3, id_aa64mmfr4_el1, ID_AA64MMFR4_EL1_FGWTE3_SHIFT, 3154274b526SArvind Ram Prakash ID_AA64MMFR4_EL1_FGWTE3_MASK, FGWTE3_IMPLEMENTED, 316*d508bab3SArvind Ram Prakash ENABLE_FEAT_FGWTE3, FEAT_ENABLE_ALL_WORLDS) 3174274b526SArvind Ram Prakash 318aaaf2cc3SSona Mathew /* FEAT_ECV: Enhanced Counter Virtualization */ 319a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_ecv, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT, 320*d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_ECV_MASK, 1U, ENABLE_FEAT_ECV, 321*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 322aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ecv_v2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT, 323*d508bab3SArvind Ram Prakash ID_AA64MMFR0_EL1_ECV_MASK, ID_AA64MMFR0_EL1_ECV_SELF_SYNCH, 324*d508bab3SArvind Ram Prakash ENABLE_FEAT_ECV, FEAT_ENABLE_ALL_WORLDS) 325623f6140SAndre Przywara 326aaaf2cc3SSona Mathew /* FEAT_RNG: Random number generator */ 327a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_rng, id_aa64isar0_el1, ID_AA64ISAR0_RNDR_SHIFT, 328*d508bab3SArvind Ram Prakash ID_AA64ISAR0_RNDR_MASK, 1U, ENABLE_FEAT_RNG, 329*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 330623f6140SAndre Przywara 331aaaf2cc3SSona Mathew /* FEAT_TCR2: Support TCR2_ELx regs */ 332aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_tcr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_TCRX_SHIFT, 333*d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_TCRX_MASK, 1U, ENABLE_FEAT_TCR2, 334*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 335aaaf2cc3SSona Mathew 336aaaf2cc3SSona Mathew /* FEAT_S2POE */ 337a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2POE_SHIFT, 338*d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S2POE_MASK, 1U, ENABLE_FEAT_S2POE, 339*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 340aaaf2cc3SSona Mathew 341aaaf2cc3SSona Mathew /* FEAT_S1POE */ 342a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1POE_SHIFT, 343*d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S1POE_MASK, 1U, ENABLE_FEAT_S1POE, 344*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 345aaaf2cc3SSona Mathew 3460dfa07b6SOlivier Deprez __attribute__((always_inline)) 347062b6c6bSMark Brown static inline bool is_feat_sxpoe_supported(void) 348062b6c6bSMark Brown { 349062b6c6bSMark Brown return is_feat_s1poe_supported() || is_feat_s2poe_supported(); 350062b6c6bSMark Brown } 351062b6c6bSMark Brown 352aaaf2cc3SSona Mathew /* FEAT_S2PIE */ 353a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2PIE_SHIFT, 354*d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S2PIE_MASK, 1U, ENABLE_FEAT_S2PIE, 355*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 356aaaf2cc3SSona Mathew 357aaaf2cc3SSona Mathew /* FEAT_S1PIE */ 358a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1PIE_SHIFT, 359*d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_S1PIE_MASK, 1U, ENABLE_FEAT_S1PIE, 360*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 361aaaf2cc3SSona Mathew 3626d0433f0SJayanth Dodderi Chidanand /* FEAT_THE: Translation Hardening Extension */ 3636d0433f0SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_the, id_aa64pfr1_el1, ID_AA64PFR1_EL1_THE_SHIFT, 364*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_THE_MASK, THE_IMPLEMENTED, ENABLE_FEAT_THE, 365*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 3666d0433f0SJayanth Dodderi Chidanand 3674ec4e545SJayanth Dodderi Chidanand /* FEAT_SCTLR2 */ 3684ec4e545SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_sctlr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_SCTLR2_SHIFT, 3694ec4e545SJayanth Dodderi Chidanand ID_AA64MMFR3_EL1_SCTLR2_MASK, SCTLR2_IMPLEMENTED, 370*d508bab3SArvind Ram Prakash ENABLE_FEAT_SCTLR2, 371*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 3724ec4e545SJayanth Dodderi Chidanand 37330655136SGovindraj Raja /* FEAT_D128 */ 37430655136SGovindraj Raja CREATE_FEATURE_FUNCS(feat_d128, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_D128_SHIFT, 37530655136SGovindraj Raja ID_AA64MMFR3_EL1_D128_MASK, D128_IMPLEMENTED, 376*d508bab3SArvind Ram Prakash ENABLE_FEAT_D128, FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 37730655136SGovindraj Raja 37809a4bcb8SGirish Pathak /* FEAT_RME_GPC2 */ 37909a4bcb8SGirish Pathak CREATE_FEATURE_PRESENT(feat_rme_gpc2, id_aa64pfr0_el1, 38009a4bcb8SGirish Pathak ID_AA64PFR0_FEAT_RME_SHIFT, ID_AA64PFR0_FEAT_RME_MASK, 38109a4bcb8SGirish Pathak RME_GPC2_IMPLEMENTED) 38209a4bcb8SGirish Pathak 3835e827bf0STimothy Hayes /* FEAT_RME_GDI */ 3845e827bf0STimothy Hayes CREATE_FEATURE_FUNCS(feat_rme_gdi, id_aa64mmfr4_el1, 3855e827bf0STimothy Hayes ID_AA64MMFR4_EL1_RME_GDI_SHIFT, 3865e827bf0STimothy Hayes ID_AA64MMFR4_EL1_RME_GDI_MASK, RME_GDI_IMPLEMENTED, 3875e827bf0STimothy Hayes ENABLE_FEAT_RME_GDI) 3885e827bf0STimothy Hayes 389a57e18e4SArvind Ram Prakash /* FEAT_FPMR */ 390a57e18e4SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fpmr, id_aa64pfr2_el1, ID_AA64PFR2_EL1_FPMR_SHIFT, 391a57e18e4SArvind Ram Prakash ID_AA64PFR2_EL1_FPMR_MASK, FPMR_IMPLEMENTED, 392*d508bab3SArvind Ram Prakash ENABLE_FEAT_FPMR, FEAT_ENABLE_NS) 3936b8df7b9SArvind Ram Prakash /* FEAT_MOPS */ 3946b8df7b9SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_mops, id_aa64isar2_el1, ID_AA64ISAR2_EL1_MOPS_SHIFT, 3956b8df7b9SArvind Ram Prakash ID_AA64ISAR2_EL1_MOPS_MASK, MOPS_IMPLEMENTED, 396*d508bab3SArvind Ram Prakash ENABLE_FEAT_MOPS, FEAT_ENABLE_ALL_WORLDS) 397a57e18e4SArvind Ram Prakash 3980dfa07b6SOlivier Deprez __attribute__((always_inline)) 399062b6c6bSMark Brown static inline bool is_feat_sxpie_supported(void) 400062b6c6bSMark Brown { 401062b6c6bSMark Brown return is_feat_s1pie_supported() || is_feat_s2pie_supported(); 402062b6c6bSMark Brown } 403062b6c6bSMark Brown 404a8d5d3d5SAndre Przywara /* FEAT_GCS: Guarded Control Stack */ 405a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_gcs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_GCS_SHIFT, 406*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_GCS_MASK, 1U, ENABLE_FEAT_GCS, 407*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 408688ab57bSMark Brown 409a8d5d3d5SAndre Przywara /* FEAT_AMU: Activity Monitors Extension */ 410a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_amu, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT, 411*d508bab3SArvind Ram Prakash ID_AA64PFR0_AMU_MASK, 1U, ENABLE_FEAT_AMU, 412*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 413aaaf2cc3SSona Mathew 41483ec7e45SBoyan Karatotev /* Auxiliary counters for FEAT_AMU */ 41583ec7e45SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_amu_aux, amcfgr_el0, AMCFGR_EL0_NCG_SHIFT, 41683ec7e45SBoyan Karatotev AMCFGR_EL0_NCG_MASK, 1U, ENABLE_AMU_AUXILIARY_COUNTERS) 41783ec7e45SBoyan Karatotev 418aaaf2cc3SSona Mathew /* FEAT_AMUV1P1: AMU Extension v1.1 */ 419aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_amuv1p1, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT, 420*d508bab3SArvind Ram Prakash ID_AA64PFR0_AMU_MASK, ID_AA64PFR0_AMU_V1P1, ENABLE_FEAT_AMUv1p1, 421*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 422873d4241Sjohpow01 423dbcc44a1SAlexei Fedorov /* 424dbcc44a1SAlexei Fedorov * Return MPAM version: 425dbcc44a1SAlexei Fedorov * 426dbcc44a1SAlexei Fedorov * 0x00: None Armv8.0 or later 427dbcc44a1SAlexei Fedorov * 0x01: v0.1 Armv8.4 or later 428dbcc44a1SAlexei Fedorov * 0x10: v1.0 Armv8.2 or later 429dbcc44a1SAlexei Fedorov * 0x11: v1.1 Armv8.4 or later 430dbcc44a1SAlexei Fedorov * 431dbcc44a1SAlexei Fedorov */ 4320dfa07b6SOlivier Deprez __attribute__((always_inline)) 433aaaf2cc3SSona Mathew static inline bool is_feat_mpam_present(void) 434dbcc44a1SAlexei Fedorov { 435aaaf2cc3SSona Mathew unsigned int ret = (unsigned int)((((read_id_aa64pfr0_el1() >> 436dbcc44a1SAlexei Fedorov ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) | 437aaaf2cc3SSona Mathew ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_MPAM_FRAC_SHIFT) 438aaaf2cc3SSona Mathew & ID_AA64PFR1_MPAM_FRAC_MASK)); 439aaaf2cc3SSona Mathew return ret; 440dbcc44a1SAlexei Fedorov } 441dbcc44a1SAlexei Fedorov 442aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mpam, is_feat_mpam_present, ENABLE_FEAT_MPAM) 4439448f2b8SAndre Przywara 444c42aefd3SArvind Ram Prakash 445c42aefd3SArvind Ram Prakash 446c42aefd3SArvind Ram Prakash /* FEAT_MPAM_PE_BW_CTRL: MPAM PE-side bandwidth controls */ 447c42aefd3SArvind Ram Prakash __attribute__((always_inline)) 448c42aefd3SArvind Ram Prakash static inline bool is_feat_mpam_pe_bw_ctrl_present(void) 449c42aefd3SArvind Ram Prakash { 450c42aefd3SArvind Ram Prakash if (is_feat_mpam_present()) { 451c42aefd3SArvind Ram Prakash return ((unsigned long long)(read_mpamidr_el1() & 452c42aefd3SArvind Ram Prakash MPAMIDR_HAS_BW_CTRL_BIT) != 0U); 453c42aefd3SArvind Ram Prakash } 454c42aefd3SArvind Ram Prakash return false; 455c42aefd3SArvind Ram Prakash } 456c42aefd3SArvind Ram Prakash 457c42aefd3SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_mpam_pe_bw_ctrl, is_feat_mpam_pe_bw_ctrl_present, 458c42aefd3SArvind Ram Prakash ENABLE_FEAT_MPAM_PE_BW_CTRL) 459c42aefd3SArvind Ram Prakash 46083271d5aSArvind Ram Prakash /* 46183271d5aSArvind Ram Prakash * FEAT_DebugV8P9: Debug extension. This function checks the field 3:0 of 46283271d5aSArvind Ram Prakash * ID_AA64DFR0 Aarch64 Debug Feature Register 0 for the version of 46383271d5aSArvind Ram Prakash * Feat_Debug supported. The value of the field determines feature presence 46483271d5aSArvind Ram Prakash * 46583271d5aSArvind Ram Prakash * 0b0110 - Arm v8.0 debug 46683271d5aSArvind Ram Prakash * 0b0111 - Arm v8.0 debug architecture with Virtualization host extensions 46783271d5aSArvind Ram Prakash * 0x1000 - FEAT_Debugv8p2 is supported 46883271d5aSArvind Ram Prakash * 0x1001 - FEAT_Debugv8p4 is supported 46983271d5aSArvind Ram Prakash * 0x1010 - FEAT_Debugv8p8 is supported 47083271d5aSArvind Ram Prakash * 0x1011 - FEAT_Debugv8p9 is supported 47183271d5aSArvind Ram Prakash * 47283271d5aSArvind Ram Prakash */ 47383271d5aSArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_debugv8p9, id_aa64dfr0_el1, ID_AA64DFR0_DEBUGVER_SHIFT, 47483271d5aSArvind Ram Prakash ID_AA64DFR0_DEBUGVER_MASK, DEBUGVER_V8P9_IMPLEMENTED, 475*d508bab3SArvind Ram Prakash ENABLE_FEAT_DEBUGV8P9, FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 47683271d5aSArvind Ram Prakash 477a8d5d3d5SAndre Przywara /* FEAT_HCX: Extended Hypervisor Configuration Register */ 478a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_hcx, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_HCX_SHIFT, 479*d508bab3SArvind Ram Prakash ID_AA64MMFR1_EL1_HCX_MASK, 1U, ENABLE_FEAT_HCX, 480*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 481cb4ec47bSjohpow01 482aaaf2cc3SSona Mathew /* FEAT_RNG_TRAP: Trapping support */ 48379c0c7faSBoyan Karatotev CREATE_FEATURE_FUNCS(feat_rng_trap, id_aa64pfr1_el1, ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT, 484*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_RNDR_TRAP_MASK, RNG_TRAP_IMPLEMENTED, ENABLE_FEAT_RNG_TRAP, 485*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 486ff86e0b4SJuan Pablo Conde 487aaaf2cc3SSona Mathew /* Return the RME version, zero if not supported. */ 488aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_rme, id_aa64pfr0_el1, ID_AA64PFR0_FEAT_RME_SHIFT, 489aaaf2cc3SSona Mathew ID_AA64PFR0_FEAT_RME_MASK, 1U, ENABLE_RME) 49081c272b3SZelalem Aweke 491aaaf2cc3SSona Mathew /* FEAT_SB: Speculation barrier instruction */ 492aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sb, id_aa64isar1_el1, ID_AA64ISAR1_SB_SHIFT, 493aaaf2cc3SSona Mathew ID_AA64ISAR1_SB_MASK, 1U) 4946a0da736SJayanth Dodderi Chidanand 4957e84f3cfSTushar Khandelwal /* FEAT_MEC: Memory Encryption Contexts */ 4967e84f3cfSTushar Khandelwal CREATE_FEATURE_FUNCS(feat_mec, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_MEC_SHIFT, 497*d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_MEC_MASK, 1U, ENABLE_FEAT_MEC, 498*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 4997e84f3cfSTushar Khandelwal 50030019d86SSona Mathew /* 50130019d86SSona Mathew * FEAT_CSV2: Cache Speculation Variant 2. This checks bit fields[56-59] 50230019d86SSona Mathew * of id_aa64pfr0_el1 register and can be used to check for below features: 50330019d86SSona Mathew * FEAT_CSV2_2: Cache Speculation Variant CSV2_2. 50430019d86SSona Mathew * FEAT_CSV2_3: Cache Speculation Variant CSV2_3. 50530019d86SSona Mathew * 0b0000 - Feature FEAT_CSV2 is not implemented. 50630019d86SSona Mathew * 0b0001 - Feature FEAT_CSV2 is implemented, but FEAT_CSV2_2 and FEAT_CSV2_3 50730019d86SSona Mathew * are not implemented. 50830019d86SSona Mathew * 0b0010 - Feature FEAT_CSV2_2 is implemented but FEAT_CSV2_3 is not 50930019d86SSona Mathew * implemented. 51030019d86SSona Mathew * 0b0011 - Feature FEAT_CSV2_3 is implemented. 51130019d86SSona Mathew */ 51230019d86SSona Mathew 513aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_2, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT, 514*d508bab3SArvind Ram Prakash ID_AA64PFR0_CSV2_MASK, CSV2_2_IMPLEMENTED, ENABLE_FEAT_CSV2_2, 515*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 516aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_3, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT, 517*d508bab3SArvind Ram Prakash ID_AA64PFR0_CSV2_MASK, CSV2_3_IMPLEMENTED, ENABLE_FEAT_CSV2_3, 518*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5197db710f0SAndre Przywara 520a8d5d3d5SAndre Przywara /* FEAT_SPE: Statistical Profiling Extension */ 521a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_spe, id_aa64dfr0_el1, ID_AA64DFR0_PMS_SHIFT, 522*d508bab3SArvind Ram Prakash ID_AA64DFR0_PMS_MASK, 1U, ENABLE_SPE_FOR_NS, 523*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5247db710f0SAndre Przywara 525a8d5d3d5SAndre Przywara /* FEAT_SVE: Scalable Vector Extension */ 526a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sve, id_aa64pfr0_el1, ID_AA64PFR0_SVE_SHIFT, 527*d508bab3SArvind Ram Prakash ID_AA64PFR0_SVE_MASK, 1U, ENABLE_SVE_FOR_NS, 528*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5297db710f0SAndre Przywara 530a8d5d3d5SAndre Przywara /* FEAT_RAS: Reliability, Accessibility, Serviceability */ 531aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ras, id_aa64pfr0_el1, ID_AA64PFR0_RAS_SHIFT, 532*d508bab3SArvind Ram Prakash ID_AA64PFR0_RAS_MASK, 1U, ENABLE_FEAT_RAS, 533*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5346a0da736SJayanth Dodderi Chidanand 535a8d5d3d5SAndre Przywara /* FEAT_DIT: Data Independent Timing instructions */ 536aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_dit, id_aa64pfr0_el1, ID_AA64PFR0_DIT_SHIFT, 537*d508bab3SArvind Ram Prakash ID_AA64PFR0_DIT_MASK, 1U, ENABLE_FEAT_DIT, 538*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5396437a09aSAndre Przywara 540aaaf2cc3SSona Mathew /* FEAT_SYS_REG_TRACE */ 541aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_sys_reg_trace, id_aa64dfr0_el1, ID_AA64DFR0_TRACEVER_SHIFT, 542*d508bab3SArvind Ram Prakash ID_AA64DFR0_TRACEVER_MASK, 1U, ENABLE_SYS_REG_TRACE_FOR_NS, 543*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5446437a09aSAndre Przywara 545a8d5d3d5SAndre Przywara /* FEAT_TRF: TraceFilter */ 546a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_trf, id_aa64dfr0_el1, ID_AA64DFR0_TRACEFILT_SHIFT, 547*d508bab3SArvind Ram Prakash ID_AA64DFR0_TRACEFILT_MASK, 1U, ENABLE_TRF_FOR_NS, 548*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5496437a09aSAndre Przywara 550a8d5d3d5SAndre Przywara /* FEAT_NV2: Enhanced Nested Virtualization */ 551aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_nv2, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_NV_SHIFT, 552*d508bab3SArvind Ram Prakash ID_AA64MMFR2_EL1_NV_MASK, NV2_IMPLEMENTED, CTX_INCLUDE_NEVE_REGS, 553*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 5546a0da736SJayanth Dodderi Chidanand 555a8d5d3d5SAndre Przywara /* FEAT_BRBE: Branch Record Buffer Extension */ 556a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_brbe, id_aa64dfr0_el1, ID_AA64DFR0_BRBE_SHIFT, 557*d508bab3SArvind Ram Prakash ID_AA64DFR0_BRBE_MASK, 1U, ENABLE_BRBE_FOR_NS, 558*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS | FEAT_ENABLE_REALM) 5592b0bc4e0SJayanth Dodderi Chidanand 560a8d5d3d5SAndre Przywara /* FEAT_TRBE: Trace Buffer Extension */ 561a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_trbe, id_aa64dfr0_el1, ID_AA64DFR0_TRACEBUFFER_SHIFT, 562aaaf2cc3SSona Mathew ID_AA64DFR0_TRACEBUFFER_MASK, 1U, ENABLE_TRBE_FOR_NS) 5632b0bc4e0SJayanth Dodderi Chidanand 564aaaf2cc3SSona Mathew /* FEAT_SME_FA64: Full A64 Instruction support in streaming SVE mode */ 565aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sme_fa64, id_aa64smfr0_el1, ID_AA64SMFR0_EL1_SME_FA64_SHIFT, 566aaaf2cc3SSona Mathew ID_AA64SMFR0_EL1_SME_FA64_MASK, 1U) 567aaaf2cc3SSona Mathew 568a8d5d3d5SAndre Przywara /* FEAT_SMEx: Scalar Matrix Extension */ 569a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sme, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT, 570*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_SME_MASK, 1U, ENABLE_SME_FOR_NS, 571*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 572aaaf2cc3SSona Mathew 573aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_sme2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT, 574*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_SME_MASK, SME2_IMPLEMENTED, ENABLE_SME2_FOR_NS, 575*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 57603d3c0d7SJayanth Dodderi Chidanand 57719d52a83SAndre Przywara /* FEAT_LS64_ACCDATA: */ 57819d52a83SAndre Przywara CREATE_FEATURE_FUNCS(feat_ls64_accdata, id_aa64isar1_el1, ID_AA64ISAR1_LS64_SHIFT, 57919d52a83SAndre Przywara ID_AA64ISAR1_LS64_MASK, LS64_ACCDATA_IMPLEMENTED, 580*d508bab3SArvind Ram Prakash ENABLE_FEAT_LS64_ACCDATA, FEAT_ENABLE_ALL_WORLDS) 58119d52a83SAndre Przywara 582cc2523bbSAndre Przywara /* FEAT_AIE: */ 583cc2523bbSAndre Przywara CREATE_FEATURE_FUNCS(feat_aie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_AIE_SHIFT, 584*d508bab3SArvind Ram Prakash ID_AA64MMFR3_EL1_AIE_MASK, 1U, ENABLE_FEAT_AIE, 585*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 586cc2523bbSAndre Przywara 587b3bcfd12SAndre Przywara /* FEAT_PFAR: */ 588b3bcfd12SAndre Przywara CREATE_FEATURE_FUNCS(feat_pfar, id_aa64pfr1_el1, ID_AA64PFR1_EL1_PFAR_SHIFT, 589*d508bab3SArvind Ram Prakash ID_AA64PFR1_EL1_PFAR_MASK, 1U, ENABLE_FEAT_PFAR, 590*d508bab3SArvind Ram Prakash FEAT_ENABLE_NS) 591b3bcfd12SAndre Przywara 592bff074ddSJavier Almansa Sobrino /******************************************************************************* 593bff074ddSJavier Almansa Sobrino * Function to get hardware granularity support 594bff074ddSJavier Almansa Sobrino ******************************************************************************/ 595bff074ddSJavier Almansa Sobrino 5960dfa07b6SOlivier Deprez __attribute__((always_inline)) 597aaaf2cc3SSona Mathew static inline bool is_feat_tgran4K_present(void) 598bff074ddSJavier Almansa Sobrino { 599aaaf2cc3SSona Mathew unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(), 600aaaf2cc3SSona Mathew ID_AA64MMFR0_EL1_TGRAN4_SHIFT, ID_REG_FIELD_MASK); 601aaaf2cc3SSona Mathew return (tgranx < 8U); 602bff074ddSJavier Almansa Sobrino } 603bff074ddSJavier Almansa Sobrino 604aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_tgran16K, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_TGRAN16_SHIFT, 605aaaf2cc3SSona Mathew ID_AA64MMFR0_EL1_TGRAN16_MASK, TGRAN16_IMPLEMENTED) 606aaaf2cc3SSona Mathew 6070dfa07b6SOlivier Deprez __attribute__((always_inline)) 608aaaf2cc3SSona Mathew static inline bool is_feat_tgran64K_present(void) 609bff074ddSJavier Almansa Sobrino { 610aaaf2cc3SSona Mathew unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(), 611aaaf2cc3SSona Mathew ID_AA64MMFR0_EL1_TGRAN64_SHIFT, ID_REG_FIELD_MASK); 612aaaf2cc3SSona Mathew return (tgranx < 8U); 613bff074ddSJavier Almansa Sobrino } 614bff074ddSJavier Almansa Sobrino 615aaaf2cc3SSona Mathew /* FEAT_PMUV3 */ 616aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_pmuv3, id_aa64dfr0_el1, ID_AA64DFR0_PMUVER_SHIFT, 617aaaf2cc3SSona Mathew ID_AA64DFR0_PMUVER_MASK, 1U) 618aaaf2cc3SSona Mathew 619aaaf2cc3SSona Mathew /* FEAT_MTPMU */ 6200dfa07b6SOlivier Deprez __attribute__((always_inline)) 621aaaf2cc3SSona Mathew static inline bool is_feat_mtpmu_present(void) 622bff074ddSJavier Almansa Sobrino { 623aaaf2cc3SSona Mathew unsigned int mtpmu = ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_MTPMU_SHIFT, 624aaaf2cc3SSona Mathew ID_AA64DFR0_MTPMU_MASK); 6259e51f15eSSona Mathew return (mtpmu != 0U) && (mtpmu != MTPMU_NOT_IMPLEMENTED); 62683a4dae1SBoyan Karatotev } 62783a4dae1SBoyan Karatotev 628aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mtpmu, is_feat_mtpmu_present, DISABLE_MTPMU) 629aaaf2cc3SSona Mathew 6308cef63d6SBoyan Karatotev /************************************************************************* 6318cef63d6SBoyan Karatotev * Function to identify the presence of FEAT_GCIE (GICv5 CPU interface 6328cef63d6SBoyan Karatotev * extension). 6338cef63d6SBoyan Karatotev ************************************************************************/ 6348cef63d6SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_gcie, id_aa64pfr2_el1, ID_AA64PFR2_EL1_GCIE_SHIFT, 635*d508bab3SArvind Ram Prakash ID_AA64PFR2_EL1_GCIE_MASK, 1U, ENABLE_FEAT_GCIE, 636*d508bab3SArvind Ram Prakash FEAT_ENABLE_ALL_WORLDS) 6378cef63d6SBoyan Karatotev 638a1032bebSJohn Powell CREATE_FEATURE_FUNCS(feat_cpa2, id_aa64isar3_el1, ID_AA64ISAR3_EL1_CPA_SHIFT, 639a1032bebSJohn Powell ID_AA64ISAR3_EL1_CPA_MASK, CPA2_IMPLEMENTED, 640*d508bab3SArvind Ram Prakash ENABLE_FEAT_CPA2, FEAT_ENABLE_ALL_WORLDS) 641a1032bebSJohn Powell 6422559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */ 643