diff --git a/common/feat_detect.c b/common/feat_detect.c index 21dd35d4e..cbbee9771 100644 --- a/common/feat_detect.c +++ b/common/feat_detect.c @@ -346,7 +346,7 @@ void detect_arch_features(void) /* v8.6 features */ read_feat_amuv1p1(); - check_feature(ENABLE_FEAT_FGT, is_armv8_6_fgt_present(), "FGT"); + check_feature(ENABLE_FEAT_FGT, read_feat_fgt_id_field(), "FGT"); read_feat_ecv(); read_feat_twed(); diff --git a/include/arch/aarch64/arch_features.h b/include/arch/aarch64/arch_features.h index 932e8850a..73dfcef26 100644 --- a/include/arch/aarch64/arch_features.h +++ b/include/arch/aarch64/arch_features.h @@ -10,6 +10,7 @@ #include #include +#include static inline bool is_armv7_gentimer_present(void) { @@ -97,10 +98,23 @@ static inline bool is_armv8_6_twed_present(void) ID_AA64MMFR1_EL1_TWED_MASK) == ID_AA64MMFR1_EL1_TWED_SUPPORTED); } -static inline bool is_armv8_6_fgt_present(void) +static unsigned int read_feat_fgt_id_field(void) { - return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) & - ID_AA64MMFR0_EL1_FGT_MASK) != 0U; + return (read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) & + ID_AA64MMFR0_EL1_FGT_MASK; +} + +static inline bool is_feat_fgt_supported(void) +{ + if (ENABLE_FEAT_FGT == FEAT_STATE_DISABLED) { + return false; + } + + if (ENABLE_FEAT_FGT == FEAT_STATE_ALWAYS) { + return true; + } + + return read_feat_fgt_id_field() != 0U; } static inline unsigned long int get_armv8_6_ecv_support(void) diff --git a/lib/el3_runtime/aarch64/context_mgmt.c b/lib/el3_runtime/aarch64/context_mgmt.c index 866ac4154..93d817f20 100644 --- a/lib/el3_runtime/aarch64/context_mgmt.c +++ b/lib/el3_runtime/aarch64/context_mgmt.c @@ -359,7 +359,7 @@ static void setup_context_common(cpu_context_t *ctx, const entry_point_info_t *e && (GET_M32(ep->spsr) == MODE32_hyp))) { scr_el3 |= SCR_HCE_BIT; - if (is_armv8_6_fgt_present()) { + if (is_feat_fgt_supported()) { scr_el3 |= SCR_FGTEN_BIT; }