1661fe480SJames Raphael Tiovalen /* SPDX-License-Identifier: GPL-2.0-only */ 2661fe480SJames Raphael Tiovalen #ifndef _RISCV_SBI_TESTS_H_ 3661fe480SJames Raphael Tiovalen #define _RISCV_SBI_TESTS_H_ 4661fe480SJames Raphael Tiovalen 5afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_DONE (1 << 0) 6afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_MAGIC_A1 (1 << 1) 7afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_HARTID_A0 (1 << 2) 8afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_SATP (1 << 3) 9afd2cae5SJames Raphael Tiovalen #define SBI_HSM_TEST_SIE (1 << 4) 10afd2cae5SJames Raphael Tiovalen 11afd2cae5SJames Raphael Tiovalen #define SBI_HSM_MAGIC 0x453 12afd2cae5SJames Raphael Tiovalen 13afd2cae5SJames Raphael Tiovalen #define SBI_HSM_MAGIC_IDX 0 14afd2cae5SJames Raphael Tiovalen #define SBI_HSM_HARTID_IDX 1 15afd2cae5SJames Raphael Tiovalen #define SBI_HSM_NUM_OF_PARAMS 2 16afd2cae5SJames Raphael Tiovalen 172ffe016fSAndrew Jones #define SBI_SUSP_MAGIC_IDX 0 182ffe016fSAndrew Jones #define SBI_SUSP_CSRS_IDX 1 192ffe016fSAndrew Jones #define SBI_SUSP_HARTID_IDX 2 202ffe016fSAndrew Jones #define SBI_SUSP_TESTNUM_IDX 3 212ffe016fSAndrew Jones #define SBI_SUSP_RESULTS_IDX 4 22635f8573SAndrew Jones #define SBI_SUSP_NR_IDX 5 232ffe016fSAndrew Jones 242ffe016fSAndrew Jones #define SBI_CSR_SSTATUS_IDX 0 252ffe016fSAndrew Jones #define SBI_CSR_SIE_IDX 1 262ffe016fSAndrew Jones #define SBI_CSR_STVEC_IDX 2 272ffe016fSAndrew Jones #define SBI_CSR_SSCRATCH_IDX 3 282ffe016fSAndrew Jones #define SBI_CSR_SATP_IDX 4 29635f8573SAndrew Jones #define SBI_CSR_NR_IDX 5 302ffe016fSAndrew Jones 312ffe016fSAndrew Jones #define SBI_SUSP_MAGIC 0x505b 322ffe016fSAndrew Jones 332ffe016fSAndrew Jones #define SBI_SUSP_TEST_SATP (1 << 0) 342ffe016fSAndrew Jones #define SBI_SUSP_TEST_SIE (1 << 1) 352ffe016fSAndrew Jones #define SBI_SUSP_TEST_HARTID (1 << 2) 362ffe016fSAndrew Jones #define SBI_SUSP_TEST_MASK 7 37661fe480SJames Raphael Tiovalen 380cc3a351SSean Christopherson #ifndef __ASSEMBLER__ 39db12c158SAkshay Behl #include <libcflat.h> 40f9a088b4SAndrew Jones #include <asm/sbi.h> 41f9a088b4SAndrew Jones 421d3411dcSAndrew Jones #define __sbiret_report(ret, expected_error, expected_value, has_value, expected_error_name, fmt, ...) ({ \ 43f9a088b4SAndrew Jones long ex_err = expected_error; \ 44f9a088b4SAndrew Jones long ex_val = expected_value; \ 451d3411dcSAndrew Jones bool has_val = !!(has_value); \ 46f9a088b4SAndrew Jones bool ch_err = (ret)->error == ex_err; \ 47f9a088b4SAndrew Jones bool ch_val = (ret)->value == ex_val; \ 481d3411dcSAndrew Jones bool pass; \ 49f9a088b4SAndrew Jones \ 501d3411dcSAndrew Jones if (has_val) \ 511d3411dcSAndrew Jones pass = report(ch_err && ch_val, fmt, ##__VA_ARGS__); \ 521d3411dcSAndrew Jones else \ 531d3411dcSAndrew Jones pass = report(ch_err, fmt ": %s", ##__VA_ARGS__, expected_error_name); \ 541d3411dcSAndrew Jones \ 551d3411dcSAndrew Jones if (!pass && has_val) \ 56f9a088b4SAndrew Jones report_info(fmt ": expected (error: %ld, value: %ld), received: (error: %ld, value %ld)", \ 57f9a088b4SAndrew Jones ##__VA_ARGS__, ex_err, ex_val, (ret)->error, (ret)->value); \ 581d3411dcSAndrew Jones else if (!pass) \ 591d3411dcSAndrew Jones report_info(fmt ": %s (%ld): received error %ld", \ 601d3411dcSAndrew Jones ##__VA_ARGS__, expected_error_name, ex_err, (ret)->error); \ 61f9a088b4SAndrew Jones \ 62f9a088b4SAndrew Jones pass; \ 63f9a088b4SAndrew Jones }) 64f9a088b4SAndrew Jones 651d3411dcSAndrew Jones #define sbiret_report(ret, expected_error, expected_value, ...) \ 661d3411dcSAndrew Jones __sbiret_report(ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__) 671d3411dcSAndrew Jones 681d3411dcSAndrew Jones #define sbiret_report_error(ret, expected_error, ...) \ 691d3411dcSAndrew Jones __sbiret_report(ret, expected_error, 0, false, #expected_error, __VA_ARGS__) 701d3411dcSAndrew Jones 71f9a088b4SAndrew Jones #define sbiret_check(ret, expected_error, expected_value) \ 72f9a088b4SAndrew Jones sbiret_report(ret, expected_error, expected_value, "check sbi.error and sbi.value") 73f9a088b4SAndrew Jones 74db12c158SAkshay Behl static inline bool env_or_skip(const char *env) 75db12c158SAkshay Behl { 76db12c158SAkshay Behl if (!getenv(env)) { 77db12c158SAkshay Behl report_skip("missing %s environment variable", env); 78db12c158SAkshay Behl return false; 79db12c158SAkshay Behl } 80db12c158SAkshay Behl return true; 81db12c158SAkshay Behl } 82db12c158SAkshay Behl 83db12c158SAkshay Behl static inline bool env_enabled(const char *env) 84db12c158SAkshay Behl { 85db12c158SAkshay Behl char *s = getenv(env); 86db12c158SAkshay Behl 87db12c158SAkshay Behl return s && (*s == '1' || *s == 'y' || *s == 'Y'); 88db12c158SAkshay Behl } 89db12c158SAkshay Behl 906fad56a1SAndrew Jones void sbi_bad_fid(int ext); 91*7536c9adSClément Léger void check_sse(void); 926fad56a1SAndrew Jones 930cc3a351SSean Christopherson #endif /* __ASSEMBLER__ */ 94661fe480SJames Raphael Tiovalen #endif /* _RISCV_SBI_TESTS_H_ */ 95