refactor(cpufeat): decouple FGT feature detection and build flags

Split the feature check for FEAT_FGT into two parts:
- A boolean function that just evaluates whether the feature is usable.
  This takes build time flags into account, and only evaluates the CPU
  feature ID registers when the flexible FEAT_STATE_CHECK method is
  used.
- A "raw" function that returns the unfiltered CPU feature ID register.

Change the callers where needed, to give them the version they actually
want.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Change-Id: I9a041132d280451f5d9f653a62904f603b2a916d
This commit is contained in:
Andre Przywara 2022-11-10 14:28:01 +00:00
parent b45dd74e3a
commit ce4859554c
3 changed files with 19 additions and 5 deletions

View file

@ -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();

View file

@ -10,6 +10,7 @@
#include <stdbool.h>
#include <arch_helpers.h>
#include <common/feat_detect.h>
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)

View file

@ -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;
}