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 */