xref: /kvm-unit-tests/lib/riscv/asm/sbi.h (revision 240729eef4e29e5698ad2150435d7f44036ec1d8)
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 #define SBI_ERR_NO_SHMEM		-9
15 #define SBI_ERR_INVALID_STATE		-10
16 #define SBI_ERR_BAD_RANGE		-11
17 #define SBI_ERR_TIMEOUT			-12
18 #define SBI_ERR_IO			-13
19 #define SBI_ERR_DENIED_LOCKED		-14
20 
21 #define SBI_IMPL_BBL		0
22 #define SBI_IMPL_OPENSBI	1
23 #define SBI_IMPL_XVISOR		2
24 #define SBI_IMPL_KVM		3
25 #define SBI_IMPL_RUSTSBI	4
26 #define SBI_IMPL_DIOSIX		5
27 #define SBI_IMPL_COFFER		6
28 #define SBI_IMPL_XEN		7
29 #define SBI_IMPL_POLARFIRE_HSS	8
30 #define SBI_IMPL_COREBOOT	9
31 #define SBI_IMPL_OREBOOT	10
32 #define SBI_IMPL_BHYVE		11
33 
34 /* SBI spec version fields */
35 #define SBI_SPEC_VERSION_MAJOR_SHIFT	24
36 #define SBI_SPEC_VERSION_MAJOR_MASK	0x7f
37 #define SBI_SPEC_VERSION_MINOR_MASK	0xffffff
38 #define SBI_SPEC_VERSION_MASK		((SBI_SPEC_VERSION_MAJOR_MASK << SBI_SPEC_VERSION_MAJOR_SHIFT) | \
39 					 SBI_SPEC_VERSION_MINOR_MASK)
40 
41 #ifndef __ASSEMBLER__
42 #include <cpumask.h>
43 
44 enum sbi_ext_id {
45 	SBI_EXT_BASE = 0x10,
46 	SBI_EXT_TIME = 0x54494d45,
47 	SBI_EXT_IPI = 0x735049,
48 	SBI_EXT_HSM = 0x48534d,
49 	SBI_EXT_SRST = 0x53525354,
50 	SBI_EXT_DBCN = 0x4442434E,
51 	SBI_EXT_SUSP = 0x53555350,
52 	SBI_EXT_FWFT = 0x46574654,
53 };
54 
55 enum sbi_ext_base_fid {
56 	SBI_EXT_BASE_GET_SPEC_VERSION = 0,
57 	SBI_EXT_BASE_GET_IMP_ID,
58 	SBI_EXT_BASE_GET_IMP_VERSION,
59 	SBI_EXT_BASE_PROBE_EXT,
60 	SBI_EXT_BASE_GET_MVENDORID,
61 	SBI_EXT_BASE_GET_MARCHID,
62 	SBI_EXT_BASE_GET_MIMPID,
63 };
64 
65 enum sbi_ext_hsm_fid {
66 	SBI_EXT_HSM_HART_START = 0,
67 	SBI_EXT_HSM_HART_STOP,
68 	SBI_EXT_HSM_HART_STATUS,
69 	SBI_EXT_HSM_HART_SUSPEND,
70 };
71 
72 enum sbi_ext_time_fid {
73 	SBI_EXT_TIME_SET_TIMER = 0,
74 };
75 
76 enum sbi_ext_ipi_fid {
77 	SBI_EXT_IPI_SEND_IPI = 0,
78 };
79 
80 enum sbi_ext_hsm_sid {
81 	SBI_EXT_HSM_STARTED = 0,
82 	SBI_EXT_HSM_STOPPED,
83 	SBI_EXT_HSM_START_PENDING,
84 	SBI_EXT_HSM_STOP_PENDING,
85 	SBI_EXT_HSM_SUSPENDED,
86 	SBI_EXT_HSM_SUSPEND_PENDING,
87 	SBI_EXT_HSM_RESUME_PENDING,
88 };
89 
90 enum sbi_ext_hsm_hart_suspend_type {
91 	SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0,
92 	SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000,
93 };
94 
95 enum sbi_ext_dbcn_fid {
96 	SBI_EXT_DBCN_CONSOLE_WRITE = 0,
97 	SBI_EXT_DBCN_CONSOLE_READ,
98 	SBI_EXT_DBCN_CONSOLE_WRITE_BYTE,
99 };
100 
101 
102 enum sbi_ext_fwft_fid {
103 	SBI_EXT_FWFT_SET = 0,
104 	SBI_EXT_FWFT_GET,
105 };
106 
107 #define SBI_FWFT_MISALIGNED_EXC_DELEG		0x0
108 #define SBI_FWFT_LANDING_PAD			0x1
109 #define SBI_FWFT_SHADOW_STACK			0x2
110 #define SBI_FWFT_DOUBLE_TRAP			0x3
111 #define SBI_FWFT_PTE_AD_HW_UPDATING		0x4
112 #define SBI_FWFT_POINTER_MASKING_PMLEN		0x5
113 #define SBI_FWFT_LOCAL_RESERVED_START		0x6
114 #define SBI_FWFT_LOCAL_RESERVED_END		0x3fffffff
115 #define SBI_FWFT_LOCAL_PLATFORM_START		0x40000000
116 #define SBI_FWFT_LOCAL_PLATFORM_END		0x7fffffff
117 
118 #define SBI_FWFT_GLOBAL_RESERVED_START		0x80000000
119 #define SBI_FWFT_GLOBAL_RESERVED_END		0xbfffffff
120 #define SBI_FWFT_GLOBAL_PLATFORM_START		0xc0000000
121 #define SBI_FWFT_GLOBAL_PLATFORM_END		0xffffffff
122 
123 #define SBI_FWFT_PLATFORM_FEATURE_BIT		BIT(30)
124 #define SBI_FWFT_GLOBAL_FEATURE_BIT		BIT(31)
125 
126 #define SBI_FWFT_SET_FLAG_LOCK			BIT(0)
127 
128 struct sbiret {
129 	long error;
130 	long value;
131 };
132 
133 static inline unsigned long sbi_mk_version(unsigned long major, unsigned long minor)
134 {
135 	return ((major & SBI_SPEC_VERSION_MAJOR_MASK) << SBI_SPEC_VERSION_MAJOR_SHIFT)
136 		| (minor & SBI_SPEC_VERSION_MINOR_MASK);
137 }
138 
139 static inline unsigned long sbi_impl_opensbi_mk_version(unsigned long major, unsigned long minor)
140 {
141 	return (((major & 0xffff) << 16) | (minor & 0xffff));
142 }
143 
144 struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
145 			unsigned long arg1, unsigned long arg2,
146 			unsigned long arg3, unsigned long arg4,
147 			unsigned long arg5);
148 
149 void sbi_shutdown(void);
150 struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
151 struct sbiret sbi_hart_stop(void);
152 struct sbiret sbi_hart_get_status(unsigned long hartid);
153 struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base);
154 struct sbiret sbi_send_ipi_cpu(int cpu);
155 struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask);
156 struct sbiret sbi_send_ipi_broadcast(void);
157 struct sbiret sbi_set_timer(unsigned long stime_value);
158 struct sbiret sbi_get_spec_version(void);
159 unsigned long sbi_get_imp_version(void);
160 unsigned long sbi_get_imp_id(void);
161 long sbi_probe(int ext);
162 
163 #endif /* !__ASSEMBLER__ */
164 #endif /* _ASMRISCV_SBI_H_ */
165