diff options
author | Dimitris Papastamos <dimitris.papastamos@arm.com> | 2017-10-05 10:10:01 +0100 |
---|---|---|
committer | Sandrine Bailleux <sandrine.bailleux@arm.com> | 2017-11-06 09:39:30 +0000 |
commit | 77ecdca13bb799f7e4d6308eb20df0028f2e1b7a (patch) | |
tree | f7707427d70a271b20e71579c0048d0200637317 /tests/runtime_services | |
parent | 8303490074ad3ef343917991e8e93d4ed62a4228 (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.c | 85 |
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; |