diff options
Diffstat (limited to 'tftf/tests/extensions/spe/test_spe.c')
-rw-r--r-- | tftf/tests/extensions/spe/test_spe.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/tftf/tests/extensions/spe/test_spe.c b/tftf/tests/extensions/spe/test_spe.c new file mode 100644 index 000000000..d0d89ef50 --- /dev/null +++ b/tftf/tests/extensions/spe/test_spe.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <test_helpers.h> + +test_result_t test_spe_support(void) +{ + /* SPE is an AArch64-only feature.*/ + SKIP_TEST_IF_AARCH32(); + +#ifdef __aarch64__ + unsigned int spe_ver = spe_get_version(); + + assert(spe_ver <= ID_AA64DFR0_SPE_V1P4); + + if (spe_ver == ID_AA64DFR0_SPE_NOT_SUPPORTED) { + return TEST_RESULT_SKIPPED; + } + + /* + * If runtime-EL3 does not enable access to SPE system + * registers from NS-EL2/NS-EL1 then read of these + * registers traps in EL3 + */ + read_pmscr_el1(); + read_pmsfcr_el1(); + read_pmsicr_el1(); + read_pmsidr_el1(); + read_pmsirr_el1(); + read_pmslatfr_el1(); + read_pmblimitr_el1(); + read_pmbptr_el1(); + read_pmbsr_el1(); + read_pmsevfr_el1(); + if (IS_IN_EL2()) { + read_pmscr_el2(); + } + if (spe_ver == ID_AA64DFR0_SPE_V1P2) { + read_pmsnevfr_el1(); + } + + return TEST_RESULT_SUCCESS; +#endif /* __aarch64__ */ +} |