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 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 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