Merge changes from topic "xlnx_versal_net_intro"

* changes:
  docs(versal-net): add Versal NET documentation
  chore(xilinx): reorganize timer code into common path
  feat(versal-net): introduce platform support
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..e4915cc 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -53,16 +53,16 @@
 #define RMI_GRANULE_UNDELEGATE		SMC64_RMI_FID(U(0x2))
 
 /*
- * arg0 == data address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == data address
  * arg2 == map address
  * arg3 == SRC address
  */
 #define RMI_DATA_CREATE			SMC64_RMI_FID(U(0x3))
 
 /*
- * arg0 == data address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == data address
  * arg2 == map address
  */
 #define RMI_DATA_CREATE_UNKNOWN		SMC64_RMI_FID(U(0x4))
@@ -70,6 +70,11 @@
 /*
  * arg0 == RD address
  * arg1 == map address
+ *
+ * ret1 == Address(PA) of the DATA granule, if ret0 == RMI_SUCCESS.
+ *         Otherwise, undefined.
+ * ret2 == Top of the non-live address region. Only valid
+ *         if ret0 == RMI_SUCCESS or ret0 == (RMI_ERROR_RTT_WALK, x)
  */
 #define RMI_DATA_DESTROY		SMC64_RMI_FID(U(0x5))
 
@@ -80,7 +85,7 @@
 
 /*
  * arg0 == RD address
- * arg1 == struct rmi_realm_params addr
+ * arg1 == struct rmi_realm_params address
  */
 #define RMI_REALM_CREATE		SMC64_RMI_FID(U(0x8))
 
@@ -90,8 +95,8 @@
 #define RMI_REALM_DESTROY		SMC64_RMI_FID(U(0x9))
 
 /*
- * arg0 == REC address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == REC address
  * arg2 == struct rmm_rec address
  */
 #define RMI_REC_CREATE			SMC64_RMI_FID(U(0xA))
@@ -103,23 +108,27 @@
 
 /*
  * arg0 == rec address
- * arg1 == rec_run address
+ * arg1 == struct rec_run address
  */
 #define RMI_REC_ENTER			SMC64_RMI_FID(U(0xC))
 
 /*
- * arg0 == RTT address
- * arg1 == RD address
+ * arg0 == RD address
+ * arg1 == RTT address
  * arg2 == map address
  * arg3 == level
  */
 #define RMI_RTT_CREATE			SMC64_RMI_FID(U(0xD))
 
 /*
- * arg0 == RTT address
- * arg1 == RD address
- * arg2 == map address
- * arg3 == level
+ * arg0 == RD address
+ * arg1 == map address
+ * arg2 == level
+ *
+ * ret1 == Address (PA) of the RTT, if ret0 == RMI_SUCCESS
+ *         Otherwise, undefined.
+ * ret2 == Top of the non-live address region. Only valid
+ *         if ret0 == RMI_SUCCESS or ret0 == (RMI_ERROR_RTT_WALK, x)
  */
 #define RMI_RTT_DESTROY			SMC64_RMI_FID(U(0xE))
 
@@ -161,10 +170,11 @@
 #define RMI_FEATURES			SMC64_RMI_FID(U(0x15))
 
 /*
- * arg0 == RTT address
- * arg1 == RD address
- * arg2 == map address
- * arg3 == level
+ * arg0 == RD address
+ * arg1 == map address
+ * arg2 == level
+ *
+ * ret1 == Address(PA) of the RTT folded, if ret0 == RMI_SUCCESS
  */
 #define RMI_RTT_FOLD			SMC64_RMI_FID(U(0x16))
 
@@ -174,9 +184,9 @@
 #define RMI_REC_AUX_COUNT		SMC64_RMI_FID(U(0x17))
 
 /*
- * arg1 == RD address
- * arg2 == map address
- * arg3 == level
+ * arg0 == RD address
+ * arg1 == map address
+ * arg2 == level
  */
 #define RMI_RTT_INIT_RIPAS		SMC64_RMI_FID(U(0x18))
 
@@ -195,15 +205,22 @@
 #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		BIT(0)
+#define RMI_REALM_FLAGS_SVE		BIT(1)
+#define RMI_REALM_FLAGS_PMU		BIT(2)
 
 /* RmiInterfaceVersion type */
 #define RMI_MAJOR_VERSION		0U
@@ -234,32 +251,50 @@
 #define RMI_NOT_RUNNABLE		0U
 #define RMI_RUNNABLE			1U
 
-/* RttEntryState: represents the state of an RTTE */
-#define RMI_UNASSIGNED			0U
-#define RMI_DESTROYED			1U
-#define RMI_ASSIGNED			2U
-#define RMI_TABLE			3U
-#define RMI_VALID_NS			4U
+/* RmiRttEntryState: represents the state of an RTTE */
+#define RMI_UNASSIGNED			UL(0)
+#define RMI_ASSIGNED			UL(1)
+#define RMI_TABLE			UL(2)
 
-#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)
+/* RmmRipas enumeration representing realm IPA state */
+#define RMI_EMPTY			UL(0)
+#define RMI_RAM				UL(1)
+#define RMI_DESTROYED			UL(2)
 
-#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
+/* RmiPmuOverflowStatus enumeration representing PMU overflow status */
+#define RMI_PMU_OVERFLOW_NOT_ACTIVE	0U
+#define RMI_PMU_OVERFLOW_ACTIVE		1U
+
+/* RmiFeatureRegister0 format */
+#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)
+
+/*
+ * Format of feature_flag[63:32].
+ * Value -1 indicates not set field, and parameter will be set
+ * from the corresponding field of feature register 0.
+ */
+#define FEATURE_SVE_VL_SHIFT				32UL
+#define FEATURE_SVE_VL_WIDTH				8UL
+#define FEATURE_NUM_BPS_SHIFT				40UL
+#define FEATURE_NUM_BPS_WIDTH				8UL
+#define FEATURE_NUM_WPS_SHIFT				48UL
+#define FEATURE_NUM_WPS_WIDTH				8UL
+#define FEATURE_PMU_NUM_CTRS_SHIFT			56UL
+#define FEATURE_PMU_NUM_CTRS_WIDTH			8UL
 
 /* RmiStatusCode types */
 /*
@@ -299,12 +334,6 @@
 	 * index: RTT level at which the walk terminated
 	 */
 	RMI_ERROR_RTT = 4,
-	/*
-	 * An operation cannot be completed because a resource is in use.
-	 *
-	 * index is zero.
-	 */
-	RMI_ERROR_IN_USE = 5,
 	RMI_ERROR_COUNT
 } status_t;
 
@@ -327,10 +356,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 {
@@ -429,12 +468,8 @@
 	}, 0x500, 0x600);
 	/* Host call immediate value */
 	SET_MEMBER(unsigned int imm, 0x600, 0x700);		/* 0x600 */
-	/* PMU overflow */
-	SET_MEMBER(unsigned long pmu_ovf, 0x700, 0x708);	/* 0x700 */
-	/* PMU interrupt enable */
-	SET_MEMBER(unsigned long pmu_intr_en, 0x708, 0x710);	/* 0x708 */
-	/* PMU counter enable */
-	SET_MEMBER(unsigned long pmu_cntr_en, 0x710, 0x800);	/* 0x710 */
+	/* PMU overflow status */
+	SET_MEMBER(unsigned long pmu_ovf_status, 0x700, 0x800);	/* 0x700 */
 };
 
 /*
@@ -451,7 +486,8 @@
 struct rtt_entry {
 	uint64_t walk_level;
 	uint64_t out_addr;
-	int state;
+	u_register_t state;
+	u_register_t ripas;
 };
 
 enum realm_state {
@@ -473,6 +509,10 @@
 	u_register_t ipa_ns_buffer;
 	u_register_t ns_buffer_size;
 	u_register_t aux_pages[REC_PARAMS_AUX_GRANULES];
+	uint8_t      sve_vl;
+	uint8_t      num_bps;
+	uint8_t      num_wps;
+	uint8_t      pmu_num_ctrs;
 	enum realm_state state;
 };
 
@@ -494,8 +534,9 @@
 u_register_t host_realm_rec_create(struct realm *realm);
 u_register_t host_realm_activate(struct realm *realm);
 u_register_t host_realm_destroy(struct realm *realm);
-u_register_t host_realm_rec_enter(struct realm *realm, u_register_t *exit_reason,
-		unsigned int *host_call_result);
+u_register_t host_realm_rec_enter(struct realm *realm,
+					u_register_t *exit_reason,
+					unsigned int *host_call_result);
 u_register_t host_realm_init_ipa_state(struct realm *realm, u_register_t level,
 					u_register_t start, uint64_t end);
 void host_rmi_init_cmp_result(void);
diff --git a/realm/include/realm_rsi.h b/realm/include/realm_rsi.h
index c7ea5a5..e9b6ce8 100644
--- a/realm/include/realm_rsi.h
+++ b/realm/include/realm_rsi.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Arm Limited. All rights reserved.
+ * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
@@ -77,7 +77,7 @@
  * ret1 == Top of modified IPA range
  */
 
-#define RSI_HOST_CALL_NR_GPRS		7U
+#define RSI_HOST_CALL_NR_GPRS		31U
 
 struct rsi_host_call {
 	SET_MEMBER(struct {
@@ -89,7 +89,7 @@
 };
 
 /*
- * arg0 == struct rsi_host_call addr
+ * arg0 == struct rsi_host_call address
  */
 #define RSI_HOST_CALL		SMC_RSI_FID(9U)
 
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..fc18a75 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
@@ -185,6 +185,8 @@
 				u_register_t realm_pages_size,
 				u_register_t feature_flag)
 {
+	int8_t value;
+
 	if (realm_payload_adr == TFTF_BASE) {
 		ERROR("realm_payload_adr should be grater then TFTF_BASE\n");
 		return false;
@@ -220,25 +222,59 @@
 
 	/* Disable PMU if not required */
 	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);
+		realm.rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_PMU_EN;
+		realm.pmu_num_ctrs = 0U;
+	} else {
+		value = EXTRACT(FEATURE_PMU_NUM_CTRS, feature_flag);
+		if (value != -1) {
+			realm.pmu_num_ctrs = (unsigned int)value;
+		} else {
+			realm.pmu_num_ctrs =
+				EXTRACT(RMI_FEATURE_REGISTER_0_PMU_NUM_CTRS,
+					realm.rmm_feat_reg0);
+		}
+	}
+
+	/* Disable SVE if not required */
+	if ((feature_flag & RMI_FEATURE_REGISTER_0_SVE_EN) == 0UL) {
+		realm.rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_SVE_EN;
+		realm.sve_vl = 0U;
+	} else {
+		realm.sve_vl = EXTRACT(FEATURE_SVE_VL, feature_flag);
+	}
+
+	/* Requested number of breakpoints */
+	value = EXTRACT(FEATURE_NUM_BPS, feature_flag);
+	if (value != -1) {
+		realm.num_bps = (unsigned int)value;
+	} else {
+		realm.num_bps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_BPS,
+					realm.rmm_feat_reg0);
+	}
+
+	/* Requested number of watchpoints */
+	value = EXTRACT(FEATURE_NUM_WPS, feature_flag);
+	if (value != -1) {
+		realm.num_wps = (unsigned int)value;
+	} else {
+		realm.num_wps = EXTRACT(RMI_FEATURE_REGISTER_0_NUM_WPS,
+					realm.rmm_feat_reg0);
 	}
 
 	/* 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) {
 		ERROR("%s() failed\n", "host_realm_create");
-		goto destroy_realm;
+		return false;
 	}
 
 	if (host_realm_init_ipa_state(&realm, 0U, 0U, 1ULL << 32)
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..82e92e3 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
@@ -103,96 +103,124 @@
 	return rmi_cmp_result;
 }
 
-static inline u_register_t host_rmi_data_create(bool unknown, u_register_t data,
-			u_register_t rd, u_register_t map_addr, u_register_t src)
+static inline u_register_t host_rmi_data_create(bool unknown,
+						u_register_t rd,
+						u_register_t data,
+						u_register_t map_addr,
+						u_register_t src)
 {
 	if (unknown) {
-		return host_rmi_handler(&(smc_args){RMI_DATA_CREATE_UNKNOWN,
-					data, rd, map_addr}, 4U).ret0;
+		return host_rmi_handler(&(smc_args) {RMI_DATA_CREATE_UNKNOWN,
+					rd, data, map_addr}, 4U).ret0;
 	} else {
-		return host_rmi_handler(&(smc_args){RMI_DATA_CREATE,
+		return host_rmi_handler(&(smc_args) {RMI_DATA_CREATE,
 					/* X5 = flags */
-					data, rd, map_addr, src, 0UL}, 6U).ret0;
+					rd, data, map_addr, src, 0UL}, 6U).ret0;
 	}
 }
 
 static inline u_register_t host_rmi_realm_activate(u_register_t rd)
 {
-	return host_rmi_handler(&(smc_args){RMI_REALM_ACTIVATE, rd}, 2U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_REALM_ACTIVATE, rd}, 2U).ret0;
 }
 
 u_register_t host_rmi_realm_create(u_register_t rd, u_register_t params_ptr)
 {
-	return host_rmi_handler(&(smc_args){RMI_REALM_CREATE,
-				rd, params_ptr}, 3U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_REALM_CREATE, rd, params_ptr},
+						3U).ret0;
 }
 
 u_register_t host_rmi_realm_destroy(u_register_t rd)
 {
-	return host_rmi_handler(&(smc_args){RMI_REALM_DESTROY, rd}, 2U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_REALM_DESTROY, rd}, 2U).ret0;
 }
 
 static inline u_register_t host_rmi_data_destroy(u_register_t rd,
-						 u_register_t map_addr)
+						 u_register_t map_addr,
+						 u_register_t *data,
+						 u_register_t *top)
 {
-	return host_rmi_handler(&(smc_args){RMI_DATA_DESTROY, rd, map_addr},
-				3U).ret0;
+	smc_ret_values rets;
+
+	rets = host_rmi_handler(&(smc_args) {RMI_DATA_DESTROY, rd, map_addr,
+						(u_register_t)&rets}, 4U);
+
+	*data = rets.ret1;
+	*top = rets.ret2;
+	return rets.ret0;
 }
 
-static inline u_register_t host_rmi_rec_create(u_register_t rec,
-						u_register_t rd,
+static inline u_register_t host_rmi_rec_create(u_register_t rd,
+						u_register_t rec,
 						u_register_t params_ptr)
 {
-	return host_rmi_handler(&(smc_args){RMI_REC_CREATE, rec, rd, params_ptr},
-				4U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_REC_CREATE,
+				rd, rec, params_ptr}, 4U).ret0;
 }
 
 static inline u_register_t host_rmi_rec_destroy(u_register_t rec)
 {
-	return host_rmi_handler(&(smc_args){RMI_REC_DESTROY, rec}, 2U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_REC_DESTROY, rec}, 2U).ret0;
 }
 
-static inline u_register_t host_rmi_rtt_create(u_register_t rtt,
-						u_register_t rd,
+static inline u_register_t host_rmi_rtt_create(u_register_t rd,
+						u_register_t rtt,
 						u_register_t map_addr,
 						u_register_t level)
 {
-	return host_rmi_handler(&(smc_args){RMI_RTT_CREATE,
-				rtt, rd, map_addr, level}, 5U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_RTT_CREATE,
+				rd, rtt, map_addr, level}, 5U).ret0;
 }
 
-static inline u_register_t host_rmi_rtt_destroy(u_register_t rtt,
-						u_register_t rd,
+static inline u_register_t host_rmi_rtt_destroy(u_register_t rd,
 						u_register_t map_addr,
-						u_register_t level)
+						u_register_t level,
+						u_register_t *rtt,
+						u_register_t *top)
 {
-	return host_rmi_handler(&(smc_args){RMI_RTT_DESTROY,
-				rtt, rd, map_addr, level}, 5U).ret0;
+	smc_ret_values rets;
+
+	rets = host_rmi_handler(&(smc_args) {RMI_RTT_DESTROY,
+				rd, map_addr, level, (u_register_t)&rets}, 5U);
+	*rtt = rets.ret1;
+	*top = rets.ret2;
+	return rets.ret0;
 }
 
 u_register_t host_rmi_features(u_register_t index, u_register_t *features)
 {
 	smc_ret_values rets;
 
-	rets = host_rmi_handler(&(smc_args){RMI_FEATURES, index}, 2U);
+	rets = host_rmi_handler(&(smc_args) {RMI_FEATURES, index}, 2U);
 	*features = rets.ret1;
 	return rets.ret0;
 }
 
 static inline u_register_t host_rmi_rtt_init_ripas(u_register_t rd,
-						   u_register_t map_addr,
-						   u_register_t level)
+						   u_register_t start,
+						   u_register_t end,
+						   u_register_t *top)
+
 {
-	return host_rmi_handler(&(smc_args){RMI_RTT_INIT_RIPAS,
-					rd, map_addr, level}, 4U).ret0;
+	smc_ret_values rets;
+
+	rets = host_rmi_handler(&(smc_args) {RMI_RTT_INIT_RIPAS,
+				rd, start, end}, 4U);
+	*top = rets.ret1;
+	return rets.ret0;
 }
 
-static inline u_register_t host_rmi_rtt_fold(u_register_t rtt, u_register_t rd,
+static inline u_register_t host_rmi_rtt_fold(u_register_t rd,
 					     u_register_t map_addr,
-					     u_register_t level)
+					     u_register_t level,
+					     u_register_t *pa)
 {
-	return host_rmi_handler(&(smc_args){RMI_RTT_FOLD,
-					rtt, rd, map_addr, level}, 5U).ret0;
+	smc_ret_values rets;
+
+	rets = host_rmi_handler(&(smc_args) {RMI_RTT_FOLD,
+				rd, map_addr, level, (u_register_t)&rets}, 5U);
+	*pa = rets.ret1;
+	return rets.ret0;
 }
 
 static inline u_register_t host_rmi_rec_aux_count(u_register_t rd,
@@ -200,19 +228,23 @@
 {
 	smc_ret_values rets;
 
-	rets = host_rmi_handler(&(smc_args){RMI_REC_AUX_COUNT, rd}, 2U);
+	rets = host_rmi_handler(&(smc_args) {RMI_REC_AUX_COUNT, rd}, 2U);
 	*aux_count = rets.ret1;
 	return rets.ret0;
 }
 
 static inline u_register_t host_rmi_rtt_set_ripas(u_register_t rd,
 						  u_register_t rec,
-						  u_register_t map_addr,
-						  u_register_t level,
-						  u_register_t ripas)
+						  u_register_t start,
+						  u_register_t end,
+						  u_register_t *top)
 {
-	return host_rmi_handler(&(smc_args){RMI_RTT_SET_RIPAS,
-				rd, rec, map_addr, level, ripas}, 6U).ret0;
+	smc_ret_values rets;
+
+	rets = host_rmi_handler(&(smc_args) {RMI_RTT_SET_RIPAS,
+				rd, rec, start, end}, 5U);
+	*top = rets.ret1;
+	return rets.ret0;
 }
 
 static inline u_register_t host_rmi_rtt_mapunprotected(u_register_t rd,
@@ -220,7 +252,7 @@
 							u_register_t level,
 							u_register_t ns_pa)
 {
-	return host_rmi_handler(&(smc_args){RMI_RTT_MAP_UNPROTECTED,
+	return host_rmi_handler(&(smc_args) {RMI_RTT_MAP_UNPROTECTED,
 				rd, map_addr, level, ns_pa}, 5U).ret0;
 }
 
@@ -231,21 +263,26 @@
 {
 	smc_ret_values rets;
 
-	rets = host_rmi_handler(&(smc_args){RMI_RTT_READ_ENTRY,
+	rets = host_rmi_handler(&(smc_args) {RMI_RTT_READ_ENTRY,
 					rd, map_addr, level}, 4U);
 	rtt->walk_level = rets.ret1;
-	rtt->state = rets.ret2 & 0xFF;
+	rtt->state = rets.ret2;
 	rtt->out_addr = rets.ret3;
+	rtt->ripas = rets.ret4;
 	return rets.ret0;
 }
 
 static inline u_register_t host_rmi_rtt_unmap_unprotected(u_register_t rd,
 							  u_register_t map_addr,
 							  u_register_t level,
-							  u_register_t ns_pa)
+							  u_register_t *top)
 {
-	return host_rmi_handler(&(smc_args){RMI_RTT_UNMAP_UNPROTECTED,
-					rd, map_addr, level, ns_pa}, 5U).ret0;
+	smc_ret_values rets;
+
+	rets = host_rmi_handler(&(smc_args) {RMI_RTT_UNMAP_UNPROTECTED,
+					rd, map_addr, level}, 4U);
+	*top = rets.ret1;
+	return rets.ret0;
 }
 
 static inline u_register_t host_rtt_level_mapsize(u_register_t level)
@@ -263,7 +300,7 @@
 						 u_register_t phys)
 {
 	addr = ALIGN_DOWN(addr, host_rtt_level_mapsize(level - 1U));
-	return host_rmi_rtt_create(phys, realm->rd, addr, level);
+	return host_rmi_rtt_create(realm->rd, phys, addr, level);
 }
 
 static u_register_t host_rmi_create_rtt_levels(struct realm *realm,
@@ -303,9 +340,10 @@
 					u_register_t level)
 {
 	struct rtt_entry rtt;
-	u_register_t ret;
+	u_register_t pa, ret;
 
 	ret = host_rmi_rtt_readentry(rd, addr, level, &rtt);
+
 	if (ret != RMI_SUCCESS) {
 		ERROR("%s() failed, level=0x%lx addr=0x%lx ret=0x%lx\n",
 			"host_rmi_rtt_readentry", level, addr, ret);
@@ -313,15 +351,15 @@
 	}
 
 	if (rtt.state != RMI_TABLE) {
-		ERROR("%s() failed, rtt.state=0x%x\n", "rmi_rtt_readentry",
+		ERROR("%s() failed, rtt.state=%lu\n", "rmi_rtt_readentry",
 			rtt.state);
 		return REALM_ERROR;
 	}
 
-	ret = host_rmi_rtt_fold(rtt.out_addr, rd, addr, level + 1U);
+	ret = host_rmi_rtt_fold(rd, addr, level + 1U, &pa);
 	if (ret != RMI_SUCCESS) {
-		ERROR("%s() failed, rtt.out_addr=0x%llx addr=0x%lx ret=0x%lx\n",
-			"host_rmi_rtt_fold", rtt.out_addr, addr, ret);
+		ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
+			"host_rmi_rtt_fold", addr, ret);
 		return REALM_ERROR;
 	}
 
@@ -343,6 +381,8 @@
 	u_register_t size;
 	u_register_t phys = target_pa;
 	u_register_t map_addr = target_pa;
+	u_register_t end_addr = map_addr + map_size;
+	u_register_t top;
 
 	if (!IS_ALIGNED(map_addr, map_size)) {
 		return REALM_ERROR;
@@ -360,7 +400,7 @@
 		return REALM_ERROR;
 	}
 
-	ret = host_rmi_rtt_init_ripas(rd, map_addr, map_level);
+	ret = host_rmi_rtt_init_ripas(rd, map_addr, end_addr, &top);
 	if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
 		ret = host_rmi_create_rtt_levels(realm, map_addr,
 						 RMI_RETURN_INDEX(ret),
@@ -370,7 +410,7 @@
 				"host_rmi_create_rtt_levels", ret, __LINE__);
 			goto err;
 		}
-		ret = host_rmi_rtt_init_ripas(rd, map_addr, map_level);
+		ret = host_rmi_rtt_init_ripas(rd, map_addr, end_addr, &top);
 		if (ret != RMI_SUCCESS) {
 			ERROR("%s() failed, ret=0x%lx line=%u\n",
 				"host_rmi_rtt_init_ripas", ret, __LINE__);
@@ -385,7 +425,7 @@
 			return REALM_ERROR;
 		}
 
-		ret = host_rmi_data_create(unknown, phys, rd, map_addr, src_pa);
+		ret = host_rmi_data_create(unknown, rd, phys, map_addr, src_pa);
 
 		if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
 			/* Create missing RTTs and retry */
@@ -399,8 +439,8 @@
 				goto err;
 			}
 
-			ret = host_rmi_data_create(unknown, phys, rd, map_addr,
-							src_pa);
+			ret = host_rmi_data_create(unknown, rd, phys, map_addr,
+						   src_pa);
 		}
 
 		if (ret != RMI_SUCCESS) {
@@ -432,10 +472,12 @@
 
 err:
 	while (size >= PAGE_SIZE) {
-		ret = host_rmi_data_destroy(rd, map_addr);
+		u_register_t data, top;
+
+		ret = host_rmi_data_destroy(rd, map_addr, &data, &top);
 		if (ret != RMI_SUCCESS) {
-			ERROR("%s() failed, ret=0x%lx\n",
-				"host_rmi_data_destroy", ret);
+			ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
+				"host_rmi_data_destroy", map_addr, ret);
 		}
 
 		ret = host_rmi_granule_undelegate(phys);
@@ -461,7 +503,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)) {
@@ -510,10 +552,11 @@
 static u_register_t host_realm_rtt_destroy(struct realm *realm,
 					   u_register_t addr,
 					   u_register_t level,
-					   u_register_t rtt_granule)
+					   u_register_t *rtt,
+					   u_register_t *top)
 {
 	addr = ALIGN_DOWN(addr, host_rtt_level_mapsize(level - 1U));
-	return host_rmi_rtt_destroy(rtt_granule, realm->rd, addr, level);
+	return host_rmi_rtt_destroy(realm->rd, addr, level, rtt, top);
 }
 
 static u_register_t host_realm_destroy_free_rtt(struct realm *realm,
@@ -521,12 +564,12 @@
 						u_register_t level,
 						u_register_t rtt_granule)
 {
-	u_register_t ret;
+	u_register_t rtt, top, ret;
 
-	ret = host_realm_rtt_destroy(realm, addr, level, rtt_granule);
+	ret = host_realm_rtt_destroy(realm, addr, level, &rtt, &top);
 	if (ret != RMI_SUCCESS) {
-		ERROR("%s() failed, rtt=0x%lx ret=0x%lx\n",
-			"host_realm_rtt_destroy", rtt_granule, ret);
+		ERROR("%s() failed, ret=0x%lx\n",
+			"host_realm_rtt_destroy", ret);
 		return REALM_ERROR;
 	}
 
@@ -541,25 +584,28 @@
 	return REALM_SUCCESS;
 }
 
-static void host_realm_destroy_undelegate_range(struct realm *realm,
-						u_register_t ipa,
-						u_register_t addr,
-						u_register_t size)
+static u_register_t host_realm_destroy_undelegate_range(struct realm *realm,
+							u_register_t ipa,
+							u_register_t addr,
+							u_register_t size)
 {
 	u_register_t rd = realm->rd;
 	u_register_t ret;
+	u_register_t data, top;
 
 	while (size >= PAGE_SIZE) {
-		ret = host_rmi_data_destroy(rd, ipa);
+		ret = host_rmi_data_destroy(rd, ipa, &data, &top);
 		if (ret != RMI_SUCCESS) {
 			ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
 				"host_rmi_data_destroy", ipa, ret);
+			return REALM_ERROR;
 		}
 
 		ret = host_rmi_granule_undelegate(addr);
 		if (ret != RMI_SUCCESS) {
 			ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
 				"host_rmi_granule_undelegate", ipa, ret);
+			return REALM_ERROR;
 		}
 
 		page_free(addr);
@@ -568,6 +614,7 @@
 		ipa += PAGE_SIZE;
 		size -= PAGE_SIZE;
 	}
+	return REALM_SUCCESS;
 }
 
 static u_register_t host_realm_tear_down_rtt_range(struct realm *realm,
@@ -575,10 +622,11 @@
 						   u_register_t start,
 						   u_register_t end)
 {
-	u_register_t rd = realm->rd, ret;
+	u_register_t rd = realm->rd;
 	u_register_t map_size = host_rtt_level_mapsize(level);
-	u_register_t map_addr, next_addr, rtt_out_addr, end_addr;
+	u_register_t map_addr, next_addr, rtt_out_addr, end_addr, top;
 	struct rtt_entry rtt;
+	u_register_t ret;
 
 	for (map_addr = start; map_addr < end; map_addr = next_addr) {
 		next_addr = ALIGN(map_addr + 1U, map_size);
@@ -594,12 +642,33 @@
 
 		switch (rtt.state) {
 		case RMI_ASSIGNED:
-			host_realm_destroy_undelegate_range(realm, map_addr,
-							    rtt_out_addr,
-							    map_size);
+			if (rtt.ripas == RMI_EMPTY) {
+				ret = host_rmi_rtt_unmap_unprotected(
+								rd,
+								map_addr,
+								level,
+								&top);
+				if (ret != RMI_SUCCESS) {
+					ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
+						"host_rmi_rtt_unmap_unprotected",
+						map_addr, ret);
+					return REALM_ERROR;
+				}
+			} else {
+				ret = host_realm_destroy_undelegate_range(
+									realm,
+									map_addr,
+									rtt_out_addr,
+									map_size);
+				if (ret != RMI_SUCCESS) {
+					ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
+						"host_realm_destroy_undelegate_range",
+						map_addr, ret);
+					return REALM_ERROR;
+				}
+			}
 			break;
 		case RMI_UNASSIGNED:
-		case RMI_DESTROYED:
 			break;
 		case RMI_TABLE:
 			ret = host_realm_tear_down_rtt_range(realm, level + 1U,
@@ -622,16 +691,6 @@
 				return REALM_ERROR;
 			}
 			break;
-		case RMI_VALID_NS:
-			ret = host_rmi_rtt_unmap_unprotected(rd, map_addr, level,
-								rtt_out_addr);
-			if (ret != RMI_SUCCESS) {
-				ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
-					"host_rmi_rtt_unmap_unprotected",
-					map_addr, ret);
-				return REALM_ERROR;
-			}
-			break;
 		default:
 			return REALM_ERROR;
 		}
@@ -642,17 +701,17 @@
 
 u_register_t host_rmi_granule_delegate(u_register_t addr)
 {
-	return host_rmi_handler(&(smc_args){RMI_GRANULE_DELEGATE, addr}, 2U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_GRANULE_DELEGATE, addr}, 2U).ret0;
 }
 
 u_register_t host_rmi_granule_undelegate(u_register_t addr)
 {
-	return host_rmi_handler(&(smc_args){RMI_GRANULE_UNDELEGATE, addr}, 2U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_GRANULE_UNDELEGATE, addr}, 2U).ret0;
 }
 
 u_register_t host_rmi_version(void)
 {
-	return host_rmi_handler(&(smc_args){RMI_VERSION}, 1U).ret0;
+	return host_rmi_handler(&(smc_args) {RMI_VERSION}, 1U).ret0;
 }
 
 u_register_t host_realm_create(struct realm *realm)
@@ -710,12 +769,33 @@
 	}
 
 	/* Populate params */
-	params->features_0 = realm->rmm_feat_reg0;
+	params->s2sz = EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
+				realm->rmm_feat_reg0);
+	params->num_bps = realm->num_bps;
+	params->num_wps = realm->num_wps;
+
+	/* SVE enable and vector length */
+	if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_SVE_EN) != 0UL) {
+		params->flags = RMI_REALM_FLAGS_SVE;
+		params->sve_vl = realm->sve_vl;
+	} else {
+		params->flags = 0UL;
+		params->sve_vl = 0U;
+	}
+
+	/* PMU enable and number of event counters */
+	if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_PMU_EN) != 0UL) {
+		params->flags |= RMI_REALM_FLAGS_PMU;
+		params->pmu_num_ctrs = realm->pmu_num_ctrs;
+	} else {
+		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);
@@ -797,10 +877,10 @@
 {
 	u_register_t rd = realm->rd, ret;
 	u_register_t map_size = host_rtt_level_mapsize(level);
+	u_register_t top;
 
 	while (start < end) {
-		ret = host_rmi_rtt_init_ripas(rd, start, level);
-
+		ret = host_rmi_rtt_init_ripas(rd, start, end, &top);
 		if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
 			int cur_level = RMI_RETURN_INDEX(ret);
 
@@ -844,7 +924,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 */
@@ -961,7 +1041,7 @@
 	rec_params->num_aux = realm->num_aux;
 
 	/* Create REC  */
-	ret = host_rmi_rec_create(realm->rec, realm->rd, (u_register_t)rec_params);
+	ret = host_rmi_rec_create(realm->rd, realm->rec, (u_register_t)rec_params);
 	if (ret != RMI_SUCCESS) {
 		ERROR("%s() failed, ret=0x%lx\n", "host_rmi_rec_create", ret);
 		goto err_free_rec_aux;
@@ -1051,7 +1131,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;
@@ -1107,7 +1187,7 @@
 
 	do {
 		re_enter_rec = false;
-		ret = host_rmi_handler(&(smc_args){RMI_REC_ENTER,
+		ret = host_rmi_handler(&(smc_args) {RMI_REC_ENTER,
 					realm->rec, realm->run}, 3U).ret0;
 		VERBOSE("%s() run->exit.exit_reason=%lu "
 			"run->exit.esr=0x%lx EC_BITS=%u ISS_DFSC_MASK=0x%lx\n",
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..8782c9e 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;				\
 		}								\
@@ -45,13 +45,13 @@
 
 static test_result_t host_create_sve_realm_payload(bool sve_en, uint8_t sve_vq)
 {
-	u_register_t rmi_feat_reg0;
+	u_register_t feature_flag;
 
-	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) {
+		feature_flag = RMI_FEATURE_REGISTER_0_SVE_EN |
+				INPLACE(FEATURE_SVE_VL, sve_vq);
 	} else {
-		rmi_feat_reg0 = INPLACE(RMI_FEATURE_REGISTER_0_SVE_EN, false);
+		feature_flag = 0UL;
 	}
 
 	/* Initialise Realm payload */
@@ -60,7 +60,7 @@
 				       (u_register_t)(PAGE_POOL_MAX_SIZE +
 						      NS_REALM_SHARED_MEM_SIZE),
 				       (u_register_t)PAGE_POOL_MAX_SIZE,
-				       rmi_feat_reg0)) {
+				       feature_flag)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -90,14 +90,14 @@
 	rmi_sve_vq = EXTRACT(RMI_FEATURE_REGISTER_0_SVE_VL, rmi_feat_reg0);
 
 	/*
-	 * configure NS to arch supported max VL and get the value reported
+	 * Configure NS to arch supported max VL and get the value reported
 	 * by rdvl
 	 */
 	sve_config_vq(SVE_VQ_ARCH_MAX);
 	ns_sve_vq = SVE_VL_TO_VQ(sve_vector_length_get());
 
 	if (rmi_sve_vq != ns_sve_vq) {
-		ERROR("RMI max SVE VL %u bits doesn't matches NS max "
+		ERROR("RMI max SVE VL %u bits don't match NS max "
 		      "SVE VL %u bits\n", SVE_VQ_TO_BITS(rmi_sve_vq),
 		      SVE_VQ_TO_BITS(ns_sve_vq));
 		return TEST_RESULT_FAIL;
@@ -135,7 +135,7 @@
 		goto rm_realm;
 	}
 
-	/* check if rdvl matches the SVE VL created */
+	/* Check if rdvl matches the SVE VL created */
 	sd = host_get_shared_structure();
 	rl_output = (struct sve_cmd_rdvl *)sd->realm_cmd_output_buffer;
 	rl_max_sve_vq = SVE_VL_TO_VQ(rl_output->rdvl);
@@ -170,19 +170,12 @@
 	sve_vq = EXTRACT(RMI_FEATURE_REGISTER_0_SVE_VL, rmi_feat_reg0);
 
 	/*
-	 * If RMM supports MAX SVE VQ, we can't pass in an invalid sve_vq to
-	 * create a realm, so skip the test. Else pass a sve_vq that is greater
-	 * than the value supported by RMM and check whether creating Realm fails
+	 * Pass a sve_vq that is greater than the value supported by RMM
+	 * and check whether creating Realm fails
 	 */
-	if (sve_vq == SVE_VQ_ARCH_MAX) {
-		INFO("RMI supports arch max SVE VL, skipping\n");
-		return TEST_RESULT_SKIPPED;
-	}
-
 	rc = host_create_sve_realm_payload(true, (sve_vq + 1));
-
 	if (rc == TEST_RESULT_SUCCESS) {
-		ERROR("Error: Realm created with invalid SVE VL\n");
+		ERROR("Error: Realm created with invalid SVE VL %u\n", (sve_vq + 1));
 		host_destroy_realm();
 		return TEST_RESULT_FAIL;
 	}
@@ -263,9 +256,7 @@
 
 static void print_sve_vl_bitmap(uint32_t vl_bitmap)
 {
-	uint8_t vq;
-
-	for (vq = 0U; vq <= SVE_VQ_ARCH_MAX; vq++) {
+	for (uint8_t vq = 0U; vq <= SVE_VQ_ARCH_MAX; vq++) {
 		if ((vl_bitmap & BIT_32(vq)) != 0U) {
 			INFO("\t%u\n", SVE_VQ_TO_BITS(vq));
 		}
@@ -393,17 +384,10 @@
  */
 static bool callback_enter_realm(void)
 {
-	bool realm_rc;
-
-	realm_rc = host_enter_realm_execute(REALM_SVE_OPS, NULL,
+	return !host_enter_realm_execute(REALM_SVE_OPS, NULL,
 					    RMI_EXIT_HOST_CALL);
-	if (realm_rc != true) {
-		return true;
 	}
 
-	return false;
-}
-
 /* Intermittently switch to Realm while doing NS SVE ops */
 test_result_t host_sve_realm_check_vectors_operations(void)
 {
@@ -425,7 +409,7 @@
 		return rc;
 	}
 
-	/* get at random value to do sve_subtract */
+	/* Get at random value to do sve_subtract */
 	val = rand();
 	for (i = 0U; i < NS_SVE_OP_ARRAYSIZE; i++) {
 		ns_sve_op_1[i] = val - i;
@@ -451,6 +435,7 @@
 
 	/* Check result of SVE operations. */
 	rc = TEST_RESULT_SUCCESS;
+
 	for (i = 0U; i < NS_SVE_OP_ARRAYSIZE; i++) {
 		if (ns_sve_op_1[i] != (val - i - SVE_TEST_ITERATIONS)) {
 			ERROR("SVE op failed at idx: %u, expected: 0x%x "
@@ -503,14 +488,14 @@
 
 	/* 1. Set NS SVE VQ to max and write known pattern */
 	sve_config_vq(sve_vq);
-	(void)memset((void *)&ns_sve_vectors_write, 0xaa,
+	(void)memset((void *)&ns_sve_vectors_write, 0xAA,
 		     SVE_VQ_TO_BYTES(sve_vq) * SVE_NUM_VECTORS);
 	sve_fill_vector_regs(ns_sve_vectors_write);
 
-	/* 2. NS programs ZCR_EL2 with VQ as 0  */
+	/* 2. NS programs ZCR_EL2 with VQ as 0 */
 	sve_config_vq(SVE_VQ_ARCH_MIN);
 
-	/* 3. Create Realm with max VQ (higher than NS SVE VQ). */
+	/* 3. Create Realm with max VQ (higher than NS SVE VQ) */
 	rc = host_create_sve_realm_payload(true, sve_vq);
 	if (rc != TEST_RESULT_SUCCESS) {
 		return rc;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
index 43747b1..429b19d 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
@@ -37,8 +37,7 @@
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
-			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL)) {
+			(u_register_t)PAGE_POOL_MAX_SIZE, 0UL)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,
@@ -163,9 +162,8 @@
 {
 	struct rmi_rec_run *run = (struct rmi_rec_run *)realm_ptr->run;
 
-	/* Check PMU state */
-	if ((run->exit.pmu_ovf & run->exit.pmu_intr_en &
-	     run->exit.pmu_cntr_en) != 0UL) {
+	/* Check PMU overflow status */
+	if (run->exit.pmu_ovf_status == RMI_PMU_OVERFLOW_ACTIVE) {
 		unsigned int host_call_result;
 		u_register_t exit_reason, retrmm;
 		int ret;
@@ -210,18 +208,22 @@
 static test_result_t host_test_realm_pmuv3(uint8_t cmd)
 {
 	struct realm *realm_ptr;
+	u_register_t feature_flag;
 	bool ret1, ret2;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
 	host_set_pmu_state();
 
+	feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
+			INPLACE(FEATURE_PMU_NUM_CTRS, (unsigned long long)(-1));
+
 	if (!host_create_realm_payload((u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)(PAGE_POOL_MAX_SIZE +
 			NS_REALM_SHARED_MEM_SIZE),
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			RMI_FEATURE_REGISTER_0_PMU_EN)) {
+			feature_flag)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(NS_REALM_SHARED_MEM_BASE,