feat(realm): assign MECID when creating realms
This change allows TFTF to assign a MECID to every realm that is
created by passing an extra parameter to the Realm creation helpers.
Signed-off-by: Juan Pablo Conde <juanpablo.conde@arm.com>
Change-Id: I89bf08011eb005d949a195b406b073955f23f5ad
diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h
index 2a9d0d2..f460016 100644
--- a/include/lib/aarch64/arch.h
+++ b/include/lib/aarch64/arch.h
@@ -483,6 +483,11 @@
#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_MEC_WIDTH U(4)
+#define ID_AA64MMFR3_EL1_MEC_SUPPORTED ULL(0x1)
+
/* ID_AA64PFR1_EL1 definitions */
#define ID_AA64PFR1_EL1_DF2_SHIFT U(56)
#define ID_AA64PFR1_EL1_DF2_WIDTH U(4)
@@ -1825,4 +1830,10 @@
/* RNDRRS definition */
#define RNDRRS S3_3_C2_C4_1
+/* MEC Registers */
+#define MECIDR_EL2 S3_4_C10_C8_7
+
+#define MECIDR_EL2_MECIDWidthm1_SHIFT U(0)
+#define MECIDR_EL2_MECIDWidthm1_WIDTH U(4)
+
#endif /* ARCH_H */
diff --git a/include/lib/aarch64/arch_features.h b/include/lib/aarch64/arch_features.h
index 3b4fffc..fc004b3 100644
--- a/include/lib/aarch64/arch_features.h
+++ b/include/lib/aarch64/arch_features.h
@@ -583,4 +583,10 @@
return EXTRACT(ID_AA64DFR0_DOUBLELOCK, read_id_aa64dfr0_el1())
>= DOUBLELOCK_IMPLEMENTED;
}
+
+static inline bool is_feat_mec_supported(void)
+{
+ return EXTRACT(ID_AA64MMFR3_EL1_MEC, read_id_aa64mmfr3_el1())
+ == ID_AA64MMFR3_EL1_MEC_SUPPORTED;
+}
#endif /* ARCH_FEATURES_H */
diff --git a/include/lib/aarch64/arch_helpers.h b/include/lib/aarch64/arch_helpers.h
index f562018..6847ce3 100644
--- a/include/lib/aarch64/arch_helpers.h
+++ b/include/lib/aarch64/arch_helpers.h
@@ -733,6 +733,9 @@
DEFINE_RENAME_SYSREG_RW_FUNCS(tpidr_el2, TPIDR_EL2)
DEFINE_RENAME_SYSREG_RW_FUNCS(vtcr_el2, VTCR_EL2)
+/* Memory Encryption Contexts (MEC) */
+DEFINE_RENAME_SYSREG_READ_FUNC(mecidr_el2, MECIDR_EL2)
+
static inline u_register_t read_sp(void)
{
u_register_t v;