chore(rme): dev granules delegation tests
Modify device granules delegatation tests to use
all existing PCIe memory regions.
Seed the random number generator by reading RNDR register.
Change-Id: I8f6f0d321a71f1913c63dbab50b2085b308ded58
Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
diff --git a/tftf/tests/runtime_services/host_realm_managment/rmi_dev_delegate_tests.c b/tftf/tests/runtime_services/host_realm_managment/rmi_dev_delegate_tests.c
index b4f7c51..554029c 100644
--- a/tftf/tests/runtime_services/host_realm_managment/rmi_dev_delegate_tests.c
+++ b/tftf/tests/runtime_services/host_realm_managment/rmi_dev_delegate_tests.c
@@ -20,11 +20,11 @@
static test_result_t host_multi_cpu_payload_dev_del_undel(void);
-/* Test 2MB of PCIe memory region 2 */
-#define PCIE_MEM_2_TEST_SIZE SZ_2M
+/* Test 2MB of PCIe memory region */
+#define PCIE_MEM_TEST_SIZE SZ_2M
/* Number of dev granules to test */
-#define NUM_DEV_GRANULES ((PCIE_MEM_2_TEST_SIZE / GRANULE_SIZE) / \
+#define NUM_DEV_GRANULES ((PCIE_MEM_TEST_SIZE / GRANULE_SIZE) / \
PLATFORM_CORE_COUNT)
/* Buffer to delegate and undelegate */
@@ -43,22 +43,27 @@
* attempting to perform a delegation on the same dev granule
* twice and then testing a misaligned address.
*/
-static test_result_t host_init_buffer_dev_del(void)
+test_result_t host_init_buffer_dev_del(unsigned int num_reg)
{
- __unused size_t dev_size;
+ size_t dev_size;
- host_rmi_init_cmp_result();
+ /* Retrieve platform PCIe memory region */
+ int res = plat_get_dev_region((uint64_t *)&bufferdelegate, &dev_size,
+ DEV_MEM_NON_COHERENT, num_reg);
- /* Retrieve platform PCIe memory region 2 */
- if (plat_get_dev_region((uint64_t *)&bufferdelegate, &dev_size,
- DEV_MEM_NON_COHERENT, 1U) != 0) {
- tftf_testcase_printf("Cannot retrieve PCIe memory region 2\n");
+ if ((res != 0) || (dev_size < PCIE_MEM_TEST_SIZE)) {
return TEST_RESULT_SKIPPED;
}
- assert(dev_size >= PCIE_MEM_2_TEST_SIZE);
+ tftf_testcase_printf("Testing PCIe memory region %u 0x%lx-0x%lx\n",
+ num_reg, (uintptr_t)bufferdelegate,
+ (uintptr_t)bufferdelegate + PCIE_MEM_TEST_SIZE - 1UL);
- for (uint32_t i = 0; i < (NUM_DEV_GRANULES * PLATFORM_CORE_COUNT) ; i++) {
+ /* Seed the random number generator */
+ assert(is_feat_rng_present());
+ srand((unsigned int)read_rndr());
+
+ for (unsigned int i = 0; i < (NUM_DEV_GRANULES * PLATFORM_CORE_COUNT) ; i++) {
if ((rand() & 1) == 0) {
u_register_t retrmm = host_rmi_granule_delegate(
(u_register_t)&bufferdelegate[i * GRANULE_SIZE]);
@@ -74,45 +79,62 @@
}
}
- return host_cmp_result();
+ return TEST_RESULT_SUCCESS;
}
/*
- * Delegate and Undelegate Non-Secure Dev Granule
+ * Delegate and Undelegate Non-Secure Device Granules
*/
test_result_t host_dev_mem_delegate_undelegate(void)
{
- __unused size_t dev_size;
- u_register_t retrmm, rmi_feat_reg0;
+ u_register_t rmi_feat_reg0;
+ unsigned int num_reg = 0U;
CHECK_DA_SUPPORT_IN_RMI(rmi_feat_reg0);
host_rmi_init_cmp_result();
- /* Retrieve platform PCIe memory region 2 */
- if (plat_get_dev_region((uint64_t *)&bufferdelegate, &dev_size,
- DEV_MEM_NON_COHERENT, 1U) != 0) {
- tftf_testcase_printf("Cannot retrieve PCIe memory region 2\n");
+ while (true) {
+ size_t dev_size;
+ u_register_t retrmm;
+
+ /* Retrieve platform PCIe memory region */
+ int res = plat_get_dev_region((uint64_t *)&bufferdelegate,
+ &dev_size, DEV_MEM_NON_COHERENT,
+ num_reg);
+
+ if ((res != 0) || (dev_size < PCIE_MEM_TEST_SIZE)) {
+ break;
+ }
+
+ tftf_testcase_printf("Testing PCIe memory region %u 0x%lx-0x%lx\n",
+ num_reg, (uintptr_t)bufferdelegate,
+ (uintptr_t)bufferdelegate + PCIE_MEM_TEST_SIZE - 1UL);
+
+ retrmm = host_rmi_granule_delegate((u_register_t)bufferdelegate);
+ if (retrmm != RMI_SUCCESS) {
+ tftf_testcase_printf("Delegate operation returns 0x%lx\n",
+ retrmm);
+ return TEST_RESULT_FAIL;
+ }
+
+ retrmm = host_rmi_granule_undelegate((u_register_t)bufferdelegate);
+ if (retrmm != RMI_SUCCESS) {
+ tftf_testcase_printf("Undelegate operation returns 0x%lx\n",
+ retrmm);
+ return TEST_RESULT_FAIL;
+ }
+ tftf_testcase_printf("Delegate and undelegate of buffer 0x%lx succeeded\n",
+ (u_register_t)bufferdelegate);
+
+ ++num_reg;
+ }
+
+ /* No memory regions for test found */
+ if (num_reg == 0U) {
return TEST_RESULT_SKIPPED;
}
- assert(dev_size >= PCIE_MEM_2_TEST_SIZE);
-
- retrmm = host_rmi_granule_delegate((u_register_t)bufferdelegate);
- if (retrmm != RMI_SUCCESS) {
- tftf_testcase_printf("Delegate operation returns 0x%lx\n",
- retrmm);
- return TEST_RESULT_FAIL;
- }
- retrmm = host_rmi_granule_undelegate((u_register_t)bufferdelegate);
- if (retrmm != RMI_SUCCESS) {
- tftf_testcase_printf("Undelegate operation returns 0x%lx\n",
- retrmm);
- return TEST_RESULT_FAIL;
- }
- tftf_testcase_printf("Delegate and undelegate of buffer 0x%lx succeeded\n",
- (u_register_t)bufferdelegate);
-
return host_cmp_result();
}
@@ -122,9 +144,8 @@
*/
test_result_t host_dev_mem_delundel_multi_cpu(void)
{
- u_register_t lead_mpid, target_mpid, retrmm, rmi_feat_reg0;
- int32_t ret;
- unsigned int cpu_node;
+ u_register_t rmi_feat_reg0, lead_mpid;
+ unsigned int num_reg = 0U;
CHECK_DA_SUPPORT_IN_RMI(rmi_feat_reg0);
@@ -132,55 +153,69 @@
host_rmi_init_cmp_result();
- retrmm = host_init_buffer_dev_del();
- if (retrmm != TEST_RESULT_SUCCESS) {
- return retrmm;
- }
+ while (true) {
+ u_register_t target_mpid, retrmm;
+ unsigned int cpu_node;
- for_each_cpu(cpu_node) {
- target_mpid = (u_register_t)tftf_get_mpidr_from_node(cpu_node) & MPID_MASK;
-
- if (lead_mpid == target_mpid) {
- continue;
- }
-
- ret = tftf_cpu_on(target_mpid,
- (uintptr_t)host_multi_cpu_payload_dev_del_undel, 0UL);
-
- if (ret != PSCI_E_SUCCESS) {
- ERROR("CPU ON failed for 0x%lx\n", target_mpid);
+ retrmm = host_init_buffer_dev_del(num_reg);
+ if (retrmm == TEST_RESULT_SKIPPED) {
+ break;
+ } else if (retrmm == TEST_RESULT_FAIL) {
return TEST_RESULT_FAIL;
}
- }
+ for_each_cpu(cpu_node) {
+ int32_t ret;
- for_each_cpu(cpu_node) {
- target_mpid = (u_register_t)tftf_get_mpidr_from_node(cpu_node) & MPID_MASK;
+ target_mpid = (u_register_t)tftf_get_mpidr_from_node(cpu_node) & MPID_MASK;
- if (lead_mpid == target_mpid) {
- continue;
- }
+ if (lead_mpid == target_mpid) {
+ continue;
+ }
- while (tftf_psci_affinity_info(target_mpid, MPIDR_AFFLVL0) !=
- PSCI_STATE_OFF) {
- continue;
- }
- }
-
- /*
- * Cleanup to set all dev granules back to undelegated
- */
- for (unsigned int i = 0U; i < (NUM_DEV_GRANULES * PLATFORM_CORE_COUNT) ; i++) {
- if (bufferstate[i] == B_DELEGATED) {
- retrmm = host_rmi_granule_undelegate(
- (u_register_t)&bufferdelegate[i * GRANULE_SIZE]);
- if (retrmm != RMI_SUCCESS) {
- tftf_testcase_printf("Undelegate operation returns 0x%lx\n",
- retrmm);
+ ret = tftf_cpu_on(target_mpid,
+ (uintptr_t)host_multi_cpu_payload_dev_del_undel, 0UL);
+ if (ret != PSCI_E_SUCCESS) {
+ ERROR("CPU ON failed for 0x%lx\n", target_mpid);
return TEST_RESULT_FAIL;
}
- bufferstate[i] = B_UNDELEGATED;
}
+
+ for_each_cpu(cpu_node) {
+ target_mpid = (u_register_t)tftf_get_mpidr_from_node(cpu_node) & MPID_MASK;
+
+ if (lead_mpid == target_mpid) {
+ continue;
+ }
+
+ while (tftf_psci_affinity_info(target_mpid, MPIDR_AFFLVL0) !=
+ PSCI_STATE_OFF) {
+ continue;
+ }
+ }
+
+ /*
+ * Cleanup to set all dev granules back to undelegated
+ */
+ for (unsigned int i = 0U; i < (NUM_DEV_GRANULES * PLATFORM_CORE_COUNT) ; i++) {
+ if (bufferstate[i] == B_DELEGATED) {
+ retrmm = host_rmi_granule_undelegate(
+ (u_register_t)&bufferdelegate[i * GRANULE_SIZE]);
+ if (retrmm != RMI_SUCCESS) {
+ tftf_testcase_printf("Undelegate operation returns 0x%lx\n",
+ retrmm);
+ return TEST_RESULT_FAIL;
+ }
+ bufferstate[i] = B_UNDELEGATED;
+ }
+ }
+
+ ++num_reg;
+ }
+
+ /* No memory regions for test found */
+ if (num_reg == 0U) {
+ return TEST_RESULT_SKIPPED;
}
return host_cmp_result();
@@ -195,24 +230,15 @@
*/
static test_result_t host_multi_cpu_payload_dev_del_undel(void)
{
- __unused size_t dev_size;
- u_register_t retrmm;
unsigned int cpu_node;
- /* Retrieve platform PCIe memory region 2 */
- if (plat_get_dev_region((uint64_t *)&bufferdelegate, &dev_size,
- DEV_MEM_NON_COHERENT, 1U) != 0) {
- tftf_testcase_printf("Cannot retrieve PCIe memory region 2\n");
- return TEST_RESULT_SKIPPED;
- }
-
- assert(dev_size >= PCIE_MEM_2_TEST_SIZE);
-
cpu_node = platform_get_core_pos(read_mpidr_el1() & MPID_MASK);
host_rmi_init_cmp_result();
for (unsigned int i = 0U; i < NUM_DEV_GRANULES; i++) {
+ u_register_t retrmm;
+
if (bufferstate[((cpu_node * NUM_DEV_GRANULES) + i)] == B_UNDELEGATED) {
retrmm = host_rmi_granule_delegate((u_register_t)
&bufferdelegate[((cpu_node * NUM_DEV_GRANULES) + i) *
@@ -246,51 +272,68 @@
*/
test_result_t host_fail_dev_mem_del(void)
{
- __unused size_t dev_size;
- u_register_t retrmm, rmi_feat_reg0;
+ u_register_t rmi_feat_reg0;
+ unsigned int num_reg = 0U;
CHECK_DA_SUPPORT_IN_RMI(rmi_feat_reg0);
- /* Retrieve platform PCIe memory region 2 */
- if (plat_get_dev_region((uint64_t *)&bufferdelegate, &dev_size,
- DEV_MEM_NON_COHERENT, 1U) != 0) {
- tftf_testcase_printf("Cannot retrieve PCIe memory region 2\n");
- return TEST_RESULT_SKIPPED;
- }
-
- assert(dev_size >= PCIE_MEM_2_TEST_SIZE);
-
host_rmi_init_cmp_result();
- retrmm = host_rmi_granule_delegate((u_register_t)&bufferdelegate[0]);
- if (retrmm != RMI_SUCCESS) {
- tftf_testcase_printf
- ("Delegate operation does not pass as expected for double delegation,"
+ while (true) {
+ size_t dev_size;
+ u_register_t retrmm;
+
+ /* Retrieve platform PCIe memory region */
+ int res = plat_get_dev_region((uint64_t *)&bufferdelegate, &dev_size,
+ DEV_MEM_NON_COHERENT, num_reg);
+
+ if ((res != 0) || (dev_size < PCIE_MEM_TEST_SIZE)) {
+ break;
+ }
+
+ tftf_testcase_printf("Testing PCIe memory region %u 0x%lx-0x%lx\n",
+ num_reg, (uintptr_t)bufferdelegate,
+ (uintptr_t)bufferdelegate + PCIE_MEM_TEST_SIZE - 1UL);
+
+ retrmm = host_rmi_granule_delegate((u_register_t)&bufferdelegate[0]);
+ if (retrmm != RMI_SUCCESS) {
+ tftf_testcase_printf(
+ "Delegate operation does not pass as"
+ "expected for double delegation, 0x%lx\n",
+ retrmm);
+ return TEST_RESULT_FAIL;
+ }
+
+ retrmm = host_rmi_granule_delegate((u_register_t)&bufferdelegate[0]);
+ if (retrmm == RMI_SUCCESS) {
+ tftf_testcase_printf(
+ "Delegate operation does not fail as"
+ "expected for double delegation, 0x%lx\n",
+ retrmm);
+ return TEST_RESULT_FAIL;
+ }
+
+ retrmm = host_rmi_granule_undelegate((u_register_t)&bufferdelegate[1]);
+ if (retrmm == RMI_SUCCESS) {
+ tftf_testcase_printf(
+ "Undelegate operation does not fail for misaligned address,"
" 0x%lx\n", retrmm);
- return TEST_RESULT_FAIL;
+ return TEST_RESULT_FAIL;
+ }
+
+ retrmm = host_rmi_granule_undelegate((u_register_t)&bufferdelegate[0]);
+ if (retrmm != RMI_SUCCESS) {
+ tftf_testcase_printf(
+ "Undelegate operation fails for cleanup, 0x%lx\n", retrmm);
+ return TEST_RESULT_FAIL;
+ }
+
+ ++num_reg;
}
- retrmm = host_rmi_granule_delegate((u_register_t)&bufferdelegate[0]);
- if (retrmm == RMI_SUCCESS) {
- tftf_testcase_printf
- ("Delegate operation does not fail as expected for double delegation,"
- " 0x%lx\n", retrmm);
- return TEST_RESULT_FAIL;
- }
-
- retrmm = host_rmi_granule_undelegate((u_register_t)&bufferdelegate[1]);
- if (retrmm == RMI_SUCCESS) {
- tftf_testcase_printf
- ("Undelegate operation does not return fail for misaligned address,"
- " 0x%lx\n", retrmm);
- return TEST_RESULT_FAIL;
- }
-
- retrmm = host_rmi_granule_undelegate((u_register_t)&bufferdelegate[0]);
- if (retrmm != RMI_SUCCESS) {
- tftf_testcase_printf
- ("Undelegate operation returns fail for cleanup, 0x%lx\n", retrmm);
- return TEST_RESULT_FAIL;
+ /* No memory regions for test found */
+ if (num_reg == 0U) {
+ return TEST_RESULT_SKIPPED;
}
return host_cmp_result();