1 /* SPDX-License-Identifier: GPL-2.0-only */
2 #ifndef _RISCV_SBI_TESTS_H_
3 #define _RISCV_SBI_TESTS_H_
4
5 #define SBI_HSM_TEST_DONE (1 << 0)
6 #define SBI_HSM_TEST_MAGIC_A1 (1 << 1)
7 #define SBI_HSM_TEST_HARTID_A0 (1 << 2)
8 #define SBI_HSM_TEST_SATP (1 << 3)
9 #define SBI_HSM_TEST_SIE (1 << 4)
10
11 #define SBI_HSM_MAGIC 0x453
12
13 #define SBI_HSM_MAGIC_IDX 0
14 #define SBI_HSM_HARTID_IDX 1
15 #define SBI_HSM_NUM_OF_PARAMS 2
16
17 #define SBI_SUSP_MAGIC_IDX 0
18 #define SBI_SUSP_CSRS_IDX 1
19 #define SBI_SUSP_HARTID_IDX 2
20 #define SBI_SUSP_TESTNUM_IDX 3
21 #define SBI_SUSP_RESULTS_IDX 4
22 #define SBI_SUSP_NR_IDX 5
23
24 #define SBI_CSR_SSTATUS_IDX 0
25 #define SBI_CSR_SIE_IDX 1
26 #define SBI_CSR_STVEC_IDX 2
27 #define SBI_CSR_SSCRATCH_IDX 3
28 #define SBI_CSR_SATP_IDX 4
29 #define SBI_CSR_NR_IDX 5
30
31 #define SBI_SUSP_MAGIC 0x505b
32
33 #define SBI_SUSP_TEST_SATP (1 << 0)
34 #define SBI_SUSP_TEST_SIE (1 << 1)
35 #define SBI_SUSP_TEST_HARTID (1 << 2)
36 #define SBI_SUSP_TEST_MASK 7
37
38 #ifndef __ASSEMBLER__
39 #include <libcflat.h>
40 #include <asm/sbi.h>
41
42 #define __sbiret_report(kfail, ret, expected_error, expected_value, \
43 has_value, expected_error_name, fmt, ...) ({ \
44 long ex_err = expected_error; \
45 long ex_val = expected_value; \
46 bool has_val = !!(has_value); \
47 bool ch_err = (ret)->error == ex_err; \
48 bool ch_val = (ret)->value == ex_val; \
49 bool pass; \
50 \
51 if (has_val) \
52 pass = report_kfail(kfail, ch_err && ch_val, fmt, ##__VA_ARGS__); \
53 else \
54 pass = report_kfail(kfail, ch_err, fmt ": %s", ##__VA_ARGS__, expected_error_name); \
55 \
56 if (!pass && has_val) \
57 report_info(fmt ": expected (error: %ld, value: %ld), received: (error: %ld, value %ld)", \
58 ##__VA_ARGS__, ex_err, ex_val, (ret)->error, (ret)->value); \
59 else if (!pass) \
60 report_info(fmt ": %s (%ld): received error %ld", \
61 ##__VA_ARGS__, expected_error_name, ex_err, (ret)->error); \
62 \
63 pass; \
64 })
65
66 #define sbiret_report(ret, expected_error, expected_value, ...) \
67 __sbiret_report(false, ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
68
69 #define sbiret_report_error(ret, expected_error, ...) \
70 __sbiret_report(false, ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
71
72 #define sbiret_check(ret, expected_error, expected_value) \
73 sbiret_report(ret, expected_error, expected_value, "check sbi.error and sbi.value")
74
75 #define sbiret_kfail(kfail, ret, expected_error, expected_value, ...) \
76 __sbiret_report(kfail, ret, expected_error, expected_value, true, #expected_error, __VA_ARGS__)
77
78 #define sbiret_kfail_error(kfail, ret, expected_error, ...) \
79 __sbiret_report(kfail, ret, expected_error, 0, false, #expected_error, __VA_ARGS__)
80
81 #define sbiret_check_kfail(kfail, ret, expected_error, expected_value) \
82 sbiret_kfail(kfail, ret, expected_error, expected_value, "check sbi.error and sbi.value")
83
env_or_skip(const char * env)84 static inline bool env_or_skip(const char *env)
85 {
86 if (!getenv(env)) {
87 report_skip("missing %s environment variable", env);
88 return false;
89 }
90 return true;
91 }
92
env_enabled(const char * env)93 static inline bool env_enabled(const char *env)
94 {
95 char *s = getenv(env);
96
97 return s && (*s == '1' || *s == 'y' || *s == 'Y');
98 }
99
100 void sbi_bad_fid(int ext);
101 void check_sse(void);
102
103 #endif /* __ASSEMBLER__ */
104 #endif /* _RISCV_SBI_TESTS_H_ */
105