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