xref: /kvm-unit-tests/lib/riscv/asm/sbi.h (revision 2ffe016ff1c9603792507e74d89615014ffb5e74)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 #ifndef _ASMRISCV_SBI_H_
3 #define _ASMRISCV_SBI_H_
4 
5 #define SBI_SUCCESS			0
6 #define SBI_ERR_FAILURE			-1
7 #define SBI_ERR_NOT_SUPPORTED		-2
8 #define SBI_ERR_INVALID_PARAM		-3
9 #define SBI_ERR_DENIED			-4
10 #define SBI_ERR_INVALID_ADDRESS		-5
11 #define SBI_ERR_ALREADY_AVAILABLE	-6
12 #define SBI_ERR_ALREADY_STARTED		-7
13 #define SBI_ERR_ALREADY_STOPPED		-8
14 
15 #ifndef __ASSEMBLY__
16 #include <cpumask.h>
17 
18 enum sbi_ext_id {
19 	SBI_EXT_BASE = 0x10,
20 	SBI_EXT_TIME = 0x54494d45,
21 	SBI_EXT_IPI = 0x735049,
22 	SBI_EXT_HSM = 0x48534d,
23 	SBI_EXT_SRST = 0x53525354,
24 	SBI_EXT_DBCN = 0x4442434E,
25 	SBI_EXT_SUSP = 0x53555350,
26 };
27 
28 enum sbi_ext_base_fid {
29 	SBI_EXT_BASE_GET_SPEC_VERSION = 0,
30 	SBI_EXT_BASE_GET_IMP_ID,
31 	SBI_EXT_BASE_GET_IMP_VERSION,
32 	SBI_EXT_BASE_PROBE_EXT,
33 	SBI_EXT_BASE_GET_MVENDORID,
34 	SBI_EXT_BASE_GET_MARCHID,
35 	SBI_EXT_BASE_GET_MIMPID,
36 };
37 
38 enum sbi_ext_hsm_fid {
39 	SBI_EXT_HSM_HART_START = 0,
40 	SBI_EXT_HSM_HART_STOP,
41 	SBI_EXT_HSM_HART_STATUS,
42 	SBI_EXT_HSM_HART_SUSPEND,
43 };
44 
45 enum sbi_ext_time_fid {
46 	SBI_EXT_TIME_SET_TIMER = 0,
47 };
48 
49 enum sbi_ext_ipi_fid {
50 	SBI_EXT_IPI_SEND_IPI = 0,
51 };
52 
53 enum sbi_ext_hsm_sid {
54 	SBI_EXT_HSM_STARTED = 0,
55 	SBI_EXT_HSM_STOPPED,
56 	SBI_EXT_HSM_START_PENDING,
57 	SBI_EXT_HSM_STOP_PENDING,
58 	SBI_EXT_HSM_SUSPENDED,
59 	SBI_EXT_HSM_SUSPEND_PENDING,
60 	SBI_EXT_HSM_RESUME_PENDING,
61 };
62 
63 enum sbi_ext_hsm_hart_suspend_type {
64 	SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0,
65 	SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000,
66 };
67 
68 enum sbi_ext_dbcn_fid {
69 	SBI_EXT_DBCN_CONSOLE_WRITE = 0,
70 	SBI_EXT_DBCN_CONSOLE_READ,
71 	SBI_EXT_DBCN_CONSOLE_WRITE_BYTE,
72 };
73 
74 struct sbiret {
75 	long error;
76 	long value;
77 };
78 
79 struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
80 			unsigned long arg1, unsigned long arg2,
81 			unsigned long arg3, unsigned long arg4,
82 			unsigned long arg5);
83 
84 void sbi_shutdown(void);
85 struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
86 struct sbiret sbi_hart_stop(void);
87 struct sbiret sbi_hart_get_status(unsigned long hartid);
88 struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base);
89 struct sbiret sbi_send_ipi_cpu(int cpu);
90 struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask);
91 struct sbiret sbi_send_ipi_broadcast(void);
92 struct sbiret sbi_set_timer(unsigned long stime_value);
93 long sbi_probe(int ext);
94 
95 #endif /* !__ASSEMBLY__ */
96 #endif /* _ASMRISCV_SBI_H_ */
97