xref: /kvm-unit-tests/lib/riscv/asm/sbi.h (revision f16317a7289c3bca63081f1185541f68d4b0ee51)
19ccb00e4SAndrew Jones /* SPDX-License-Identifier: GPL-2.0-only */
29ccb00e4SAndrew Jones #ifndef _ASMRISCV_SBI_H_
39ccb00e4SAndrew Jones #define _ASMRISCV_SBI_H_
49ccb00e4SAndrew Jones 
59c92b28eSAndrew Jones #define SBI_SUCCESS			0
69c92b28eSAndrew Jones #define SBI_ERR_FAILURE			-1
79c92b28eSAndrew Jones #define SBI_ERR_NOT_SUPPORTED		-2
89c92b28eSAndrew Jones #define SBI_ERR_INVALID_PARAM		-3
99c92b28eSAndrew Jones #define SBI_ERR_DENIED			-4
109c92b28eSAndrew Jones #define SBI_ERR_INVALID_ADDRESS		-5
119c92b28eSAndrew Jones #define SBI_ERR_ALREADY_AVAILABLE	-6
129c92b28eSAndrew Jones #define SBI_ERR_ALREADY_STARTED		-7
139c92b28eSAndrew Jones #define SBI_ERR_ALREADY_STOPPED		-8
14f1302432SClément Léger #define SBI_ERR_NO_SHMEM		-9
15f1302432SClément Léger #define SBI_ERR_INVALID_STATE		-10
16f1302432SClément Léger #define SBI_ERR_BAD_RANGE		-11
17f1302432SClément Léger #define SBI_ERR_TIMEOUT			-12
18f1302432SClément Léger #define SBI_ERR_IO			-13
19f1302432SClément Léger #define SBI_ERR_DENIED_LOCKED		-14
209c92b28eSAndrew Jones 
21240729eeSClément Léger #define SBI_IMPL_BBL		0
22240729eeSClément Léger #define SBI_IMPL_OPENSBI	1
23240729eeSClément Léger #define SBI_IMPL_XVISOR		2
24240729eeSClément Léger #define SBI_IMPL_KVM		3
25240729eeSClément Léger #define SBI_IMPL_RUSTSBI	4
26240729eeSClément Léger #define SBI_IMPL_DIOSIX		5
27240729eeSClément Léger #define SBI_IMPL_COFFER		6
28240729eeSClément Léger #define SBI_IMPL_XEN		7
29240729eeSClément Léger #define SBI_IMPL_POLARFIRE_HSS	8
30240729eeSClément Léger #define SBI_IMPL_COREBOOT	9
31240729eeSClément Léger #define SBI_IMPL_OREBOOT	10
32240729eeSClément Léger #define SBI_IMPL_BHYVE		11
33240729eeSClément Léger 
34b9d58c27SClément Léger /* SBI spec version fields */
35b9d58c27SClément Léger #define SBI_SPEC_VERSION_MAJOR_SHIFT	24
36b9d58c27SClément Léger #define SBI_SPEC_VERSION_MAJOR_MASK	0x7f
37b9d58c27SClément Léger #define SBI_SPEC_VERSION_MINOR_MASK	0xffffff
38b9d58c27SClément Léger #define SBI_SPEC_VERSION_MASK		((SBI_SPEC_VERSION_MAJOR_MASK << SBI_SPEC_VERSION_MAJOR_SHIFT) | \
39b9d58c27SClément Léger 					 SBI_SPEC_VERSION_MINOR_MASK)
40b9d58c27SClément Léger 
410cc3a351SSean Christopherson #ifndef __ASSEMBLER__
4225475fa5SAndrew Jones #include <cpumask.h>
439c92b28eSAndrew Jones 
449ccb00e4SAndrew Jones enum sbi_ext_id {
459ccb00e4SAndrew Jones 	SBI_EXT_BASE = 0x10,
4614fa12b1SJames Raphael Tiovalen 	SBI_EXT_TIME = 0x54494d45,
476489b8b0SJames Raphael Tiovalen 	SBI_EXT_IPI = 0x735049,
489c92b28eSAndrew Jones 	SBI_EXT_HSM = 0x48534d,
499ccb00e4SAndrew Jones 	SBI_EXT_SRST = 0x53525354,
50ce58d3a4SCade Richard 	SBI_EXT_DBCN = 0x4442434E,
512ffe016fSAndrew Jones 	SBI_EXT_SUSP = 0x53555350,
52f1302432SClément Léger 	SBI_EXT_FWFT = 0x46574654,
53*f16317a7SClément Léger 	SBI_EXT_SSE = 0x535345,
549ccb00e4SAndrew Jones };
559ccb00e4SAndrew Jones 
569ccb00e4SAndrew Jones enum sbi_ext_base_fid {
579ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_SPEC_VERSION = 0,
589ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_IMP_ID,
599ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_IMP_VERSION,
609ccb00e4SAndrew Jones 	SBI_EXT_BASE_PROBE_EXT,
619ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MVENDORID,
629ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MARCHID,
639ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MIMPID,
649ccb00e4SAndrew Jones };
659ccb00e4SAndrew Jones 
669c92b28eSAndrew Jones enum sbi_ext_hsm_fid {
679c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_START = 0,
689c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_STOP,
699c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_STATUS,
709c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_SUSPEND,
719c92b28eSAndrew Jones };
729c92b28eSAndrew Jones 
7314fa12b1SJames Raphael Tiovalen enum sbi_ext_time_fid {
7414fa12b1SJames Raphael Tiovalen 	SBI_EXT_TIME_SET_TIMER = 0,
7514fa12b1SJames Raphael Tiovalen };
7614fa12b1SJames Raphael Tiovalen 
776489b8b0SJames Raphael Tiovalen enum sbi_ext_ipi_fid {
786489b8b0SJames Raphael Tiovalen 	SBI_EXT_IPI_SEND_IPI = 0,
796489b8b0SJames Raphael Tiovalen };
806489b8b0SJames Raphael Tiovalen 
8167b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_sid {
8267b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_STARTED = 0,
8367b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_STOPPED,
8467b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_START_PENDING,
8567b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_STOP_PENDING,
8667b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_SUSPENDED,
8767b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_SUSPEND_PENDING,
8867b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_RESUME_PENDING,
8967b8f462SJames Raphael Tiovalen };
9067b8f462SJames Raphael Tiovalen 
9167b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_hart_suspend_type {
9267b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0,
9367b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000,
9467b8f462SJames Raphael Tiovalen };
9567b8f462SJames Raphael Tiovalen 
96ce58d3a4SCade Richard enum sbi_ext_dbcn_fid {
97ce58d3a4SCade Richard 	SBI_EXT_DBCN_CONSOLE_WRITE = 0,
98ce58d3a4SCade Richard 	SBI_EXT_DBCN_CONSOLE_READ,
99ce58d3a4SCade Richard 	SBI_EXT_DBCN_CONSOLE_WRITE_BYTE,
100ce58d3a4SCade Richard };
101ce58d3a4SCade Richard 
102f1302432SClément Léger enum sbi_ext_fwft_fid {
103f1302432SClément Léger 	SBI_EXT_FWFT_SET = 0,
104f1302432SClément Léger 	SBI_EXT_FWFT_GET,
105f1302432SClément Léger };
106f1302432SClément Léger 
107f1302432SClément Léger #define SBI_FWFT_MISALIGNED_EXC_DELEG		0x0
108f1302432SClément Léger #define SBI_FWFT_LANDING_PAD			0x1
109f1302432SClément Léger #define SBI_FWFT_SHADOW_STACK			0x2
110f1302432SClément Léger #define SBI_FWFT_DOUBLE_TRAP			0x3
111f1302432SClément Léger #define SBI_FWFT_PTE_AD_HW_UPDATING		0x4
112f1302432SClément Léger #define SBI_FWFT_POINTER_MASKING_PMLEN		0x5
113f1302432SClément Léger #define SBI_FWFT_LOCAL_RESERVED_START		0x6
114f1302432SClément Léger #define SBI_FWFT_LOCAL_RESERVED_END		0x3fffffff
115f1302432SClément Léger #define SBI_FWFT_LOCAL_PLATFORM_START		0x40000000
116f1302432SClément Léger #define SBI_FWFT_LOCAL_PLATFORM_END		0x7fffffff
117f1302432SClément Léger 
118f1302432SClément Léger #define SBI_FWFT_GLOBAL_RESERVED_START		0x80000000
119f1302432SClément Léger #define SBI_FWFT_GLOBAL_RESERVED_END		0xbfffffff
120f1302432SClément Léger #define SBI_FWFT_GLOBAL_PLATFORM_START		0xc0000000
121f1302432SClément Léger #define SBI_FWFT_GLOBAL_PLATFORM_END		0xffffffff
122f1302432SClément Léger 
123f1302432SClément Léger #define SBI_FWFT_PLATFORM_FEATURE_BIT		BIT(30)
124f1302432SClément Léger #define SBI_FWFT_GLOBAL_FEATURE_BIT		BIT(31)
125f1302432SClément Léger 
126f1302432SClément Léger #define SBI_FWFT_SET_FLAG_LOCK			BIT(0)
127f1302432SClément Léger 
128*f16317a7SClément Léger enum sbi_ext_sse_fid {
129*f16317a7SClément Léger 	SBI_EXT_SSE_READ_ATTRS = 0,
130*f16317a7SClément Léger 	SBI_EXT_SSE_WRITE_ATTRS,
131*f16317a7SClément Léger 	SBI_EXT_SSE_REGISTER,
132*f16317a7SClément Léger 	SBI_EXT_SSE_UNREGISTER,
133*f16317a7SClément Léger 	SBI_EXT_SSE_ENABLE,
134*f16317a7SClément Léger 	SBI_EXT_SSE_DISABLE,
135*f16317a7SClément Léger 	SBI_EXT_SSE_COMPLETE,
136*f16317a7SClément Léger 	SBI_EXT_SSE_INJECT,
137*f16317a7SClément Léger 	SBI_EXT_SSE_HART_UNMASK,
138*f16317a7SClément Léger 	SBI_EXT_SSE_HART_MASK,
139*f16317a7SClément Léger };
140*f16317a7SClément Léger 
141*f16317a7SClément Léger /* SBI SSE Event Attributes. */
142*f16317a7SClément Léger enum sbi_sse_attr_id {
143*f16317a7SClément Léger 	SBI_SSE_ATTR_STATUS		= 0x00000000,
144*f16317a7SClément Léger 	SBI_SSE_ATTR_PRIORITY		= 0x00000001,
145*f16317a7SClément Léger 	SBI_SSE_ATTR_CONFIG		= 0x00000002,
146*f16317a7SClément Léger 	SBI_SSE_ATTR_PREFERRED_HART	= 0x00000003,
147*f16317a7SClément Léger 	SBI_SSE_ATTR_ENTRY_PC		= 0x00000004,
148*f16317a7SClément Léger 	SBI_SSE_ATTR_ENTRY_ARG		= 0x00000005,
149*f16317a7SClément Léger 	SBI_SSE_ATTR_INTERRUPTED_SEPC	= 0x00000006,
150*f16317a7SClément Léger 	SBI_SSE_ATTR_INTERRUPTED_FLAGS	= 0x00000007,
151*f16317a7SClément Léger 	SBI_SSE_ATTR_INTERRUPTED_A6	= 0x00000008,
152*f16317a7SClément Léger 	SBI_SSE_ATTR_INTERRUPTED_A7	= 0x00000009,
153*f16317a7SClément Léger };
154*f16317a7SClément Léger 
155*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_STATE_OFFSET	0
156*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_STATE_MASK		0x3
157*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_PENDING_OFFSET	2
158*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_INJECT_OFFSET	3
159*f16317a7SClément Léger 
160*f16317a7SClément Léger #define SBI_SSE_ATTR_CONFIG_ONESHOT		BIT(0)
161*f16317a7SClément Léger 
162*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SPP	BIT(0)
163*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SPIE	BIT(1)
164*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_HSTATUS_SPV	BIT(2)
165*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_HSTATUS_SPVP	BIT(3)
166*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SPELP	BIT(4)
167*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SDT	BIT(5)
168*f16317a7SClément Léger 
169*f16317a7SClément Léger enum sbi_sse_state {
170*f16317a7SClément Léger 	SBI_SSE_STATE_UNUSED		= 0,
171*f16317a7SClément Léger 	SBI_SSE_STATE_REGISTERED	= 1,
172*f16317a7SClément Léger 	SBI_SSE_STATE_ENABLED		= 2,
173*f16317a7SClément Léger 	SBI_SSE_STATE_RUNNING		= 3,
174*f16317a7SClément Léger };
175*f16317a7SClément Léger 
176*f16317a7SClément Léger /* SBI SSE Event IDs. */
177*f16317a7SClément Léger /* Range 0x00000000 - 0x0000ffff */
178*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_HIGH_PRIO_RAS	0x00000000
179*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_DOUBLE_TRAP		0x00000001
180*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_0_START	0x00000002
181*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_0_END	0x00003fff
182*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_0_START	0x00004000
183*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_0_END		0x00007fff
184*f16317a7SClément Léger 
185*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_HIGH_PRIO_RAS	0x00008000
186*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_0_START	0x00008001
187*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_0_END	0x0000bfff
188*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_0_START	0x0000c000
189*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_0_END		0x0000ffff
190*f16317a7SClément Léger 
191*f16317a7SClément Léger /* Range 0x00010000 - 0x0001ffff */
192*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PMU_OVERFLOW	0x00010000
193*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_1_START	0x00010001
194*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_1_END	0x00013fff
195*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_1_START	0x00014000
196*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_1_END		0x00017fff
197*f16317a7SClément Léger 
198*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_1_START	0x00018000
199*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_1_END	0x0001bfff
200*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_1_START	0x0001c000
201*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_1_END		0x0001ffff
202*f16317a7SClément Léger 
203*f16317a7SClément Léger /* Range 0x00100000 - 0x0010ffff */
204*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_LOW_PRIO_RAS	0x00100000
205*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_2_START	0x00100001
206*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_2_END	0x00103fff
207*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_2_START	0x00104000
208*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_2_END		0x00107fff
209*f16317a7SClément Léger 
210*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_LOW_PRIO_RAS	0x00108000
211*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_2_START	0x00108001
212*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_2_END	0x0010bfff
213*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_2_START	0x0010c000
214*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_2_END		0x0010ffff
215*f16317a7SClément Léger 
216*f16317a7SClément Léger /* Range 0xffff0000 - 0xffffffff */
217*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_SOFTWARE		0xffff0000
218*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_3_START	0xffff0001
219*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_3_END	0xffff3fff
220*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_3_START	0xffff4000
221*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_3_END		0xffff7fff
222*f16317a7SClément Léger 
223*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_SOFTWARE		0xffff8000
224*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_3_START	0xffff8001
225*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_3_END	0xffffbfff
226*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_3_START	0xffffc000
227*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_3_END		0xffffffff
228*f16317a7SClément Léger 
229*f16317a7SClément Léger #define SBI_SSE_EVENT_PLATFORM_BIT		BIT(14)
230*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_BIT		BIT(15)
231*f16317a7SClément Léger 
2329ccb00e4SAndrew Jones struct sbiret {
2339ccb00e4SAndrew Jones 	long error;
2349ccb00e4SAndrew Jones 	long value;
2359ccb00e4SAndrew Jones };
2369ccb00e4SAndrew Jones 
237b9d58c27SClément Léger static inline unsigned long sbi_mk_version(unsigned long major, unsigned long minor)
238b9d58c27SClément Léger {
239b9d58c27SClément Léger 	return ((major & SBI_SPEC_VERSION_MAJOR_MASK) << SBI_SPEC_VERSION_MAJOR_SHIFT)
240b9d58c27SClément Léger 		| (minor & SBI_SPEC_VERSION_MINOR_MASK);
241b9d58c27SClément Léger }
242b9d58c27SClément Léger 
243240729eeSClément Léger static inline unsigned long sbi_impl_opensbi_mk_version(unsigned long major, unsigned long minor)
244240729eeSClément Léger {
245240729eeSClément Léger 	return (((major & 0xffff) << 16) | (minor & 0xffff));
246240729eeSClément Léger }
247240729eeSClément Léger 
2489ccb00e4SAndrew Jones struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
2499ccb00e4SAndrew Jones 			unsigned long arg1, unsigned long arg2,
2509ccb00e4SAndrew Jones 			unsigned long arg3, unsigned long arg4,
2519ccb00e4SAndrew Jones 			unsigned long arg5);
2529ccb00e4SAndrew Jones 
2539ccb00e4SAndrew Jones void sbi_shutdown(void);
2549c92b28eSAndrew Jones struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
25567b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_stop(void);
25667b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_get_status(unsigned long hartid);
2576489b8b0SJames Raphael Tiovalen struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base);
25825475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpu(int cpu);
25925475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask);
26056ca8093SAndrew Jones struct sbiret sbi_send_ipi_broadcast(void);
2619340e4b7SAndrew Jones struct sbiret sbi_set_timer(unsigned long stime_value);
262b9d58c27SClément Léger struct sbiret sbi_get_spec_version(void);
263240729eeSClément Léger unsigned long sbi_get_imp_version(void);
264240729eeSClément Léger unsigned long sbi_get_imp_id(void);
2657040d2a9SJames Raphael Tiovalen long sbi_probe(int ext);
2669ccb00e4SAndrew Jones 
2670cc3a351SSean Christopherson #endif /* !__ASSEMBLER__ */
2689ccb00e4SAndrew Jones #endif /* _ASMRISCV_SBI_H_ */
269