Merge changes I5a64f51b,I89a45bec
* changes:
feat(smccc): availability test: add FEAT_AIE and FEAT_PFAR checks
fix(spe): turn assert into warning for newer SPE versions
diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h
index e408afa..72cd009 100644
--- a/include/lib/aarch64/arch.h
+++ b/include/lib/aarch64/arch.h
@@ -482,12 +482,22 @@
#define ID_AA64MMFR3_EL1_TCRX_WIDTH U(4)
#define ID_AA64MMFR3_EL1_TCR2_SUPPORTED ULL(0x1)
-#define ID_AA64MMFR3_EL1_MEC_SHIFT U(28)
-#define ID_AA64MMFR3_EL1_MEC_MASK ULL(0xf)
+#define ID_AA64MMFR3_EL1_AIE_SHIFT U(24)
+#define ID_AA64MMFR3_EL1_AIE_MASK ULL(0xf)
+#define ID_AA64MMFR3_EL1_AIE_WIDTH U(4)
+#define ID_AA64MMFR3_EL1_AIE_SUPPORTED ULL(0x1)
+
+#define ID_AA64MMFR3_EL1_MEC_SHIFT U(28)
+#define ID_AA64MMFR3_EL1_MEC_MASK ULL(0xf)
#define ID_AA64MMFR3_EL1_MEC_WIDTH U(4)
#define ID_AA64MMFR3_EL1_MEC_SUPPORTED ULL(0x1)
/* ID_AA64PFR1_EL1 definitions */
+#define ID_AA64PFR1_EL1_PFAR_SHIFT U(60)
+#define ID_AA64PFR1_EL1_PFAR_MASK ULL(0xf)
+#define ID_AA64PFR1_EL1_PFAR_WIDTH U(4)
+#define ID_AA64PFR1_EL1_PFAR_SUPPORTED ULL(1)
+
#define ID_AA64PFR1_EL1_DF2_SHIFT U(56)
#define ID_AA64PFR1_EL1_DF2_WIDTH U(4)
#define ID_AA64PFR1_EL1_DF2_MASK (0xf << ID_AA64PFR1_EL1_DF2_SHIFT)
diff --git a/include/lib/aarch64/arch_features.h b/include/lib/aarch64/arch_features.h
index dfc9850..d2b71ef 100644
--- a/include/lib/aarch64/arch_features.h
+++ b/include/lib/aarch64/arch_features.h
@@ -596,6 +596,18 @@
== ID_AA64MMFR3_EL1_MEC_SUPPORTED;
}
+static inline bool is_feat_aie_supported(void)
+{
+ return EXTRACT(ID_AA64MMFR3_EL1_AIE, read_id_aa64mmfr3_el1())
+ == ID_AA64MMFR3_EL1_AIE_SUPPORTED;
+}
+
+static inline bool is_feat_pfar_supported(void)
+{
+ return EXTRACT(ID_AA64PFR1_EL1_PFAR, read_id_aa64pfr1_el1())
+ == ID_AA64PFR1_EL1_PFAR_SUPPORTED;
+}
+
static inline bool is_feat_gic_supported(void)
{
return EXTRACT(ID_AA64PFR0_GIC, read_id_aa64pfr0_el1())
diff --git a/tftf/tests/extensions/spe/test_spe.c b/tftf/tests/extensions/spe/test_spe.c
index d0d89ef..9fbb45e 100644
--- a/tftf/tests/extensions/spe/test_spe.c
+++ b/tftf/tests/extensions/spe/test_spe.c
@@ -14,7 +14,9 @@
#ifdef __aarch64__
unsigned int spe_ver = spe_get_version();
- assert(spe_ver <= ID_AA64DFR0_SPE_V1P4);
+ if (spe_ver > ID_AA64DFR0_SPE_V1P4) {
+ WARN("Detected SPE version %d, please update test.\n", spe_ver);
+ }
if (spe_ver == ID_AA64DFR0_SPE_NOT_SUPPORTED) {
return TEST_RESULT_SKIPPED;
diff --git a/tftf/tests/runtime_services/arm_arch_svc/smccc_feature_availability.c b/tftf/tests/runtime_services/arm_arch_svc/smccc_feature_availability.c
index c897f87..f827522 100644
--- a/tftf/tests/runtime_services/arm_arch_svc/smccc_feature_availability.c
+++ b/tftf/tests/runtime_services/arm_arch_svc/smccc_feature_availability.c
@@ -93,6 +93,8 @@
CHECK_BIT_SET(is_feat_csv2_2_present, SCR_EnSCXT_BIT);
CHECK_BIT_SET(is_armv8_3_pauth_present, SCR_APK_BIT);
CHECK_BIT_SET(is_feat_ras_present, SCR_TERR_BIT);
+ CHECK_BIT_SET(is_feat_aie_supported, SCR_AIEn_BIT);
+ CHECK_BIT_SET(is_feat_pfar_supported, SCR_PFAREn_BIT);
CHECK_NO_BITS_SET(SCR_EL3);
reg = get_feature_for_reg(CPTR_EL3_OPCODE);