feat(rmi): add support for FEAT_LPA2 to the Realm Extension tests

This patch adds support to the current Realm Extension tests to
enable and use 52 bit address size with 4KB granularity when
FEAT_LPA2 is present.

In addition, this patch also introduces changes to support passing the
starting RTT level and the FEAT_LPA2 enable flag during realm creation
so they can be used later to implement tests for FEAT_LPA2 on RMI.

Signed-off-by: Javier Almansa Sobrino <javier.almansasobrino@arm.com>
Change-Id: I0a930735a44772e5e76d6608c969759f27129917
diff --git a/include/lib/xlat_tables/xlat_tables_defs.h b/include/lib/xlat_tables/xlat_tables_defs.h
index ba0559c..c9b91cc 100644
--- a/include/lib/xlat_tables/xlat_tables_defs.h
+++ b/include/lib/xlat_tables/xlat_tables_defs.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2022, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2024, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -196,7 +196,7 @@
  * For Normal WB cacheability attribute, set bit[4] to 1 and bits[3:2] to 0b10.
  */
 #define S2TTE_MEMATTR_FWB_NORMAL_WB	((1UL << 4) | (2UL << 2))
-#define S2TTE_ATTR_FWB_WB_RW	(S2TTE_MEMATTR_FWB_NORMAL_WB | S2TTE_AP_RW | \
-			S2TTE_SH_IS)
+#define S2TTE_ATTR_FWB_WB_RW_LPA2	(S2TTE_MEMATTR_FWB_NORMAL_WB | S2TTE_AP_RW)
+#define S2TTE_ATTR_FWB_WB_RW		(S2TTE_ATTR_FWB_WB_RW_LPA2 | S2TTE_SH_IS)
 
 #endif /* XLAT_TABLES_DEFS_H */
diff --git a/include/runtime_services/host_realm_managment/host_realm_helper.h b/include/runtime_services/host_realm_managment/host_realm_helper.h
index ae5f461..c654877 100644
--- a/include/runtime_services/host_realm_managment/host_realm_helper.h
+++ b/include/runtime_services/host_realm_managment/host_realm_helper.h
@@ -18,6 +18,7 @@
 		u_register_t plat_mem_pool_adr,
 		u_register_t realm_pages_size,
 		u_register_t feature_flag,
+		long sl,
 		const u_register_t *rec_flag,
 		unsigned int rec_count);
 
@@ -30,6 +31,7 @@
 		u_register_t plat_mem_pool_adr,
 		u_register_t realm_pages_size,
 		u_register_t feature_flag,
+		long sl,
 		const u_register_t *rec_flag,
 		unsigned int rec_count);
 
@@ -42,6 +44,7 @@
 		u_register_t plat_mem_pool_adr,
 		u_register_t realm_pages_size,
 		u_register_t feature_flag,
+		long sl,
 		const u_register_t *rec_flag,
 		unsigned int rec_count);
 bool host_create_shared_mem(struct realm *realm_ptr,
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 59abdb5..78fc6c1 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -344,7 +344,9 @@
 
 #define RMI_RETURN_STATUS(ret)		((ret) & 0xFF)
 #define RMI_RETURN_INDEX(ret)		(((ret) >> 8U) & 0xFF)
-#define RTT_MAX_LEVEL			3U
+#define RTT_MAX_LEVEL			(3L)
+#define RTT_MIN_LEVEL			(0L)
+#define RTT_MIN_LEVEL_LPA2		(-1L)
 #define ALIGN_DOWN(x, a)		((uint64_t)(x) & ~(((uint64_t)(a)) - 1ULL))
 #define IS_ALIGNED(x, a)		(((x) & ((typeof(x))(a)-1U)) == 0U)
 #define PAGE_SHIFT			FOUR_KB_SHIFT
@@ -358,6 +360,19 @@
 #define REC_GIC_NUM_LRS			16U
 
 /*
+ * When FEAT_LPA2 is enabled bits [51:50] of the OA are not
+ * contiguous to the rest of the OA.
+ */
+
+#define TTE_OA_50_51_SHIFT		ULL(8)
+#define TTE_OA_50_51_WIDTH		ULL(2)
+
+/* Bitfields for the 2 MSBs on an OA */
+#define OA_50_51_SHIFT			ULL(50)
+#define OA_50_51_WIDTH			TTE_OA_50_51_WIDTH
+#define OA_50_51_MASK			MASK(OA_50_51)
+
+/*
  * The Realm attribute parameters are shared by the Host via
  * RMI_REALM_CREATE::params_ptr. The values can be observed or modified
  * either by the Host or by the Realm.
@@ -504,7 +519,7 @@
 };
 
 struct rtt_entry {
-	uint64_t walk_level;
+	long walk_level;
 	uint64_t out_addr;
 	u_register_t state;
 	u_register_t ripas;
@@ -542,6 +557,7 @@
 	bool             shared_mem_created;
 	unsigned short   vmid;
 	enum realm_state state;
+	long start_level;
 };
 
 /* RMI/SMC */
@@ -557,11 +573,11 @@
 				   u_register_t *top);
 u_register_t host_rmi_rtt_readentry(u_register_t rd,
 				    u_register_t map_addr,
-				    u_register_t level,
+				    long level,
 				    struct rtt_entry *rtt);
 u_register_t host_rmi_rtt_destroy(u_register_t rd,
 				  u_register_t map_addr,
-				  u_register_t level,
+				  long level,
 				  u_register_t *rtt,
 				  u_register_t *top);
 u_register_t host_rmi_rtt_init_ripas(u_register_t rd,
@@ -570,11 +586,10 @@
 				   u_register_t *top);
 u_register_t host_rmi_create_rtt_levels(struct realm *realm,
 					u_register_t map_addr,
-					u_register_t level,
-					u_register_t max_level);
+					long level, long max_level);
 u_register_t host_rmi_rtt_unmap_unprotected(u_register_t rd,
 					    u_register_t map_addr,
-					    u_register_t level,
+					    long level,
 					    u_register_t *top);
 u_register_t host_rmi_rtt_set_ripas(u_register_t rd,
 				    u_register_t rec,
@@ -601,7 +616,7 @@
 				  u_register_t *exit_reason,
 				  unsigned int *host_call_result,
 				  unsigned int rec_num);
-u_register_t host_realm_init_ipa_state(struct realm *realm, u_register_t level,
+u_register_t host_realm_init_ipa_state(struct realm *realm, long level,
 				       u_register_t start, uint64_t end);
 u_register_t host_realm_delegate_map_protected_data(bool unknown,
 					   struct realm *realm,
@@ -610,6 +625,6 @@
 					   u_register_t src_pa);
 u_register_t host_realm_map_unprotected(struct realm *realm, u_register_t ns_pa,
 					u_register_t map_size);
-u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr, u_register_t level);
+u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr, long level);
 
 #endif /* HOST_REALM_RMI_H */
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 2c58919..28df45d 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
@@ -106,12 +106,13 @@
 }
 
 bool host_prepare_realm_payload(struct realm *realm_ptr,
-				u_register_t realm_payload_adr,
-				u_register_t plat_mem_pool_adr,
-				u_register_t realm_pages_size,
-				u_register_t feature_flag,
-				const u_register_t *rec_flag,
-				unsigned int rec_count)
+			       u_register_t realm_payload_adr,
+			       u_register_t plat_mem_pool_adr,
+			       u_register_t realm_pages_size,
+			       u_register_t feature_flag,
+			       long sl,
+			       const u_register_t *rec_flag,
+			       unsigned int rec_count)
 {
 	int8_t value;
 
@@ -166,18 +167,6 @@
 				EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ, feature_flag));
 	}
 
-	/*
-	 * At the moment, TFTF does not have support for FEAT_LPA2, so if
-	 * S2SZ is larger than 48 bits, truncate it to ensure we don't surpass
-	 * the maximum IPA size for a realm with no LPA2 support.
-	 */
-	if (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ, realm_ptr->rmm_feat_reg0) > 48U) {
-		realm_ptr->rmm_feat_reg0 &=
-				~MASK(RMI_FEATURE_REGISTER_0_S2SZ);
-		realm_ptr->rmm_feat_reg0 |=
-				INPLACE(RMI_FEATURE_REGISTER_0_S2SZ, 48U);
-	}
-
 	/* Disable PMU if not required */
 	if ((feature_flag & RMI_FEATURE_REGISTER_0_PMU_EN) == 0UL) {
 		realm_ptr->rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_PMU_EN;
@@ -244,6 +233,17 @@
 		}
 	}
 
+	/*
+	 * Force FEAT_LPA2 to the selected configuration.
+	 */
+	if ((feature_flag & RMI_FEATURE_REGISTER_0_LPA2) == 0ULL) {
+		realm_ptr->rmm_feat_reg0 &= ~RMI_FEATURE_REGISTER_0_LPA2;
+	} else {
+		realm_ptr->rmm_feat_reg0 |= RMI_FEATURE_REGISTER_0_LPA2;
+	}
+
+	realm_ptr->start_level = sl;
+
 	/* Create Realm */
 	if (host_realm_create(realm_ptr) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_create");
@@ -276,6 +276,7 @@
 			       u_register_t plat_mem_pool_adr,
 			       u_register_t realm_pages_size,
 			       u_register_t feature_flag,
+			       long sl,
 			       const u_register_t *rec_flag,
 			       unsigned int rec_count)
 {
@@ -286,6 +287,7 @@
 			plat_mem_pool_adr,
 			realm_pages_size,
 			feature_flag,
+			sl,
 			rec_flag,
 			rec_count);
 	if (!ret) {
@@ -297,8 +299,8 @@
 			goto destroy_realm;
 		}
 
-		if (host_realm_init_ipa_state(realm_ptr, 0U, 0U, 1ULL << 32)
-			!= RMI_SUCCESS) {
+		if (host_realm_init_ipa_state(realm_ptr, realm_ptr->start_level,
+					      0U, 1ULL << 32) != RMI_SUCCESS) {
 			ERROR("%s() failed\n", "host_realm_init_ipa_state");
 			goto destroy_realm;
 		}
@@ -318,6 +320,7 @@
 			u_register_t plat_mem_pool_adr,
 			u_register_t realm_pages_size,
 			u_register_t feature_flag,
+			long sl,
 			const u_register_t *rec_flag,
 			unsigned int rec_count)
 
@@ -329,6 +332,7 @@
 			plat_mem_pool_adr,
 			realm_pages_size,
 			feature_flag,
+			sl,
 			rec_flag,
 			rec_count);
 	if (!ret) {
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 22717e5..a99fcd5 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
@@ -8,6 +8,8 @@
 #include <assert.h>
 #include <string.h>
 
+#include <arch_features.h>
+
 #include <debug.h>
 #include <heap/page_alloc.h>
 #include <test_helpers.h>
@@ -18,6 +20,7 @@
 #include <plat/common/platform.h>
 #include <realm_def.h>
 #include <tftf_lib.h>
+#include <utils_def.h>
 
 #define SET_ARG(_n) {			\
 	case _n:			\
@@ -173,22 +176,23 @@
 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)
+						long  level)
 {
 	return host_rmi_handler(&(smc_args) {RMI_RTT_CREATE,
-				rd, rtt, map_addr, level}, 5U).ret0;
+				rd, rtt, map_addr, (u_register_t)level}, 5U).ret0;
 }
 
 u_register_t host_rmi_rtt_destroy(u_register_t rd,
 				  u_register_t map_addr,
-				  u_register_t level,
+				  long level,
 				  u_register_t *rtt,
 				  u_register_t *top)
 {
 	smc_ret_values rets;
 
 	rets = host_rmi_handler(&(smc_args) {RMI_RTT_DESTROY,
-				rd, map_addr, level, (u_register_t)&rets}, 5U);
+				rd, map_addr, (u_register_t)level,
+				(u_register_t)&rets}, 5U);
 	*rtt = rets.ret1;
 	*top = rets.ret2;
 	return rets.ret0;
@@ -225,13 +229,14 @@
  */
 static inline u_register_t host_rmi_rtt_fold(u_register_t rd,
 					     u_register_t map_addr,
-					     u_register_t level,
+					     long level,
 					     u_register_t *pa)
 {
 	smc_ret_values rets;
 
 	rets = host_rmi_handler(&(smc_args) {RMI_RTT_FOLD,
-				rd, map_addr, level, (u_register_t)&rets}, 5U);
+				rd, map_addr, (u_register_t)level,
+				(u_register_t)&rets}, 5U);
 	*pa = rets.ret1;
 	return rets.ret0;
 }
@@ -262,23 +267,23 @@
 
 u_register_t host_rmi_rtt_mapunprotected(u_register_t rd,
 					 u_register_t map_addr,
-					 u_register_t level,
+					 long level,
 					 u_register_t ns_pa)
 {
 	return host_rmi_handler(&(smc_args) {RMI_RTT_MAP_UNPROTECTED,
-				rd, map_addr, level, ns_pa}, 5U).ret0;
+				rd, map_addr, (u_register_t)level, ns_pa}, 5U).ret0;
 }
 
 u_register_t host_rmi_rtt_readentry(u_register_t rd,
 				   u_register_t map_addr,
-				   u_register_t level,
+				   long level,
 				   struct rtt_entry *rtt)
 {
 	smc_ret_values rets;
 
 	rets = host_rmi_handler(&(smc_args) {RMI_RTT_READ_ENTRY,
-					rd, map_addr, level}, 4U);
-	rtt->walk_level = rets.ret1;
+					rd, map_addr, (u_register_t)level}, 4U);
+	rtt->walk_level = (long)rets.ret1;
 	rtt->state = rets.ret2;
 	rtt->out_addr = rets.ret3;
 	rtt->ripas = rets.ret4;
@@ -287,13 +292,13 @@
 
 u_register_t host_rmi_rtt_unmap_unprotected(u_register_t rd,
 					  u_register_t map_addr,
-					  u_register_t level,
+					  long level,
 					  u_register_t *top)
 {
 	smc_ret_values rets;
 
 	rets = host_rmi_handler(&(smc_args) {RMI_RTT_UNMAP_UNPROTECTED,
-					rd, map_addr, level}, 4U);
+					rd, map_addr, (u_register_t)level}, 4U);
 	*top = rets.ret1;
 	return rets.ret0;
 }
@@ -305,17 +310,16 @@
 
 static inline u_register_t host_realm_rtt_create(struct realm *realm,
 						 u_register_t addr,
-						 u_register_t level,
+						 long level,
 						 u_register_t phys)
 {
-	addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1U));
+	addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1));
 	return host_rmi_rtt_create(realm->rd, phys, addr, level);
 }
 
 u_register_t host_rmi_create_rtt_levels(struct realm *realm,
 					u_register_t map_addr,
-					u_register_t level,
-					u_register_t max_level)
+					long level, long max_level)
 {
 	u_register_t rtt, ret;
 
@@ -332,7 +336,7 @@
 				return REALM_ERROR;
 			}
 		}
-		ret = host_realm_rtt_create(realm, map_addr, level, rtt);
+		ret = host_realm_rtt_create(realm, map_addr, (u_register_t)level, rtt);
 		if (ret != RMI_SUCCESS) {
 			ERROR("%s() failed, rtt=0x%lx ret=0x%lx\n",
 				"host_realm_rtt_create", rtt, ret);
@@ -346,7 +350,7 @@
 }
 
 u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr,
-				 u_register_t level)
+				 long level)
 {
 	u_register_t pa, ret;
 
@@ -380,7 +384,7 @@
 						    u_register_t src_pa)
 {
 	u_register_t rd = realm->rd;
-	u_register_t level;
+	int8_t level;
 	u_register_t ret = 0UL;
 	u_register_t size = 0UL;
 	u_register_t phys = target_pa;
@@ -403,7 +407,8 @@
 		if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
 			/* Create missing RTTs till L3 and retry */
 			level = RMI_RETURN_INDEX(ret);
-			ret = host_rmi_create_rtt_levels(realm, map_addr, level,
+			ret = host_rmi_create_rtt_levels(realm, map_addr,
+							 (u_register_t)level,
 							 3U);
 			if (ret != RMI_SUCCESS) {
 				ERROR("%s() failed, ret=0x%lx line=%u\n",
@@ -458,7 +463,9 @@
 					u_register_t map_size)
 {
 	u_register_t rd = realm->rd;
-	u_register_t map_level, level;
+	long map_level;
+	u_register_t desc;
+	int8_t level;
 	u_register_t ret = 0UL;
 	u_register_t phys = ns_pa;
 	u_register_t map_addr = ns_pa |
@@ -483,15 +490,22 @@
 		ERROR("Unknown map_size=0x%lx\n", map_size);
 		return REALM_ERROR;
 	}
-	u_register_t desc = phys | S2TTE_ATTR_FWB_WB_RW;
+
+	if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_LPA2) != 0L) {
+		desc = (phys & ~OA_50_51_MASK) |
+				INPLACE(TTE_OA_50_51, EXTRACT(OA_50_51, phys));
+		desc |= S2TTE_ATTR_FWB_WB_RW_LPA2;
+	} else {
+		desc = phys | S2TTE_ATTR_FWB_WB_RW;
+	}
 
 	ret = host_rmi_rtt_mapunprotected(rd, map_addr, map_level, desc);
 
 	if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
 		/* Create missing RTTs and retry */
 		level = RMI_RETURN_INDEX(ret);
-		ret = host_rmi_create_rtt_levels(realm, map_addr, level,
-						 map_level);
+		ret = host_rmi_create_rtt_levels(realm, map_addr,
+						 level, map_level);
 		if (ret != RMI_SUCCESS) {
 			ERROR("%s() failed, ret=0x%lx line=%u\n",
 				"host_rmi_create_rtt_levels", ret, __LINE__);
@@ -512,17 +526,17 @@
 
 static u_register_t host_realm_rtt_destroy(struct realm *realm,
 					   u_register_t addr,
-					   u_register_t level,
+					   long level,
 					   u_register_t *rtt,
 					   u_register_t *top)
 {
-	addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1U));
+	addr = ALIGN_DOWN(addr, RTT_MAP_SIZE(level - 1L));
 	return host_rmi_rtt_destroy(realm->rd, addr, level, rtt, top);
 }
 
 static u_register_t host_realm_destroy_free_rtt(struct realm *realm,
 						u_register_t addr,
-						u_register_t level,
+						long level,
 						u_register_t rtt_granule)
 {
 	u_register_t rtt, top, ret;
@@ -579,7 +593,7 @@
 }
 
 static u_register_t host_realm_tear_down_rtt_range(struct realm *realm,
-						   u_register_t level,
+						   long level,
 						   u_register_t start,
 						   u_register_t end)
 {
@@ -633,7 +647,7 @@
 		case RMI_UNASSIGNED:
 			break;
 		case RMI_TABLE:
-			ret = host_realm_tear_down_rtt_range(realm, level + 1U,
+			ret = host_realm_tear_down_rtt_range(realm, level + 1L,
 							     map_addr,
 							     end_addr);
 			if (ret != RMI_SUCCESS) {
@@ -644,7 +658,7 @@
 			}
 
 			ret = host_realm_destroy_free_rtt(realm, map_addr,
-							  level + 1U,
+							  level + 1L,
 							  rtt_out_addr);
 			if (ret != RMI_SUCCESS) {
 				ERROR("%s() failed, map_addr=0x%lx ret=0x%lx\n",
@@ -760,10 +774,15 @@
 		params->pmu_num_ctrs = 0U;
 	}
 
+	/* LPA2 enable */
+	if ((realm->rmm_feat_reg0 & RMI_FEATURE_REGISTER_0_LPA2) != 0UL) {
+		params->flags |= RMI_REALM_FLAGS_LPA2;
+	}
+
+	params->rtt_level_start = realm->start_level;
 	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;
 
 	/* Create Realm */
@@ -842,7 +861,7 @@
 	return REALM_SUCCESS;
 }
 
-u_register_t host_realm_init_ipa_state(struct realm *realm, u_register_t level,
+u_register_t host_realm_init_ipa_state(struct realm *realm, long level,
 					u_register_t start, uint64_t end)
 {
 	u_register_t rd = realm->rd, ret;
@@ -855,9 +874,9 @@
 
 		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);
+			int8_t cur_level = RMI_RETURN_INDEX(ret);
 
-			if (cur_level < level) {
+			if ((int)cur_level < level) {
 				ret = host_rmi_create_rtt_levels(realm,
 								 start,
 								 cur_level,
@@ -1074,6 +1093,7 @@
 u_register_t host_realm_destroy(struct realm *realm)
 {
 	u_register_t ret;
+	long rtt_start_level = realm->start_level;
 
 	if (realm->state == REALM_STATE_NULL) {
 		return REALM_SUCCESS;
@@ -1114,14 +1134,16 @@
 	 * using RMI_DATA_DESTROY, RMI_RTT_DESTROY and RMI_GRANULE_UNDELEGATE
 	 * commands.
 	 */
-	if (host_realm_tear_down_rtt_range(realm, 0UL, 0UL,
+	if (host_realm_tear_down_rtt_range(realm, rtt_start_level, 0UL,
 				(1UL << (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ,
-				realm->rmm_feat_reg0) - 1))) != RMI_SUCCESS) {
+				realm->rmm_feat_reg0) - 1UL))) != RMI_SUCCESS) {
 		ERROR("host_realm_tear_down_rtt_range() line=%u\n", __LINE__);
 		return REALM_ERROR;
 	}
+
 	if (realm->shared_mem_created == true) {
-		if (host_realm_tear_down_rtt_range(realm, 0UL, realm->ipa_ns_buffer,
+		if (host_realm_tear_down_rtt_range(realm, rtt_start_level,
+				realm->ipa_ns_buffer,
 				(realm->ipa_ns_buffer + realm->ns_buffer_size)) !=
 				RMI_SUCCESS) {
 			ERROR("host_realm_tear_down_rtt_range() line=%u\n", __LINE__);
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
index 4774dfc..81294cd 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
@@ -32,13 +32,20 @@
 	bool ret1, ret2;
 	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
 	RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, MAX_REC_COUNT)) {
+			feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -86,15 +93,22 @@
 	u_register_t exit_reason;
 	unsigned int rec_num;
 	struct rmi_rec_run *run;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 	/* Create 3 rec Rec 0 and 2 are runnable, Rec 1 in not runnable */
 	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_NOT_RUNNABLE, RMI_RUNNABLE};
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 3U)) {
+			feature_flag, sl, rec_flag, 3U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -225,6 +239,8 @@
 	unsigned int rec_count = MAX_REC_COUNT;
 	u_register_t other_mpidr, my_mpidr, ret;
 	int cpu_node;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
 		RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
 		RMI_RUNNABLE};
@@ -232,10 +248,15 @@
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 	SKIP_TEST_IF_LESS_THAN_N_CPUS(rec_count);
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, rec_count)) {
+			feature_flag, sl, rec_flag, rec_count)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -327,14 +348,21 @@
 		RMI_NOT_RUNNABLE};
 	u_register_t exit_reason;
 	int cpu_node;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 	SKIP_TEST_IF_LESS_THAN_N_CPUS(MAX_REC_COUNT);
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, MAX_REC_COUNT)) {
+			feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -457,6 +485,8 @@
 	struct rmi_rec_run *run;
 	unsigned int host_call_result;
 	struct realm realm2;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE,
 		RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE, RMI_NOT_RUNNABLE,
 		RMI_NOT_RUNNABLE};
@@ -464,17 +494,22 @@
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, MAX_REC_COUNT)) {
+			feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 		return TEST_RESULT_FAIL;
 	}
 
 	if (!host_create_activate_realm_payload(&realm2, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ret2 = host_destroy_realm(&realm);
 		return TEST_RESULT_FAIL;
 	}
@@ -590,7 +625,7 @@
  */
 test_result_t host_realm_pmuv3_mul_rec(void)
 {
-	u_register_t feature_flag;
+	u_register_t feature_flag = 0U;
 	u_register_t rmm_feat_reg0;
 	u_register_t rec_flag[8U] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
 		RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
@@ -598,9 +633,15 @@
 	unsigned int num_cnts, i = 0U;
 	u_register_t other_mpidr, my_mpidr, ret;
 	int cpu_node;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	/* Get Max PMU counter implemented through RMI_FEATURES */
 	if (host_rmi_features(0UL, &rmm_feat_reg0) != REALM_SUCCESS) {
 		ERROR("%s() failed\n", "host_rmi_features");
@@ -617,15 +658,14 @@
 		return TEST_RESULT_SKIPPED;
 	}
 
-	feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
+	feature_flag |= RMI_FEATURE_REGISTER_0_PMU_EN |
 			INPLACE(FEATURE_PMU_NUM_CTRS, num_cnts + 1U);
 
-
 	/* Request more PMU counter than total, expect failure */
 	if (host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			feature_flag, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ERROR("Realm create should have failed\n");
 		host_destroy_realm(&realm);
 		return TEST_RESULT_FAIL;
@@ -635,10 +675,14 @@
 	feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
 			INPLACE(FEATURE_PMU_NUM_CTRS, 0U);
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+	}
+
 	ret1 = host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 				(u_register_t)PAGE_POOL_BASE,
 				(u_register_t)PAGE_POOL_MAX_SIZE,
-				feature_flag, rec_flag, 1U);
+				feature_flag, sl, rec_flag, 1U);
 
 	if (!get_feat_hpmn0_supported()) {
 		if (ret1) {
@@ -658,11 +702,15 @@
 	feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
 			INPLACE(FEATURE_PMU_NUM_CTRS, num_cnts);
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+	}
+
 	/* Prepare realm0, create recs for realm0 later */
 	if (!host_prepare_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			feature_flag, rec_flag, MAX_REC_COUNT)) {
+			feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 		goto test_exit;
 		return TEST_RESULT_FAIL;
 	}
@@ -675,10 +723,14 @@
 	feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
 			INPLACE(FEATURE_PMU_NUM_CTRS, num_cnts - 1U);
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm1, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			feature_flag, rec_flag, MAX_REC_COUNT)) {
+			feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 		goto test_exit2;
 	}
 	if (!host_create_shared_mem(&realm1, NS_REALM_SHARED_MEM_BASE + NS_REALM_SHARED_MEM_SIZE,
@@ -692,7 +744,7 @@
 		goto test_exit2;
 	}
 
-	if (host_realm_init_ipa_state(&realm, 0U, 0U, 1ULL << 32)
+	if (host_realm_init_ipa_state(&realm, sl, 0U, 1ULL << 32)
 		!= RMI_SUCCESS) {
 		ERROR("%s() failed\n", "host_realm_init_ipa_state");
 		goto test_exit2;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
index c190985..44b872f 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_simd_tests.c
@@ -88,14 +88,18 @@
 
 static test_result_t host_create_sve_realm_payload(bool sve_en, uint8_t sve_vq)
 {
-	u_register_t feature_flag;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (sve_en) {
-		feature_flag = RMI_FEATURE_REGISTER_0_SVE_EN |
+		feature_flag |= RMI_FEATURE_REGISTER_0_SVE_EN |
 				INPLACE(FEATURE_SVE_VL, sve_vq);
-	} else {
-		feature_flag = 0UL;
 	}
 
 	/* Initialise Realm payload */
@@ -103,7 +107,7 @@
 				       (u_register_t)REALM_IMAGE_BASE,
 				       (u_register_t)PAGE_POOL_BASE,
 				       (u_register_t)PAGE_POOL_MAX_SIZE,
-				       feature_flag, rec_flag, 1U)) {
+				       feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
 
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 25c65de..34ff786 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
@@ -38,14 +38,21 @@
 	bool ret1, ret2;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
 	struct realm realm;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	for (unsigned int i = 0U; i < 5U; i++) {
 		if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 				(u_register_t)PAGE_POOL_BASE,
 				(u_register_t)PAGE_POOL_MAX_SIZE,
-				0UL, rec_flag, 1U)) {
+				feature_flag, sl, rec_flag, 1U)) {
 			return TEST_RESULT_FAIL;
 		}
 		if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -75,13 +82,20 @@
 	bool ret1, ret2;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
 	struct realm realm;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -114,14 +128,21 @@
 	u_register_t rec_flag[MAX_REC_COUNT] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
 		RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,};
 	struct realm realm;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	pauth_test_lib_fill_regs_and_template(pauth_keys_before);
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 				(u_register_t)PAGE_POOL_BASE,
 				(u_register_t)PAGE_POOL_MAX_SIZE,
-				0UL, rec_flag, MAX_REC_COUNT)) {
+				feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -177,12 +198,19 @@
 	bool ret1, ret2;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
 	struct realm realm;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
+
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 				(u_register_t)PAGE_POOL_BASE,
 				(u_register_t)PAGE_POOL_MAX_SIZE,
-				0UL, rec_flag, 1U)) {
+				feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -265,6 +293,7 @@
 {
 	struct realm realm;
 	u_register_t feature_flag;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
 	bool ret1, ret2;
 
@@ -275,10 +304,16 @@
 	feature_flag = RMI_FEATURE_REGISTER_0_PMU_EN |
 			INPLACE(FEATURE_PMU_NUM_CTRS, (unsigned long long)(-1));
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag |= RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			feature_flag, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -375,13 +410,20 @@
 	bool ret1, ret2, ret3;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
 	struct realm realm1, realm2;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm1, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
 
@@ -389,7 +431,7 @@
 	if (!host_create_activate_realm_payload(&realm2, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ret2 = host_destroy_realm(&realm1);
 		return TEST_RESULT_FAIL;
 	}
@@ -450,13 +492,20 @@
 	struct rmi_rec_run *run;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
 	u_register_t test_page_num = 3U;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -548,13 +597,20 @@
 	struct realm realm;
 	struct rmi_rec_run *run;
 	u_register_t rec_flag[1] = {RMI_RUNNABLE}, base;
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -618,14 +674,21 @@
 	struct realm realm;
 	struct rmi_rec_run *run;
 	struct rtt_entry rtt;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 2U)) {
+			feature_flag, sl, rec_flag, 2U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -646,7 +709,7 @@
 		ERROR("host_realm_delegate_map_protected_data failed\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -662,7 +725,7 @@
 		ERROR("host_rmi_data_destroy failed\n");
 		goto undelegate_destroy;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			rtt.ripas != RMI_DESTROYED) {
 		ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -742,15 +805,22 @@
 	struct realm realm;
 	struct rmi_rec_run *run;
 	struct rtt_entry rtt;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 	test_result_t res = TEST_RESULT_FAIL;
 	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 2U)) {
+			feature_flag, sl, rec_flag, 2U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -775,7 +845,7 @@
 		goto destroy_realm;
 	}
 
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong initial state\n");
@@ -851,14 +921,21 @@
 	struct realm realm;
 	struct rmi_rec_run *run;
 	struct rtt_entry rtt;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 2U)) {
+			feature_flag, sl, rec_flag, 2U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -876,7 +953,7 @@
 		ERROR("host_realm_delegate_map_protected_data failed\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong state after data create\n");
@@ -897,7 +974,7 @@
 		ERROR("host_rmi_data_destroy failed\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			rtt.ripas != RMI_DESTROYED) {
 		ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -911,7 +988,7 @@
 		ERROR("host_realm_delegate_map_protected_data failede\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_DESTROYED)) {
 		ERROR("wrong state after data create unknown\n");
@@ -985,14 +1062,21 @@
 	u_register_t ret, base, esr;
 	struct realm realm;
 	struct rtt_entry rtt;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE};
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 4U)) {
+			feature_flag, sl, rec_flag, 4U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1002,7 +1086,7 @@
 
 	base = (u_register_t)page_alloc(PAGE_SIZE);
 
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (rtt.state != RMI_UNASSIGNED ||
 			(rtt.ripas != RMI_EMPTY)) {
 		ERROR("wrong initial state\n");
@@ -1051,7 +1135,7 @@
 		ERROR("host_realm_delegate_map_protected_data failed\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_EMPTY)) {
 		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1126,14 +1210,21 @@
 	struct realm realm;
 	struct rtt_entry rtt;
 	struct rmi_rec_run *run;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE};
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 2U)) {
+			feature_flag, sl, rec_flag, 2U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1147,7 +1238,7 @@
 					realm.rmm_feat_reg0) - 1U));
 
 
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (rtt.state != RMI_UNASSIGNED) {
 		ERROR("wrong state\n");
 		goto destroy_realm;
@@ -1229,15 +1320,22 @@
 {
 	bool ret1, ret2;
 	struct realm realm;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 	u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
 	RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE}, dit;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, MAX_REC_COUNT)) {
+			feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1287,7 +1385,7 @@
 	/* Find an address not mapped in L3 */
 	base = ALIGN_DOWN(PAGE_POOL_BASE, RTT_MAP_SIZE(2U));
 	while (true) {
-		ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+		ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
 		if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
 				|| (rtt.ripas != RMI_EMPTY)) {
 			base += RTT_MAP_SIZE(2U);
@@ -1299,15 +1397,15 @@
 	INFO("base = 0x%lx\n", base);
 
 	/* Create L3 RTT entries */
-	ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3U);
+	ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		return TEST_RESULT_FAIL;
 	}
 
 	/* L3 entry should be created */
-	ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
-	if (rtt.walk_level != 3U) {
+	ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
+	if (rtt.walk_level != 3L) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		return TEST_RESULT_FAIL;
 	}
@@ -1320,7 +1418,7 @@
 	}
 
 	/* INIT_RIPAS should move state to unassigned ram */
-	ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong state after INIT_RIPAS\n");
@@ -1336,7 +1434,7 @@
 	}
 
 	/* Destroy newly created rtt, for protected IPA there should be no live L3 entry */
-	ret = host_rmi_rtt_destroy(realm->rd, base, 3U, &out_rtt, &top);
+	ret = host_rmi_rtt_destroy(realm->rd, base, 3L, &out_rtt, &top);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_destroy failed ret=0x%lx\n", ret);
 		return TEST_RESULT_FAIL;
@@ -1344,9 +1442,9 @@
 	ret = host_rmi_granule_undelegate(out_rtt);
 
 	/* Walk should terminate at L2 after RTT_DESTROY */
-	ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
-			rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2U) {
+			rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2L) {
 		ERROR("Wrong state after host_rmi_rtt_destroy\n");
 		return TEST_RESULT_FAIL;
 	}
@@ -1366,8 +1464,8 @@
 	/* Find an address not mapped in L3 */
 	base = ALIGN_DOWN(PAGE_POOL_BASE, RTT_MAP_SIZE(2U));
 	while (true) {
-		ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
-		if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+		ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
+		if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_UNASSIGNED
 				|| (rtt.ripas != RMI_EMPTY)) {
 			base += RTT_MAP_SIZE(2U);
 			continue;
@@ -1378,21 +1476,21 @@
 	INFO("base = 0x%lx\n", base);
 
 	/* Create L3 RTT entries */
-	ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3U);
+	ret = host_rmi_create_rtt_levels(realm, base, rtt.walk_level, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		return TEST_RESULT_FAIL;
 	}
 
 	/* L3 entry should be created */
-	ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
-	if (rtt.walk_level != 3U) {
+	ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
+	if (rtt.walk_level != 3L) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		return TEST_RESULT_FAIL;
 	}
 
 	/* Destroy newly created rtt, for protected IPA there should be no live L3 entry */
-	ret = host_rmi_rtt_destroy(realm->rd, base, 3U, &out_rtt, &top);
+	ret = host_rmi_rtt_destroy(realm->rd, base, 3L, &out_rtt, &top);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_destroy failed ret=0x%lx\n", ret);
 		return TEST_RESULT_FAIL;
@@ -1404,9 +1502,9 @@
 	}
 
 	/* Walk should terminate at L2 after RTT_DESTROY */
-	ret = host_rmi_rtt_readentry(realm->rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm->rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
-			rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2U) {
+			rtt.ripas != RMI_DESTROYED || rtt.walk_level != 2L) {
 		ERROR("Wrong state after host_rmi_rtt_destroy\n");
 		return TEST_RESULT_FAIL;
 	}
@@ -1459,13 +1557,20 @@
 	struct realm realm;
 	struct rtt_entry rtt;
 	u_register_t rec_flag[2U] = {RMI_RUNNABLE, RMI_RUNNABLE}, base;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 2U)) {
+			feature_flag, sl, rec_flag, 2U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1477,15 +1582,15 @@
 	base = (u_register_t)page_alloc(PAGE_SIZE);
 
 	/* Create level 3 RTT */
-	ret = host_rmi_create_rtt_levels(&realm, base, 3U, 3U);
+	ret = host_rmi_create_rtt_levels(&realm, base, 3L, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed\n");
 		goto destroy_realm;
 	}
 
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
-			(rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3U) {
+			(rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3L) {
 		ERROR("wrong initial state\n");
 		goto destroy_realm;
 	}
@@ -1497,7 +1602,7 @@
 		ERROR("host_realm_delegate_map_protected_data failed\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1510,7 +1615,7 @@
 		ERROR("host_rmi_data_destroy failed\n");
 		goto undelegate_destroy;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			rtt.ripas != RMI_DESTROYED) {
 		ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -1526,7 +1631,7 @@
 		ERROR("host_realm_delegate_map_protected_data failed\n");
 		goto undelegate_destroy;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_DESTROYED)) {
 		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1539,7 +1644,7 @@
 		ERROR("host_rmi_data_destroy failed\n");
 		goto undelegate_destroy;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			rtt.ripas != RMI_DESTROYED) {
 		ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -1556,7 +1661,7 @@
 		ERROR("host_realm_delegate_map_protected_data failed\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_EMPTY)) {
 		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1567,7 +1672,7 @@
 		ERROR("host_rmi_data_destroy failed\n");
 		goto undelegate_destroy;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			rtt.ripas != RMI_EMPTY) {
 		ERROR("Wrong state after host_rmi_data_destroy\n");
@@ -1584,7 +1689,7 @@
 			"host_rmi_rtt_init_ripas", ret, __LINE__);
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong state after INIT_RIPAS\n");
@@ -1596,7 +1701,7 @@
 		ERROR("host_realm_delegate_map_protected_data failed\n");
 		goto destroy_realm;
 	}
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
@@ -1643,13 +1748,20 @@
 	test_result_t test_result = TEST_RESULT_FAIL;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
 	struct realm realm;
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		goto destroy_realm;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1700,7 +1812,7 @@
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			feature_flag, rec_flag, 4U)) {
+			feature_flag, RTT_MIN_LEVEL, rec_flag, 4U)) {
 		return TEST_RESULT_FAIL;
 	}
 	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
@@ -1840,13 +1952,20 @@
 	struct realm realm;
 	struct rtt_entry rtt;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ERROR("Realm creation failed\n");
 		goto destroy_realm;
 	}
@@ -1858,7 +1977,7 @@
 	/* Find an address not mapped at L1 and mapped at L0 as unassigned empty */
 	base = ALIGN_DOWN(TFTF_BASE, RTT_MAP_SIZE(1U));
 	while (true) {
-		ret = host_rmi_rtt_readentry(realm.rd, base, 1U, &rtt);
+		ret = host_rmi_rtt_readentry(realm.rd, base, 1L, &rtt);
 		if (ret != RMI_SUCCESS || rtt.walk_level > 0U || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_EMPTY)) {
 			base += RTT_MAP_SIZE(1U);
@@ -1874,94 +1993,94 @@
 	INFO("base=0x%lx\n", base);
 
 	/* Create RTT entries */
-	ret = host_rmi_create_rtt_levels(&realm, base, 0U, 3U);
+	ret = host_rmi_create_rtt_levels(&realm, base, 0L, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* L3 entry is expected now */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_EMPTY)) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, base, 3U);
+	ret = host_realm_fold_rtt(realm.rd, base, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* Walk should terminate at L2 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_EMPTY)) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, base, 2U);
+	ret = host_realm_fold_rtt(realm.rd, base, 2L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* Walk should terminate at L1 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_EMPTY)) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, base, 1U);
+	ret = host_realm_fold_rtt(realm.rd, base, 1L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* Walk should terminate at L0 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 0U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 0L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_EMPTY)) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* Create RTT entries will cause unfold operation */
-	ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3U);
+	ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* L3 entry should be created */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_EMPTY)) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	res = TEST_RESULT_SUCCESS;
@@ -1996,13 +2115,20 @@
 	struct realm realm;
 	struct rtt_entry rtt;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ERROR("Realm creation failed\n");
 		goto destroy_realm;
 	}
@@ -2014,8 +2140,8 @@
 	/* Find an address not mapped at L1 and mapped at L0 as unassigned empty */
 	base = ALIGN_DOWN(TFTF_BASE, RTT_MAP_SIZE(1U));
 	while (true) {
-		ret = host_rmi_rtt_readentry(realm.rd, base, 1U, &rtt);
-		if (ret != RMI_SUCCESS || rtt.walk_level > 0U || rtt.state != RMI_UNASSIGNED
+		ret = host_rmi_rtt_readentry(realm.rd, base, 1L, &rtt);
+		if (ret != RMI_SUCCESS || rtt.walk_level > 0L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_EMPTY)) {
 			base += RTT_MAP_SIZE(1U);
 			if (host_ipa_is_ns(base, realm.rmm_feat_reg0)) {
@@ -2039,9 +2165,9 @@
 		goto destroy_realm;
 	}
 
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
-			(rtt.ripas != RMI_RAM) || rtt.walk_level != 0U) {
+			(rtt.ripas != RMI_RAM) || rtt.walk_level != 0L) {
 		ERROR("wrong initial state\n");
 		goto destroy_realm;
 	}
@@ -2049,94 +2175,94 @@
 	INFO("base=0x%lx\n", base);
 
 	/* Create RTT entries */
-	ret = host_rmi_create_rtt_levels(&realm, base, 0U, 3U);
+	ret = host_rmi_create_rtt_levels(&realm, base, 0L, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* L3 entry should be created */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_RAM)) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, base, 3U);
+	ret = host_realm_fold_rtt(realm.rd, base, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* Walk should terminate at L2 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_RAM)) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, base, 2U);
+	ret = host_realm_fold_rtt(realm.rd, base, 2L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* Walk should terminate at L1 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_RAM)) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, base, 1U);
+	ret = host_realm_fold_rtt(realm.rd, base, 1L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* Walk should terminate at L0 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 0U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 0L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_RAM)) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* Create RTT entries will cause unfold operation */
-	ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3U);
+	ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* L3 entry should be created */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_UNASSIGNED
 			|| (rtt.ripas != RMI_RAM)) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	res = TEST_RESULT_SUCCESS;
@@ -2170,13 +2296,20 @@
 	struct realm realm;
 	struct rtt_entry rtt;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ERROR("Realm creation failed\n");
 		goto destroy_realm;
 	}
@@ -2204,55 +2337,55 @@
 		goto destroy_realm;
 	}
 
-	ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_ASSIGNED) {
-		INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+	ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_ASSIGNED) {
+		INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 		rtt.state, rtt.walk_level, rtt.out_addr);
 
 	/* Unfold Create L2 RTT entries */
-	ret = host_rmi_create_rtt_levels(&realm, ns_ipa, 1U, 2U);
+	ret = host_rmi_create_rtt_levels(&realm, ns_ipa, 1L, 2L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 	}
 
-	ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_ASSIGNED) {
+	ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_ASSIGNED) {
 		ERROR("Initial realm table creation changed\n");
-		INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+		INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 		rtt.state, rtt.walk_level, rtt.out_addr);
 
 	INFO("Fold L2\n");
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, ns_ipa, 2U);
+	ret = host_realm_fold_rtt(realm.rd, ns_ipa, 2L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* Walk should terminate at L1 */
-	ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_ASSIGNED) {
+	ret = host_rmi_rtt_readentry(realm.rd, ns_ipa, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 1L || rtt.state != RMI_ASSIGNED) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr);
 
 	res = TEST_RESULT_SUCCESS;
 	INFO("unmap\n\n");
 
 	/* unmap */
-	ret = host_rmi_rtt_unmap_unprotected(realm.rd, ns_ipa, 1U, &top);
+	ret = host_rmi_rtt_unmap_unprotected(realm.rd, ns_ipa, 1L, &top);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_mapunprotected failed ret=0x%lx\n", ret);
 	}
@@ -2284,13 +2417,20 @@
 	struct realm realm;
 	struct rtt_entry rtt;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ERROR("Realm creation failed\n");
 		goto destroy_realm;
 	}
@@ -2315,9 +2455,9 @@
 	}
 
 	INFO("base=0x%lx\n", base);
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
-			(rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3U) {
+			(rtt.ripas != RMI_EMPTY) || rtt.walk_level != 3L) {
 		ERROR("wrong state after DATA_CRATE_UNKNOWN\n");
 		goto undelegate_destroy;
 	}
@@ -2330,32 +2470,32 @@
 	}
 
 	/* Walk should terminate at L2 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_ASSIGNED ||
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_ASSIGNED ||
 			rtt.ripas != RMI_EMPTY) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				" rtt.walk_level=0x%lx rtt.out_addr=0x%llx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr);
 		goto undelegate_destroy;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* Create L3 RTT entries */
-	ret = host_rmi_create_rtt_levels(&realm, base, 2U, 3U);
+	ret = host_rmi_create_rtt_levels(&realm, base, 2L, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* L3 entry should be created */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_ASSIGNED ||
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_ASSIGNED ||
 			rtt.ripas != RMI_EMPTY) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	res = TEST_RESULT_SUCCESS;
@@ -2395,13 +2535,20 @@
 	struct realm realm;
 	struct rtt_entry rtt;
 	u_register_t rec_flag[] = {RMI_RUNNABLE};
+	u_register_t feature_flag = 0UL;
+	long sl = RTT_MIN_LEVEL;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
+
 	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
 			(u_register_t)PAGE_POOL_MAX_SIZE,
-			0UL, rec_flag, 1U)) {
+			feature_flag, sl, rec_flag, 1U)) {
 		ERROR("Realm creation failed\n");
 		goto destroy_realm;
 	}
@@ -2428,7 +2575,7 @@
 	}
 
 	/* INIT_RIPAS should move state to unassigned ram */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
 	if (ret != RMI_SUCCESS || rtt.state != RMI_ASSIGNED ||
 			(rtt.ripas != RMI_RAM)) {
 		ERROR("wrong state after INIT_RIPAS\n");
@@ -2437,39 +2584,39 @@
 	host_realm_activate(&realm);
 
 	/* RTT Fold */
-	ret = host_realm_fold_rtt(realm.rd, base, 3U);
+	ret = host_realm_fold_rtt(realm.rd, base, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
 		goto undelegate_destroy;
 	}
 
 	/* Walk should terminate at L2 */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_ASSIGNED ||
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 2L || rtt.state != RMI_ASSIGNED ||
 			rtt.ripas != RMI_RAM) {
 		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
-			" rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+			" rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
 				ret, rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 		goto undelegate_destroy;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	/* Create L3 RTT entries */
-	ret = host_rmi_create_rtt_levels(&realm, base, 2U, 3U);
+	ret = host_rmi_create_rtt_levels(&realm, base, 2L, 3L);
 	if (ret != RMI_SUCCESS) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
 
 	/* L3 entry should be created */
-	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
-	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_ASSIGNED ||
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3L, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3L || rtt.state != RMI_ASSIGNED ||
 			rtt.ripas != RMI_RAM) {
 		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
 		goto destroy_realm;
 	}
-	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx ripas=0x%lx\n",
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%lx rtt.out_addr=0x%llx ripas=0x%lx\n",
 			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
 
 	res = TEST_RESULT_SUCCESS;
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_spm.c b/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
index 51b87e7..589888e 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_spm.c
@@ -52,13 +52,21 @@
 static test_result_t init_realm(void)
 {
 	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	u_register_t feature_flag = 0U;
+	long sl = RTT_MIN_LEVEL;
+
+	if (is_feat_52b_on_4k_2_supported() == true) {
+		feature_flag = RMI_FEATURE_REGISTER_0_LPA2;
+		sl = RTT_MIN_LEVEL_LPA2;
+	}
 
 	/*
 	 * Initialise Realm payload
 	 */
 	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
 			(u_register_t)PAGE_POOL_BASE,
-			(u_register_t)PAGE_POOL_MAX_SIZE, 0UL, rec_flag, 1U)) {
+			(u_register_t)PAGE_POOL_MAX_SIZE,
+			feature_flag, sl, rec_flag, 1U)) {
 		return TEST_RESULT_FAIL;
 	}