summaryrefslogtreecommitdiff
path: root/tests/runtime_services
diff options
context:
space:
mode:
authorDimitris Papastamos <dimitris.papastamos@arm.com>2017-10-05 10:10:01 +0100
committerSandrine Bailleux <sandrine.bailleux@arm.com>2017-11-06 09:39:30 +0000
commit77ecdca13bb799f7e4d6308eb20df0028f2e1b7a (patch)
treef7707427d70a271b20e71579c0048d0200637317 /tests/runtime_services
parent8303490074ad3ef343917991e8e93d4ed62a4228 (diff)
sdei: Rework calls to sdei_interrupt_{bind,release}
To allow for this function to be reused, move the call to sdei_interrupt_{bind,release} to the parent function. This is needed for adding a test-case to stress the SDEI flow on all cores in parallel. Change-Id: I1dc7110e4bed5c491d321ac444eb1a5d04d1b21a Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat (limited to 'tests/runtime_services')
-rw-r--r--tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c85
1 files changed, 37 insertions, 48 deletions
diff --git a/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c b/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c
index 3a1841b..fb8fffb 100644
--- a/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c
+++ b/tests/runtime_services/standard_service/sdei/system_tests/test_sdei.c
@@ -38,6 +38,8 @@
#include <tftf_lib.h>
#include <timer.h>
+#define EV_COOKIE 0xB16B00B5
+
extern sdei_handler_t sdei_entrypoint;
extern sdei_handler_t sdei_entrypoint_resume;
extern void sdei_handler_done(void);
@@ -48,43 +50,33 @@ static void sdei_trigger_event(void)
tftf_program_timer(10);
}
+static int bound_ev;
+
static test_result_t sdei_event(void)
{
- struct sdei_intr_ctx intr_ctx;
long long ret;
- int ev;
printf("%s: mpidr = 0x%llx\n", __func__,
(unsigned long long)read_mpidr_el1());
- /* SDEI handling needs to work even with IRQs disabled. */
- disable_irq();
-
- ev = sdei_interrupt_bind(IRQ_CNTPSIRQ1, &intr_ctx);
- if (ev < 0) {
- tftf_testcase_printf("SDEI interrupt bind failed: %x\n", ev);
- ret = -1;
- goto err0;
- }
-
- ret = sdei_event_register(ev, sdei_entrypoint_resume, 0xB16B00B5,
+ ret = sdei_event_register(bound_ev, sdei_entrypoint_resume, EV_COOKIE,
SDEI_REGF_RM_PE, read_mpidr_el1());
if (ret < 0) {
tftf_testcase_printf("SDEI event register failed: 0x%llx\n",
ret);
- goto err1;
+ return TEST_RESULT_FAIL;
}
- ret = sdei_event_enable(ev);
+ ret = sdei_event_enable(bound_ev);
if (ret < 0) {
tftf_testcase_printf("SDEI event enable failed: 0x%llx\n", ret);
- goto err2;
+ goto err0;
}
ret = sdei_pe_unmask();
if (ret < 0) {
tftf_testcase_printf("SDEI pe unmask failed: 0x%llx\n", ret);
- goto err3;
+ goto err1;
}
sdei_trigger_event();
@@ -93,14 +85,10 @@ static test_result_t sdei_event(void)
sdei_pe_mask();
-err3:
- sdei_event_disable(ev);
-err2:
- sdei_event_unregister(ev);
err1:
- sdei_interrupt_release(ev, &intr_ctx);
+ sdei_event_disable(bound_ev);
err0:
- enable_irq();
+ sdei_event_unregister(bound_ev);
if (ret < 0)
return TEST_RESULT_FAIL;
@@ -111,7 +99,7 @@ err0:
int sdei_event_handler(int ev, unsigned long long arg)
{
printf("%s: handler fired\n", __func__);
- assert(arg == 0xB16B00B5);
+ assert(arg == EV_COOKIE);
tftf_cancel_timer();
return 0;
}
@@ -119,17 +107,25 @@ int sdei_event_handler(int ev, unsigned long long arg)
/* Handle an SDEI event on all cores in sequence. */
test_result_t test_sdei_event_serial(void)
{
+ struct sdei_intr_ctx intr_ctx;
u_register_t lead_mpid, target_mpid;
int cpu_node;
long long ret;
+ lead_mpid = read_mpidr_el1() & MPID_MASK;
+
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;
}
- lead_mpid = read_mpidr_el1() & MPID_MASK;
+ bound_ev = sdei_interrupt_bind(IRQ_CNTPSIRQ1, &intr_ctx);
+ if (bound_ev < 0) {
+ tftf_testcase_printf("SDEI interrupt bind failed: %x\n",
+ bound_ev);
+ return TEST_RESULT_FAIL;
+ }
for_each_cpu(cpu_node) {
target_mpid = tftf_get_mpidr_from_node(cpu_node) & MPID_MASK;
@@ -140,6 +136,7 @@ test_result_t test_sdei_event_serial(void)
if (ret != PSCI_E_SUCCESS) {
ERROR("CPU ON failed for 0x0x%llx\n",
(unsigned long long)target_mpid);
+ sdei_interrupt_release(bound_ev, &intr_ctx);
return TEST_RESULT_FAIL;
}
while (tftf_psci_affinity_info(target_mpid, MPIDR_AFFLVL0) !=
@@ -147,8 +144,10 @@ test_result_t test_sdei_event_serial(void)
continue;
}
- if (sdei_event() != TEST_RESULT_SUCCESS)
+ if (sdei_event() != TEST_RESULT_SUCCESS) {
+ sdei_interrupt_release(bound_ev, &intr_ctx);
return TEST_RESULT_FAIL;
+ }
return TEST_RESULT_SUCCESS;
}
@@ -157,45 +156,40 @@ static test_result_t sdei_event_signal_self(void)
{
long long ret;
- /* SDEI handling needs to work even with IRQs disabled. */
- disable_irq();
-
ret = sdei_event_register(0, sdei_entrypoint_resume, 0xB16B00B5,
SDEI_REGF_RM_PE, read_mpidr_el1());
if (ret < 0) {
tftf_testcase_printf("SDEI event register failed: 0x%llx\n",
ret);
- goto err0;
+ return TEST_RESULT_FAIL;
}
ret = sdei_event_enable(0);
if (ret < 0) {
tftf_testcase_printf("SDEI event enable failed: 0x%llx\n", ret);
- goto err1;
+ goto err0;
}
ret = sdei_pe_unmask();
if (ret < 0) {
tftf_testcase_printf("SDEI pe unmask failed: 0x%llx\n", ret);
- goto err2;
+ goto err1;
}
ret = sdei_event_signal(read_mpidr_el1());
if (ret < 0) {
tftf_testcase_printf("SDEI event signal failed: 0x%llx\n", ret);
- goto err3;
+ goto err2;
}
sdei_handler_done();
-err3:
- sdei_pe_mask();
err2:
- sdei_event_disable(0);
+ sdei_pe_mask();
err1:
- sdei_event_unregister(0);
+ sdei_event_disable(0);
err0:
- enable_irq();
+ sdei_event_unregister(0);
if (ret < 0)
return TEST_RESULT_FAIL;
@@ -247,27 +241,24 @@ static test_result_t sdei_wait_for_event_signal(void)
int core_pos;
long long ret;
- /* SDEI handling needs to work even with IRQs disabled. */
- disable_irq();
-
ret = sdei_event_register(0, sdei_entrypoint_resume, 0xB16B00B5,
SDEI_REGF_RM_PE, read_mpidr_el1());
if (ret < 0) {
tftf_testcase_printf("SDEI event register failed: 0x%llx\n",
ret);
- goto err0;
+ return TEST_RESULT_FAIL;
}
ret = sdei_event_enable(0);
if (ret < 0) {
tftf_testcase_printf("SDEI event enable failed: 0x%llx\n", ret);
- goto err1;
+ goto err0;
}
ret = sdei_pe_unmask();
if (ret < 0) {
tftf_testcase_printf("SDEI pe unmask failed: 0x%llx\n", ret);
- goto err2;
+ goto err1;
}
core_pos = platform_get_core_pos(read_mpidr_el1());
@@ -276,12 +267,10 @@ static test_result_t sdei_wait_for_event_signal(void)
sdei_handler_done();
sdei_pe_mask();
-err2:
- sdei_event_disable(0);
err1:
- sdei_event_unregister(0);
+ sdei_event_disable(0);
err0:
- enable_irq();
+ sdei_event_unregister(0);
if (ret < 0)
return TEST_RESULT_FAIL;