feat(rmm): modify rmi_realm_params structure

This patch modifies rmi_realm_params structure
according to definition of RmiRealmParams in
RMM Specification 1.0-eac1.

Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
Change-Id: I63c3097290004de90cd2222b24419aef517d9b49
diff --git a/include/lib/utils_def.h b/include/lib/utils_def.h
index 8a54e60..0013d19 100644
--- a/include/lib/utils_def.h
+++ b/include/lib/utils_def.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2022, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2023, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
diff --git a/include/runtime_services/host_realm_managment/host_realm_rmi.h b/include/runtime_services/host_realm_managment/host_realm_rmi.h
index a208833..cdd21f0 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -195,15 +195,27 @@
 #define MAX_REC_AUX_GRANULES		16U
 #define REC_PARAMS_AUX_GRANULES		16U
 #define REC_EXIT_NR_GPRS		31U
+
 /* Size of Realm Personalization Value */
 #define RPV_SIZE			64U
+
 /* RmiDisposeResponse types */
 #define RMI_DISPOSE_ACCEPT		0U
 #define RMI_DISPOSE_REJECT		1U
 
-/* RmiFeatureLpa2 types */
-#define RMI_NO_LPA2			0U
-#define RMI_LPA2			1U
+/* RmiFeature enumerations */
+#define RMI_FEATURE_FALSE		0U
+#define RMI_FEATURE_TRUE		1U
+
+/* RmiRealmFlags format */
+#define RMI_REALM_FLAGS_LPA2_SHIFT	0UL
+#define RMI_REALM_FLAGS_LPA2_WIDTH	1UL
+	
+#define RMI_REALM_FLAGS_SVE_SHIFT	1UL
+#define RMI_REALM_FLAGS_SVE_WIDTH	1UL
+	
+#define RMI_REALM_FLAGS_PMU_SHIFT	2UL
+#define RMI_REALM_FLAGS_PMU_WIDTH	1UL
 
 /* RmiInterfaceVersion type */
 #define RMI_MAJOR_VERSION		0U
@@ -241,25 +253,21 @@
 #define RMI_TABLE			3U
 #define RMI_VALID_NS			4U
 
-#define RMI_FEATURE_REGISTER_0_S2SZ		GENMASK(7, 0)
-#define RMI_FEATURE_REGISTER_0_LPA2		BIT(8)
-#define RMI_FEATURE_REGISTER_0_SVE_EN_SHIFT	UL(9)
-#define RMI_FEATURE_REGISTER_0_SVE_EN_WIDTH	UL(1)
-#define RMI_FEATURE_REGISTER_0_SVE_VL_SHIFT	UL(10)
-#define RMI_FEATURE_REGISTER_0_SVE_VL_WIDTH	UL(4)
-#define RMI_FEATURE_REGISTER_0_NUM_BPS		GENMASK(17, 14)
-#define RMI_FEATURE_REGISTER_0_NUM_WPS		GENMASK(21, 18)
-#define RMI_FEATURE_REGISTER_0_PMU_EN		BIT(22)
-#define RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS	GENMASK(27, 23)
-#define RMI_FEATURE_REGISTER_0_HASH_SHA_256	BIT(28)
-#define RMI_FEATURE_REGISTER_0_HASH_SHA_512	BIT(29)
-
-#define	RMM_FEATURE_MIN_IPA_SIZE		32U
-#define RMM_FEATURE_REGISTER_0_INDEX		0UL
-#define RMM_FEATURE_REGISTER_0_S2SZ_SHIFT	0UL
-#define RMM_FEATURE_REGISTER_0_S2SZ_WIDTH	8UL
-#define RMM_FEATURE_REGISTER_0_LPA2_SHIFT	8UL
-#define RMM_FEATURE_REGISTER_0_LPA2_WIDTH	1UL
+#define RMI_FEATURE_REGISTER_0_S2SZ_SHIFT		0UL
+#define RMI_FEATURE_REGISTER_0_S2SZ_WIDTH		8UL
+#define RMI_FEATURE_REGISTER_0_LPA2			BIT(8)
+#define RMI_FEATURE_REGISTER_0_SVE_EN			BIT(9)
+#define RMI_FEATURE_REGISTER_0_SVE_VL_SHIFT		10UL
+#define RMI_FEATURE_REGISTER_0_SVE_VL_WIDTH		4UL
+#define RMI_FEATURE_REGISTER_0_NUM_BPS_SHIFT		14UL
+#define RMI_FEATURE_REGISTER_0_NUM_BPS_WIDTH		4UL
+#define RMI_FEATURE_REGISTER_0_NUM_WPS_SHIFT		18UL
+#define RMI_FEATURE_REGISTER_0_NUM_WPS_WIDTH		4UL
+#define RMI_FEATURE_REGISTER_0_PMU_EN			BIT(22)
+#define RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS_SHIFT	23UL
+#define RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS_WIDTH	5UL
+#define RMI_FEATURE_REGISTER_0_HASH_SHA_256		BIT(28)
+#define RMI_FEATURE_REGISTER_0_HASH_SHA_512		BIT(29)
 
 /* RmiStatusCode types */
 /*
@@ -327,10 +335,20 @@
  * either by the Host or by the Realm.
  */
 struct rmi_realm_params {
-	/* Realm feature register 0 */
-	SET_MEMBER(u_register_t features_0, 0, 0x100);		/* Offset 0 */
+	/* Flags */
+	SET_MEMBER(unsigned long flags, 0, 0x8);		/* Offset 0 */
+	/* Requested IPA width */
+	SET_MEMBER(unsigned int s2sz, 0x8, 0x10);		/* 0x8 */
+	/* Requested SVE vector length */
+	SET_MEMBER(unsigned int sve_vl, 0x10, 0x18);		/* 0x10 */
+	/* Requested number of breakpoints */
+	SET_MEMBER(unsigned int num_bps, 0x18, 0x20);		/* 0x18 */
+	/* Requested number of watchpoints */
+	SET_MEMBER(unsigned int num_wps, 0x20, 0x28);		/* 0x20 */
+	/* Requested number of PMU counters */
+	SET_MEMBER(unsigned int pmu_num_ctrs, 0x28, 0x30);	/* 0x28 */
 	/* Measurement algorithm */
-	SET_MEMBER(unsigned char hash_algo, 0x100, 0x400);	/* 0x100 */
+	SET_MEMBER(unsigned char hash_algo, 0x30, 0x400);	/* 0x30 */
 	/* Realm Personalization Value */
 	SET_MEMBER(unsigned char rpv[RPV_SIZE], 0x400, 0x800);	/* 0x400 */
 	SET_MEMBER(struct {
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
index f535e11..79020df 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
@@ -222,18 +222,18 @@
 	if ((feature_flag & RMI_FEATURE_REGISTER_0_PMU_EN) == 0UL) {
 		realm.rmm_feat_reg0 &=
 			~(RMI_FEATURE_REGISTER_0_PMU_EN |
-			  RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS);
+			  MASK(RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS));
 	}
 
 	/* Set SVE bits from feature_flag */
-	realm.rmm_feat_reg0 &= ~(MASK(RMI_FEATURE_REGISTER_0_SVE_EN) |
+	realm.rmm_feat_reg0 &= ~(RMI_FEATURE_REGISTER_0_SVE_EN |
 				 MASK(RMI_FEATURE_REGISTER_0_SVE_VL));
-	realm.rmm_feat_reg0 |= INPLACE(RMI_FEATURE_REGISTER_0_SVE_EN,
-				       EXTRACT(RMI_FEATURE_REGISTER_0_SVE_EN,
-					       feature_flag));
-	realm.rmm_feat_reg0 |= INPLACE(RMI_FEATURE_REGISTER_0_SVE_VL,
+	if ((feature_flag & RMI_FEATURE_REGISTER_0_SVE_EN) != 0UL) {
+		realm.rmm_feat_reg0 |= RMI_FEATURE_REGISTER_0_SVE_EN |
+				       INPLACE(RMI_FEATURE_REGISTER_0_SVE_VL,
 				       EXTRACT(RMI_FEATURE_REGISTER_0_SVE_VL,
-					       feature_flag));
+						feature_flag));
+	}
 
 	/* Create Realm */
 	if (host_realm_create(&realm) != REALM_SUCCESS) {
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
index eebb873..f92428d 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
@@ -461,7 +461,7 @@
 	u_register_t ret = 0UL;
 	u_register_t phys = ns_pa;
 	u_register_t map_addr = ns_pa |
-			(1UL << (EXTRACT(RMM_FEATURE_REGISTER_0_S2SZ,
+			(1UL << (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
 			realm->rmm_feat_reg0) - 1UL)) ;
 
 	if (!IS_ALIGNED(map_addr, map_size)) {
@@ -710,12 +710,31 @@
 	}
 
 	/* Populate params */
-	params->features_0 = realm->rmm_feat_reg0;
+	params->s2sz = EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
+				realm->rmm_feat_reg0);
+	params->sve_vl = EXTRACT(RMI_FEATURE_REGISTER_0_SVE_VL,
+				realm->rmm_feat_reg0);
+	params->num_bps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_BPS,
+				realm->rmm_feat_reg0);
+	params->num_wps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_WPS,
+				realm->rmm_feat_reg0);
+
+	/* PMU enable and number of event counters */
+	if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_PMU_EN) != 0UL) {
+		params->flags = INPLACE(RMI_REALM_FLAGS_PMU, RMI_FEATURE_TRUE);
+		params->pmu_num_ctrs = EXTRACT(
+					RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS,
+					realm->rmm_feat_reg0);
+	} else {
+		params->flags = INPLACE(RMI_REALM_FLAGS_PMU, RMI_FEATURE_FALSE);
+		params->pmu_num_ctrs = 0U;
+	}
+
+	params->hash_algo = RMI_HASH_SHA_256;
+	params->vmid = vmid++;
+	params->rtt_base = realm->rtt_addr;
 	params->rtt_level_start = 0L;
 	params->rtt_num_start = 1U;
-	params->rtt_base = realm->rtt_addr;
-	params->vmid = vmid++;
-	params->hash_algo = RMI_HASH_SHA_256;
 
 	/* Create Realm */
 	ret = host_rmi_realm_create(realm->rd, (u_register_t)params);
@@ -844,7 +863,7 @@
 	u_register_t ret;
 
 	realm->ipa_ns_buffer = ns_shared_mem_adr |
-			(1UL << (EXTRACT(RMM_FEATURE_REGISTER_0_S2SZ,
+			(1UL << (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
 			realm->rmm_feat_reg0) - 1));
 	realm->ns_buffer_size = ns_shared_mem_size;
 	/* MAP SHARED_NS region */
@@ -1051,7 +1070,7 @@
 	 * commands.
 	 */
 	if (host_realm_tear_down_rtt_range(realm, 0UL, 0UL,
-				(1UL << (EXTRACT(RMM_FEATURE_REGISTER_0_S2SZ,
+				(1UL << (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
 				realm->rmm_feat_reg0) - 1))) != RMI_SUCCESS) {
 		ERROR("host_realm_tear_down_rtt_range() line=%u\n", __LINE__);
 		return REALM_ERROR;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_sve_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_sve_tests.c
index 7c8e383..3bde128 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_sve_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_sve_tests.c
@@ -37,7 +37,7 @@
 		}								\
 										\
 		/* SVE not supported in RMI features? */			\
-		if (EXTRACT(RMI_FEATURE_REGISTER_0_SVE_EN, _reg0) == 0UL) {	\
+		if ((_reg0 & RMI_FEATURE_REGISTER_0_SVE_EN) == 0UL) {		\
 			ERROR("SVE not in RMI features, skipping\n");		\
 			return TEST_RESULT_SKIPPED;				\
 		}								\
@@ -47,11 +47,11 @@
 {
 	u_register_t rmi_feat_reg0;
 
-	if (sve_en == true) {
-		rmi_feat_reg0 = INPLACE(RMI_FEATURE_REGISTER_0_SVE_EN, true);
-		rmi_feat_reg0 |= INPLACE(RMI_FEATURE_REGISTER_0_SVE_VL, sve_vq);
+	if (sve_en) {
+		rmi_feat_reg0 = RMI_FEATURE_REGISTER_0_SVE_EN |
+				INPLACE(RMI_FEATURE_REGISTER_0_SVE_VL, sve_vq);
 	} else {
-		rmi_feat_reg0 = INPLACE(RMI_FEATURE_REGISTER_0_SVE_EN, false);
+		rmi_feat_reg0 = 0UL;
 	}
 
 	/* Initialise Realm payload */