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