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
42*5cd2c13bSAndrew Jones #define __sbiret_report(kfail, ret, expected_error, expected_value, \
43*5cd2c13bSAndrew Jones has_value, expected_error_name, fmt, ...) ({ \
44f9a088b4SAndrew Jones long ex_err = expected_error; \
45f9a088b4SAndrew Jones long ex_val = expected_value; \
461d3411dcSAndrew Jones bool has_val = !!(has_value); \
47f9a088b4SAndrew Jones bool ch_err = (ret)->error == ex_err; \
48f9a088b4SAndrew Jones bool ch_val = (ret)->value == ex_val; \
491d3411dcSAndrew Jones bool pass; \
50f9a088b4SAndrew Jones \
511d3411dcSAndrew Jones if (has_val) \
52*5cd2c13bSAndrew Jones pass = report_kfail(kfail, ch_err && ch_val, fmt, ##__VA_ARGS__); \
531d3411dcSAndrew Jones else \
54*5cd2c13bSAndrew Jones pass = report_kfail(kfail, ch_err, fmt ": %s", ##__VA_ARGS__, expected_error_name); \
551d3411dcSAndrew Jones \
561d3411dcSAndrew Jones if (!pass && has_val) \
57f9a088b4SAndrew Jones report_info(fmt ": expected (error: %ld, value: %ld), received: (error: %ld, value %ld)", \
58f9a088b4SAndrew Jones ##__VA_ARGS__, ex_err, ex_val, (ret)->error, (ret)->value); \
591d3411dcSAndrew Jones else if (!pass) \
601d3411dcSAndrew Jones report_info(fmt ": %s (%ld): received error %ld", \
611d3411dcSAndrew Jones ##__VA_ARGS__, expected_error_name, ex_err, (ret)->error); \
62f9a088b4SAndrew Jones \
63f9a088b4SAndrew Jones pass; \
64f9a088b4SAndrew Jones })
65f9a088b4SAndrew Jones
661d3411dcSAndrew Jones #define sbiret_report(ret, expected_error, expected_value, ...) \
67*5cd2c13bSAndrew Jones __sbiret_report(false, ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
681d3411dcSAndrew Jones
691d3411dcSAndrew Jones #define sbiret_report_error(ret, expected_error, ...) \
70*5cd2c13bSAndrew Jones __sbiret_report(false, ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
711d3411dcSAndrew Jones
72f9a088b4SAndrew Jones #define sbiret_check(ret, expected_error, expected_value) \
73f9a088b4SAndrew Jones sbiret_report(ret, expected_error, expected_value, "check sbi.error and sbi.value")
74f9a088b4SAndrew Jones
75*5cd2c13bSAndrew Jones #define sbiret_kfail(kfail, ret, expected_error, expected_value, ...) \
76*5cd2c13bSAndrew Jones __sbiret_report(kfail, ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
77*5cd2c13bSAndrew Jones
78*5cd2c13bSAndrew Jones #define sbiret_kfail_error(kfail, ret, expected_error, ...) \
79*5cd2c13bSAndrew Jones __sbiret_report(kfail, ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
80*5cd2c13bSAndrew Jones
81*5cd2c13bSAndrew Jones #define sbiret_check_kfail(kfail, ret, expected_error, expected_value) \
82*5cd2c13bSAndrew Jones sbiret_kfail(kfail, ret, expected_error, expected_value, "check sbi.error and sbi.value")
83*5cd2c13bSAndrew Jones
env_or_skip(const char * env)84db12c158SAkshay Behl static inline bool env_or_skip(const char *env)
85db12c158SAkshay Behl {
86db12c158SAkshay Behl if (!getenv(env)) {
87db12c158SAkshay Behl report_skip("missing %s environment variable", env);
88db12c158SAkshay Behl return false;
89db12c158SAkshay Behl }
90db12c158SAkshay Behl return true;
91db12c158SAkshay Behl }
92db12c158SAkshay Behl
env_enabled(const char * env)93db12c158SAkshay Behl static inline bool env_enabled(const char *env)
94db12c158SAkshay Behl {
95db12c158SAkshay Behl char *s = getenv(env);
96db12c158SAkshay Behl
97db12c158SAkshay Behl return s && (*s == '1' || *s == 'y' || *s == 'Y');
98db12c158SAkshay Behl }
99db12c158SAkshay Behl
1006fad56a1SAndrew Jones void sbi_bad_fid(int ext);
1017536c9adSClément Léger void check_sse(void);
1026fad56a1SAndrew Jones
1030cc3a351SSean Christopherson #endif /* __ASSEMBLER__ */
104661fe480SJames Raphael Tiovalen #endif /* _RISCV_SBI_TESTS_H_ */
105