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