refactor(lib/arch): add macro to update SIMD related trap fields

Add macro SIMD_ENABLE_CPTR_FLAGS, SIMD_DISABLE_ALL_CPTR_FLAGS to update
SIMD related fields in the value used to write CPTR_EL2 register.

Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
Change-Id: Ib820dd94cc5e294ec3a2f5c269bd473f4441903b
diff --git a/lib/arch/include/arch.h b/lib/arch/include/arch.h
index 8d0ed42..c236e15 100644
--- a/lib/arch/include/arch.h
+++ b/lib/arch/include/arch.h
@@ -780,6 +780,10 @@
 #define CPTR_EL2_VHE_SMEN_TRAP_ALL_00	UL(0x0)
 #define CPTR_EL2_VHE_SMEN_NO_TRAP_11	UL(0x3)
 
+#define CPTR_EL2_VHE_SIMD_MASK		(MASK(CPTR_EL2_VHE_FPEN) |	\
+					 MASK(CPTR_EL2_VHE_ZEN) |	\
+					 MASK(CPTR_EL2_VHE_SMEN))
+
 /* Trap all AMU, trace, FPU, SVE, SME accesses */
 #define CPTR_EL2_VHE_INIT		((CPTR_EL2_VHE_ZEN_TRAP_ALL_00 << \
 					  CPTR_EL2_VHE_ZEN_SHIFT)	| \
diff --git a/lib/arch/include/simd.h b/lib/arch/include/simd.h
index 4b7bb41..c3c7a02 100644
--- a/lib/arch/include/simd.h
+++ b/lib/arch/include/simd.h
@@ -218,6 +218,41 @@
 }
 
 /*
+ * Enable SIMD related flags like FPEN, ZEN, SMEN in 'cptr_val' based on SIMD
+ * configuration.
+ */
+#define SIMD_ENABLE_CPTR_FLAGS(simd_cfg, cptr_val)				\
+	do {									\
+		(cptr_val) &= ~(CPTR_EL2_VHE_SIMD_MASK);			\
+										\
+		(cptr_val) |= INPLACE(CPTR_EL2_VHE_FPEN,			\
+				      CPTR_EL2_VHE_FPEN_NO_TRAP_11);		\
+										\
+		if ((simd_cfg)->sve_en) {					\
+			(cptr_val) |= INPLACE(CPTR_EL2_VHE_ZEN,			\
+					      CPTR_EL2_VHE_ZEN_NO_TRAP_11);	\
+		}								\
+										\
+		if ((simd_cfg)->sme_en) {					\
+			(cptr_val) |= INPLACE(CPTR_EL2_VHE_SMEN,		\
+					      CPTR_EL2_VHE_SMEN_NO_TRAP_11);	\
+		}								\
+	} while (false)
+
+/* Disable all SIMD related flags like FPEN, ZEN, SMEN in 'cptr_val' */
+#define SIMD_DISABLE_ALL_CPTR_FLAGS(cptr_val)					\
+	do {									\
+		(cptr_val) &= ~(CPTR_EL2_VHE_SIMD_MASK);			\
+										\
+		(cptr_val) |= INPLACE(CPTR_EL2_VHE_FPEN,			\
+				      CPTR_EL2_VHE_FPEN_TRAP_ALL_00) |		\
+			      INPLACE(CPTR_EL2_VHE_ZEN,				\
+				      CPTR_EL2_VHE_ZEN_TRAP_ALL_00) |		\
+			      INPLACE(CPTR_EL2_VHE_SMEN,			\
+				      CPTR_EL2_VHE_SMEN_TRAP_ALL_00);		\
+	} while (false)
+
+/*
  * RMM support to use SIMD (FPU) at REL2
  */
 #ifdef RMM_FPU_USE_AT_REL2