xref: /kvm-unit-tests/lib/riscv/asm/sbi.h (revision 56ca80938026e71d0a2c48cb2a4d41905abed4a2)
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__
1625475fa5SAndrew Jones #include <cpumask.h>
179c92b28eSAndrew Jones 
189ccb00e4SAndrew Jones enum sbi_ext_id {
199ccb00e4SAndrew Jones 	SBI_EXT_BASE = 0x10,
2014fa12b1SJames Raphael Tiovalen 	SBI_EXT_TIME = 0x54494d45,
216489b8b0SJames Raphael Tiovalen 	SBI_EXT_IPI = 0x735049,
229c92b28eSAndrew Jones 	SBI_EXT_HSM = 0x48534d,
239ccb00e4SAndrew Jones 	SBI_EXT_SRST = 0x53525354,
24ce58d3a4SCade Richard 	SBI_EXT_DBCN = 0x4442434E,
259ccb00e4SAndrew Jones };
269ccb00e4SAndrew Jones 
279ccb00e4SAndrew Jones enum sbi_ext_base_fid {
289ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_SPEC_VERSION = 0,
299ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_IMP_ID,
309ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_IMP_VERSION,
319ccb00e4SAndrew Jones 	SBI_EXT_BASE_PROBE_EXT,
329ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MVENDORID,
339ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MARCHID,
349ccb00e4SAndrew Jones 	SBI_EXT_BASE_GET_MIMPID,
359ccb00e4SAndrew Jones };
369ccb00e4SAndrew Jones 
379c92b28eSAndrew Jones enum sbi_ext_hsm_fid {
389c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_START = 0,
399c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_STOP,
409c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_STATUS,
419c92b28eSAndrew Jones 	SBI_EXT_HSM_HART_SUSPEND,
429c92b28eSAndrew Jones };
439c92b28eSAndrew Jones 
4414fa12b1SJames Raphael Tiovalen enum sbi_ext_time_fid {
4514fa12b1SJames Raphael Tiovalen 	SBI_EXT_TIME_SET_TIMER = 0,
4614fa12b1SJames Raphael Tiovalen };
4714fa12b1SJames Raphael Tiovalen 
486489b8b0SJames Raphael Tiovalen enum sbi_ext_ipi_fid {
496489b8b0SJames Raphael Tiovalen 	SBI_EXT_IPI_SEND_IPI = 0,
506489b8b0SJames Raphael Tiovalen };
516489b8b0SJames Raphael Tiovalen 
5267b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_sid {
5367b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_STARTED = 0,
5467b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_STOPPED,
5567b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_START_PENDING,
5667b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_STOP_PENDING,
5767b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_SUSPENDED,
5867b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_SUSPEND_PENDING,
5967b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_RESUME_PENDING,
6067b8f462SJames Raphael Tiovalen };
6167b8f462SJames Raphael Tiovalen 
6267b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_hart_suspend_type {
6367b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0,
6467b8f462SJames Raphael Tiovalen 	SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000,
6567b8f462SJames Raphael Tiovalen };
6667b8f462SJames Raphael Tiovalen 
67ce58d3a4SCade Richard enum sbi_ext_dbcn_fid {
68ce58d3a4SCade Richard 	SBI_EXT_DBCN_CONSOLE_WRITE = 0,
69ce58d3a4SCade Richard 	SBI_EXT_DBCN_CONSOLE_READ,
70ce58d3a4SCade Richard 	SBI_EXT_DBCN_CONSOLE_WRITE_BYTE,
71ce58d3a4SCade Richard };
72ce58d3a4SCade Richard 
739ccb00e4SAndrew Jones struct sbiret {
749ccb00e4SAndrew Jones 	long error;
759ccb00e4SAndrew Jones 	long value;
769ccb00e4SAndrew Jones };
779ccb00e4SAndrew Jones 
789ccb00e4SAndrew Jones struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
799ccb00e4SAndrew Jones 			unsigned long arg1, unsigned long arg2,
809ccb00e4SAndrew Jones 			unsigned long arg3, unsigned long arg4,
819ccb00e4SAndrew Jones 			unsigned long arg5);
829ccb00e4SAndrew Jones 
839ccb00e4SAndrew Jones void sbi_shutdown(void);
849c92b28eSAndrew Jones struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp);
8567b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_stop(void);
8667b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_get_status(unsigned long hartid);
876489b8b0SJames Raphael Tiovalen struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base);
8825475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpu(int cpu);
8925475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask);
90*56ca8093SAndrew Jones struct sbiret sbi_send_ipi_broadcast(void);
919340e4b7SAndrew Jones struct sbiret sbi_set_timer(unsigned long stime_value);
927040d2a9SJames Raphael Tiovalen long sbi_probe(int ext);
939ccb00e4SAndrew Jones 
949c92b28eSAndrew Jones #endif /* !__ASSEMBLY__ */
959ccb00e4SAndrew Jones #endif /* _ASMRISCV_SBI_H_ */
96