xref: /kvm-unit-tests/lib/riscv/asm/sbi.h (revision 7040d2a90e8d9d571a9f5179f9df37719a4fe6da)
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
149c92b28eSAndrew Jones 
159c92b28eSAndrew Jones #ifndef __ASSEMBLY__
169c92b28eSAndrew Jones 
179ccb00e4SAndrew Jones enum sbi_ext_id {
189ccb00e4SAndrew Jones 	SBI_EXT_BASE = 0x10,
199c92b28eSAndrew Jones 	SBI_EXT_HSM = 0x48534d,
209ccb00e4SAndrew Jones 	SBI_EXT_SRST = 0x53525354,
219ccb00e4SAndrew Jones };
229ccb00e4SAndrew Jones 
239ccb00e4SAndrew Jones enum sbi_ext_base_fid {
249ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_SPEC_VERSION = 0,
259ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_IMP_ID,
269ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_IMP_VERSION,
279ccb00e4SAndrew Jones 	SBI_EXT_BASE_PROBE_EXT,
289ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MVENDORID,
299ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MARCHID,
309ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MIMPID,
319ccb00e4SAndrew Jones };
329ccb00e4SAndrew Jones 
339c92b28eSAndrew Jones enum sbi_ext_hsm_fid {
349c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_START = 0,
359c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_STOP,
369c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_STATUS,
379c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_SUSPEND,
389c92b28eSAndrew Jones };
399c92b28eSAndrew Jones 
409ccb00e4SAndrew Jones struct sbiret {
419ccb00e4SAndrew Jones 	long error;
429ccb00e4SAndrew Jones 	long value;
439ccb00e4SAndrew Jones };
449ccb00e4SAndrew Jones 
459ccb00e4SAndrew Jones struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
469ccb00e4SAndrew Jones 			unsigned long arg1, unsigned long arg2,
479ccb00e4SAndrew Jones 			unsigned long arg3, unsigned long arg4,
489ccb00e4SAndrew Jones 			unsigned long arg5);
499ccb00e4SAndrew Jones 
509ccb00e4SAndrew Jones void sbi_shutdown(void);
519c92b28eSAndrew Jones struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
52*7040d2a9SJames Raphael Tiovalen long sbi_probe(int ext);
539ccb00e4SAndrew Jones 
549c92b28eSAndrew Jones #endif /* !__ASSEMBLY__ */
559ccb00e4SAndrew Jones #endif /* _ASMRISCV_SBI_H_ */
56