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