test(sdei): SDEI event signaling state (registered, enabled, unmasked)
This patch adds a test to check whether only a registered, enabled
and unmasked SDEI event can be signaled successfully.
In other conditions the event signaling process should fail early.
Change-Id: I3ce76ed060bc32648cea43dcce65b707d97c3a78
Signed-off-by: Igor Podgainõi <igor.podgainoi@arm.com>
Signed-off-by: Govindraj Raja <govindraj.raja@arm.com>
diff --git a/tftf/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c b/tftf/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c
index ca8b63d..16004f4 100644
--- a/tftf/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c
+++ b/tftf/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Arm Limited. All rights reserved.
+ * Copyright (c) 2018-2025, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -253,7 +253,7 @@
return TEST_RESULT_FAIL;
}
-static test_result_t sdei_event_signal_self(void)
+static test_result_t sdei_event_signal_self(bool enable, bool unmask)
{
long long ret;
@@ -265,16 +265,20 @@
return TEST_RESULT_FAIL;
}
- ret = sdei_event_enable(0);
- if (ret < 0) {
- tftf_testcase_printf("SDEI event enable failed: 0x%llx\n", ret);
- goto err0;
+ if (enable) {
+ ret = sdei_event_enable(0);
+ if (ret < 0) {
+ tftf_testcase_printf("SDEI event enable failed: 0x%llx\n", ret);
+ goto err0;
+ }
}
- ret = sdei_pe_unmask();
- if (ret < 0) {
- tftf_testcase_printf("SDEI pe unmask failed: 0x%llx\n", ret);
- goto err1;
+ if (unmask) {
+ ret = sdei_pe_unmask();
+ if (ret < 0) {
+ tftf_testcase_printf("SDEI pe unmask failed: 0x%llx\n", ret);
+ goto err1;
+ }
}
ret = sdei_event_signal(read_mpidr_el1());
@@ -298,6 +302,11 @@
return TEST_RESULT_SUCCESS;
}
+static test_result_t sdei_event_signal_self_all(void)
+{
+ return sdei_event_signal_self(true, true);
+}
+
/* Each core signals itself using SDEI event signalling. */
test_result_t test_sdei_event_signal_serial(void)
{
@@ -319,9 +328,9 @@
if (lead_mpid == target_mpid)
continue;
ret = tftf_cpu_on(target_mpid,
- (uintptr_t)sdei_event_signal_self, 0);
+ (uintptr_t)sdei_event_signal_self_all, 0);
if (ret != PSCI_E_SUCCESS) {
- ERROR("CPU ON failed for 0x0x%llx\n",
+ ERROR("CPU ON failed for 0x%llx\n",
(unsigned long long)target_mpid);
ret = -1;
goto err0;
@@ -331,7 +340,7 @@
continue;
}
- if (sdei_event_signal_self() != TEST_RESULT_SUCCESS) {
+ if (sdei_event_signal_self_all() != TEST_RESULT_SUCCESS) {
ret = -1;
goto err0;
}
@@ -445,3 +454,62 @@
return TEST_RESULT_FAIL;
return TEST_RESULT_SUCCESS;
}
+
+/* SDEI event signaling state should be: registered, enabled, unmasked */
+test_result_t test_sdei_event_signal_state(void)
+{
+ long long ret;
+
+ ret = sdei_version();
+ if (ret != MAKE_SDEI_VERSION(1, 0, 0)) {
+ tftf_testcase_printf("Unexpected SDEI version: 0x%llx\n", ret);
+ return TEST_RESULT_SKIPPED;
+ }
+
+ disable_irq();
+ if (sdei_event_signal_self(true, true) == TEST_RESULT_FAIL) {
+ tftf_testcase_printf("UNEXPECTED: SDEI event signaling failed when "
+ "enabled and unmasked\n");
+ ret = -1;
+ goto err0;
+ } else {
+ tftf_testcase_printf("EXPECTED: SDEI event signaling succeeded when "
+ "enabled and unmasked\n");
+ }
+
+ if (sdei_event_signal_self(false, true) == TEST_RESULT_SUCCESS) {
+ tftf_testcase_printf("UNEXPECTED: SDEI event signaling succeeded when "
+ "disabled and unmasked\n");
+ ret = -1;
+ goto err0;
+ } else {
+ tftf_testcase_printf("EXPECTED: SDEI event signaling failed when "
+ "disabled and unmasked\n");
+ }
+
+ if (sdei_event_signal_self(true, false) == TEST_RESULT_SUCCESS) {
+ tftf_testcase_printf("UNEXPECTED: SDEI event signaling succeeded when "
+ "enabled and masked\n");
+ ret = -1;
+ goto err0;
+ } else {
+ tftf_testcase_printf("EXPECTED: SDEI event signaling failed when "
+ "enabled and masked\n");
+ }
+
+ if (sdei_event_signal_self(false, false) == TEST_RESULT_SUCCESS) {
+ tftf_testcase_printf("UNEXPECTED: SDEI event signaling succeeded when "
+ "disabled and masked\n");
+ ret = -1;
+ goto err0;
+ } else {
+ tftf_testcase_printf("EXPECTED: SDEI event signaling failed when "
+ "disabled and masked\n");
+ }
+
+err0:
+ enable_irq();
+ if (ret < 0)
+ return TEST_RESULT_FAIL;
+ return TEST_RESULT_SUCCESS;
+}
diff --git a/tftf/tests/tests-sdei.xml b/tftf/tests/tests-sdei.xml
index 45411f3..42c2628 100644
--- a/tftf/tests/tests-sdei.xml
+++ b/tftf/tests/tests-sdei.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (c) 2020-2024, Arm Limited. All rights reserved.
+ Copyright (c) 2020-2025, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
-->
@@ -12,6 +12,7 @@
<testcase name="SDEI event handler state machine testing" function="test_sdei_state" />
<testcase name="SDEI event handling on all cores in sequence" function="test_sdei_event_serial" />
<testcase name="SDEI event handling on all cores in parallel" function="test_sdei_event_parallel" />
+ <testcase name="SDEI event signaling state: registered, enabled, unmasked" function="test_sdei_event_signal_state" />
<testcase name="SDEI event signaling: each core signals itself" function="test_sdei_event_signal_serial" />
<testcase name="SDEI event signaling: one core signals all others" function="test_sdei_event_signal_all" />
<testcase name="SDEI event routing all: SPI events routed to all CPUs" function="test_sdei_routing_any" />