sbi.h revision 1.1 1 1.1 skrll /* $NetBSD: sbi.h,v 1.1 2023/05/07 12:41:48 skrll Exp $ */
2 1.1 skrll
3 1.1 skrll /*-
4 1.1 skrll * Copyright (c) 2023 The NetBSD Foundation, Inc.
5 1.1 skrll * All rights reserved.
6 1.1 skrll *
7 1.1 skrll * This code is derived from software contributed to The NetBSD Foundation
8 1.1 skrll * by Nick Hudson
9 1.1 skrll *
10 1.1 skrll * Redistribution and use in source and binary forms, with or without
11 1.1 skrll * modification, are permitted provided that the following conditions
12 1.1 skrll * are met:
13 1.1 skrll * 1. Redistributions of source code must retain the above copyright
14 1.1 skrll * notice, this list of conditions and the following disclaimer.
15 1.1 skrll * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 skrll * notice, this list of conditions and the following disclaimer in the
17 1.1 skrll * documentation and/or other materials provided with the distribution.
18 1.1 skrll *
19 1.1 skrll * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 skrll * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 skrll * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 skrll * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 skrll * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 skrll * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 skrll * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 skrll * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 skrll * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 skrll * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 skrll * POSSIBILITY OF SUCH DAMAGE.
30 1.1 skrll */
31 1.1 skrll
32 1.1 skrll #ifndef _RISCV_SBI_H_
33 1.1 skrll #define _RISCV_SBI_H_
34 1.1 skrll
35 1.1 skrll #include <sys/types.h>
36 1.1 skrll
37 1.1 skrll struct sbiret {
38 1.1 skrll long error;
39 1.1 skrll long value;
40 1.1 skrll };
41 1.1 skrll
42 1.1 skrll #define SBI_SUCCESS 0
43 1.1 skrll #define SBI_ERR_FAILED -1
44 1.1 skrll #define SBI_ERR_NOT_SUPPORTED -2
45 1.1 skrll #define SBI_ERR_INVALID_PARAM -3
46 1.1 skrll #define SBI_ERR_DENIED -4
47 1.1 skrll #define SBI_ERR_INVALID_ADDRESS -5
48 1.1 skrll #define SBI_ERR_ALREADY_AVAILABLE -6
49 1.1 skrll #define SBI_ERR_ALREADY_STARTED -7
50 1.1 skrll #define SBI_ERR_ALREADY_STOPPED -8
51 1.1 skrll
52 1.1 skrll #define SBI_EID_BASE 0x10
53 1.1 skrll #define SBI_EID_TIMER 0x54494D45 // "TIME"
54 1.1 skrll #define SBI_EID_IPI 0x00735049 // "sPI"
55 1.1 skrll #define SBI_EID_RFENCE 0x52464E43 // "RFNC"
56 1.1 skrll #define SBI_EID_HSM 0x0048534D // "HSM"
57 1.1 skrll #define SBI_EID_SRST 0x53525354 // "SRST"
58 1.1 skrll #define SBI_EID_PMU 0x00504D55 // "PMU"
59 1.1 skrll
60 1.1 skrll /*
61 1.1 skrll | Function Name | SBI Version | FID | EID
62 1.1 skrll | sbi_get_sbi_spec_version | 0.2 | 0 | 0x10
63 1.1 skrll | sbi_get_sbi_impl_id | 0.2 | 1 | 0x10
64 1.1 skrll | sbi_get_sbi_impl_version | 0.2 | 2 | 0x10
65 1.1 skrll | sbi_probe_extension | 0.2 | 3 | 0x10
66 1.1 skrll | sbi_get_mvendorid | 0.2 | 4 | 0x10
67 1.1 skrll | sbi_get_marchid | 0.2 | 5 | 0x10
68 1.1 skrll | sbi_get_mimpid | 0.2 | 6 | 0x10
69 1.1 skrll */
70 1.1 skrll
71 1.1 skrll #define SBI_FID_BASE_GETSPECVERSION 0
72 1.1 skrll #define SBI_FID_BASE_GETIMPLID 1
73 1.1 skrll #define SBI_FID_BASE_GETIMPLVERSION 2
74 1.1 skrll #define SBI_FID_BASE_PROBEEXTENTION 3
75 1.1 skrll #define SBI_FID_BASE_GETMVENDORID 4
76 1.1 skrll #define SBI_FID_BASE_GETMARCHID 5
77 1.1 skrll #define SBI_FID_BASE_GETMIMPID 6
78 1.1 skrll
79 1.1 skrll struct sbiret sbi_get_spec_version(void);
80 1.1 skrll struct sbiret sbi_get_impl_id(void);
81 1.1 skrll struct sbiret sbi_get_impl_version(void);
82 1.1 skrll struct sbiret sbi_probe_extension(long extension_id);
83 1.1 skrll struct sbiret sbi_get_mvendorid(void);
84 1.1 skrll struct sbiret sbi_get_marchid(void);
85 1.1 skrll struct sbiret sbi_get_mimpid(void);
86 1.1 skrll
87 1.1 skrll
88 1.1 skrll /*
89 1.1 skrll | Implementation ID | Name
90 1.1 skrll | 0 | Berkeley Boot Loader (BBL)
91 1.1 skrll | 1 | OpenSBI
92 1.1 skrll | 2 | Xvisor
93 1.1 skrll | 3 | KVM
94 1.1 skrll | 4 | RustSBI
95 1.1 skrll | 5 | Diosix
96 1.1 skrll */
97 1.1 skrll
98 1.1 skrll #define SBI_IMPLID_BERKELEY 0
99 1.1 skrll #define SBI_IMPLID_OPENSBI 1
100 1.1 skrll #define SBI_IMPLID_XVISOR 2
101 1.1 skrll #define SBI_IMPLID_KVM 3
102 1.1 skrll #define SBI_IMPLID_RUSTSBI 4
103 1.1 skrll #define SBI_IMPLID_DIOSIX 5
104 1.1 skrll
105 1.1 skrll
106 1.1 skrll #define SBI_FID_TIMER_SET 0
107 1.1 skrll struct sbiret sbi_set_timer(uint64_t stime_value);
108 1.1 skrll
109 1.1 skrll #define SBI_FID_IPI_SEND 0
110 1.1 skrll struct sbiret sbi_send_ipi(unsigned long hart_mask,
111 1.1 skrll unsigned long hart_mask_base);
112 1.1 skrll
113 1.1 skrll #define SBI_FID_RFENCE_FENCEI 0
114 1.1 skrll #define SBI_FID_RFENCE_SFENCEVMA 1
115 1.1 skrll #define SBI_FID_RFENCE_SFENCEVMAASID 2
116 1.1 skrll #define SBI_FID_RFENCE_HFENCEGVMAVMID 3
117 1.1 skrll #define SBI_FID_RFENCE_HFENCEGVMA 4
118 1.1 skrll #define SBI_FID_RFENCE_HFENCEVVMAASID 5
119 1.1 skrll #define SBI_FID_RFENCE_HFENCEVVMA 6
120 1.1 skrll
121 1.1 skrll
122 1.1 skrll struct sbiret sbi_remote_fence_i(unsigned long hart_mask,
123 1.1 skrll unsigned long hart_mask_base);
124 1.1 skrll struct sbiret sbi_remote_sfence_vma(unsigned long hart_mask,
125 1.1 skrll unsigned long hart_mask_base,
126 1.1 skrll unsigned long start_addr,
127 1.1 skrll unsigned long size);
128 1.1 skrll struct sbiret sbi_remote_sfence_vma_asid(unsigned long hart_mask,
129 1.1 skrll unsigned long hart_mask_base,
130 1.1 skrll unsigned long start_addr,
131 1.1 skrll unsigned long size,
132 1.1 skrll unsigned long asid);
133 1.1 skrll struct sbiret sbi_remote_hfence_gvma_vmid(unsigned long hart_mask,
134 1.1 skrll unsigned long hart_mask_base,
135 1.1 skrll unsigned long start_addr,
136 1.1 skrll unsigned long size,
137 1.1 skrll unsigned long vmid);
138 1.1 skrll struct sbiret sbi_remote_hfence_gvma(unsigned long hart_mask,
139 1.1 skrll unsigned long hart_mask_base,
140 1.1 skrll unsigned long start_addr,
141 1.1 skrll unsigned long size);
142 1.1 skrll struct sbiret sbi_remote_hfence_vvma_asid(unsigned long hart_mask,
143 1.1 skrll unsigned long hart_mask_base,
144 1.1 skrll unsigned long start_addr,
145 1.1 skrll unsigned long size,
146 1.1 skrll unsigned long asid);
147 1.1 skrll struct sbiret sbi_remote_hfence_vvma(unsigned long hart_mask,
148 1.1 skrll unsigned long hart_mask_base,
149 1.1 skrll unsigned long start_addr,
150 1.1 skrll unsigned long size);
151 1.1 skrll
152 1.1 skrll #define SBI_FID_HSM_START 0
153 1.1 skrll #define SBI_FID_HSM_STOP 1
154 1.1 skrll #define SBI_FID_HSM_GETSTATUS 2
155 1.1 skrll #define SBI_FID_HSM_SUSPEND 3
156 1.1 skrll
157 1.1 skrll struct sbiret sbi_hart_start(unsigned long hartid,
158 1.1 skrll unsigned long start_addr,
159 1.1 skrll unsigned long opaque);
160 1.1 skrll struct sbiret sbi_hart_stop(void);
161 1.1 skrll struct sbiret sbi_hart_get_status(unsigned long hartid);
162 1.1 skrll struct sbiret sbi_hart_suspend(uint32_t suspend_type,
163 1.1 skrll unsigned long resume_addr,
164 1.1 skrll unsigned long opaque);
165 1.1 skrll
166 1.1 skrll #define SBI_HART_STARTED 0
167 1.1 skrll #define SBI_HART_STOPPED 1
168 1.1 skrll #define SBI_HART_STARTPENDING 2
169 1.1 skrll #define SBI_HART_STOPPENDING 3
170 1.1 skrll #define SBI_HART_SUSPENDED 4
171 1.1 skrll #define SBI_HART_SUSPENDPENDING 5
172 1.1 skrll #define SBI_HART_RESUMEPENDING 6
173 1.1 skrll
174 1.1 skrll
175 1.1 skrll #define SBI_FID_SRST_SYSTEMRESET 0
176 1.1 skrll struct sbiret sbi_system_reset(uint32_t reset_type, uint32_t reset_reason);
177 1.1 skrll
178 1.1 skrll #define SBI_RESET_TYPE_SHUTDOWN 0
179 1.1 skrll #define SBI_RESET_TYPE_COLDREBOOT 1
180 1.1 skrll #define SBI_RESET_TYPE_WARNREBOOT 2
181 1.1 skrll
182 1.1 skrll #define SBI_RESET_REASON_NONE 0
183 1.1 skrll #define SBI_RESET_REASON_FAILURE 1
184 1.1 skrll
185 1.1 skrll
186 1.1 skrll
187 1.1 skrll #define SBU_FID_PMU_GETCOUNTERS 0
188 1.1 skrll #define SBU_FID_PMU_COUNTERDETAILS 1
189 1.1 skrll #define SBU_FID_PMU_CONFIGCOUNTER 2
190 1.1 skrll #define SBU_FID_PMU_STARTCOUNTERS 3
191 1.1 skrll #define SBU_FID_PMU_STOPCOUNTERS 4
192 1.1 skrll #define SBU_FID_PMU_READCOUNTER 5
193 1.1 skrll
194 1.1 skrll #define SBI_PMU_HW_NO_EVENT 0 // Unused event because
195 1.1 skrll // ...`event_idx` cannot be zero
196 1.1 skrll #define SBI_PMU_HW_CPU_CYCLES 1 // Event for each CPU cycle
197 1.1 skrll #define SBI_PMU_HW_INSTRUCTIONS 2 // Event for each completed
198 1.1 skrll // ... instruction
199 1.1 skrll #define SBI_PMU_HW_CACHE_REFERENCES 3 // Event for cache hit
200 1.1 skrll #define SBI_PMU_HW_CACHE_MISSES 4 // Event for cache miss
201 1.1 skrll #define SBI_PMU_HW_BRANCH_INSTRUCTIONS 5 // Event for a branch instruction
202 1.1 skrll #define SBI_PMU_HW_BRANCH_MISSES 6 // Event for a branch misprediction
203 1.1 skrll #define SBI_PMU_HW_BUS_CYCLES 7 // Event for each BUS cycle
204 1.1 skrll #define SBI_PMU_HW_STALLED_CYCLES_FRONTEND 8 // Event for a stalled cycle in
205 1.1 skrll // ... microarchitecture frontend
206 1.1 skrll #define SBI_PMU_HW_STALLED_CYCLES_BACKEND 9 // Event for a stalled cycle in
207 1.1 skrll // ... microarchitecture backend
208 1.1 skrll #define SBI_PMU_HW_REF_CPU_CYCLES 10 // Event for each reference
209 1.1 skrll // ... CPU cycle
210 1.1 skrll
211 1.1 skrll #define SBI_PMU_HW_CACHE_L1D 0 // Level1 data cache event
212 1.1 skrll #define SBI_PMU_HW_CACHE_L1I 1 // Level1 instruction cache event
213 1.1 skrll #define SBI_PMU_HW_CACHE_LL 2 // Last level cache event
214 1.1 skrll #define SBI_PMU_HW_CACHE_DTLB 3 // Data TLB event
215 1.1 skrll #define SBI_PMU_HW_CACHE_ITLB 4 // Instruction TLB event
216 1.1 skrll #define SBI_PMU_HW_CACHE_BPU 5 // Branch predictor unit event
217 1.1 skrll #define SBI_PMU_HW_CACHE_NODE 6 // NUMA node cache event
218 1.1 skrll
219 1.1 skrll #define SBI_PMU_HW_CACHE_OP_READ 0 // Read cache line
220 1.1 skrll #define SBI_PMU_HW_CACHE_OP_WRITE 1 // Write cache line
221 1.1 skrll #define SBI_PMU_HW_CACHE_OP_PREFETCH 2 // Prefetch cache line
222 1.1 skrll
223 1.1 skrll #define SBI_PMU_HW_CACHE_RESULT_ACCESS 0 // Cache access
224 1.1 skrll #define SBI_PMU_HW_CACHE_RESULT_MISS 1 // Cache miss
225 1.1 skrll
226 1.1 skrll #define SBI_PMU_FW_MISALIGNED_LOAD 0 // Misaligned load trap event
227 1.1 skrll #define SBI_PMU_FW_MISALIGNED_STORE 1 // Misaligned store trap event
228 1.1 skrll #define SBI_PMU_FW_ACCESS_LOAD 2 // Load access trap event
229 1.1 skrll #define SBI_PMU_FW_ACCESS_STORE 3 // Store access trap event
230 1.1 skrll #define SBI_PMU_FW_ILLEGAL_INSN 4 // Illegal instruction trap event
231 1.1 skrll #define SBI_PMU_FW_SET_TIMER 5 // Set timer event
232 1.1 skrll #define SBI_PMU_FW_IPI_SENT 6 // Sent IPI to other HART event
233 1.1 skrll #define SBI_PMU_FW_IPI_RECEIVED 7 // Received IPI from other
234 1.1 skrll // ... HART event
235 1.1 skrll #define SBI_PMU_FW_FENCE_I_SENT 8 // Sent FENCE.I request to
236 1.1 skrll // ... other HART event
237 1.1 skrll #define SBI_PMU_FW_FENCE_I_RECEIVED 9 // Received FENCE.I request
238 1.1 skrll // ... from other HART event
239 1.1 skrll #define SBI_PMU_FW_SFENCE_VMA_SENT 10 // Sent SFENCE.VMA request
240 1.1 skrll // ... to other HART event
241 1.1 skrll #define SBI_PMU_FW_SFENCE_VMA_RECEIVED 11 // Received SFENCE.VMA request
242 1.1 skrll // ... from other HART event
243 1.1 skrll #define SBI_PMU_FW_SFENCE_VMA_ASID_SENT 12 // Sent SFENCE.VMA with ASID
244 1.1 skrll // ... request to other HART event
245 1.1 skrll #define SBI_PMU_FW_SFENCE_VMA_ASID_RECEIVED 13 // Received SFENCE.VMA with ASID
246 1.1 skrll // ... request from other HART event
247 1.1 skrll #define SBI_PMU_FW_HFENCE_GVMA_SENT 14 // Sent HFENCE.GVMA request to
248 1.1 skrll // ... other HART event
249 1.1 skrll #define SBI_PMU_FW_HFENCE_GVMA_RECEIVED 15 // Received HFENCE.GVMA request
250 1.1 skrll // ... from other HART event
251 1.1 skrll #define SBI_PMU_FW_HFENCE_GVMA_VMID_SENT 16 // Sent HFENCE.GVMA with VMID
252 1.1 skrll // ... request to other HART event
253 1.1 skrll #define SBI_PMU_FW_HFENCE_GVMA_VMID_RECEIVED 17 // Received HFENCE.GVMA with VMID
254 1.1 skrll // ... request from other HART event
255 1.1 skrll #define SBI_PMU_FW_HFENCE_VVMA_SENT 18 // Sent HFENCE.VVMA request to
256 1.1 skrll // ... other HART event
257 1.1 skrll #define SBI_PMU_FW_HFENCE_VVMA_RECEIVED 19 // Received HFENCE.VVMA request
258 1.1 skrll // ... from other HART event
259 1.1 skrll #define SBI_PMU_FW_HFENCE_VVMA_ASID_SENT 20 // Sent HFENCE.VVMA with ASID
260 1.1 skrll // ... request to other HART event
261 1.1 skrll #define SBI_PMU_FW_HFENCE_VVMA_ASID_RECEIVED 21 // Received HFENCE.VVMA with ASID
262 1.1 skrll // ... request from other HART event
263 1.1 skrll
264 1.1 skrll
265 1.1 skrll struct sbiret sbi_pmu_num_counters(void);
266 1.1 skrll struct sbiret sbi_pmu_counter_get_info(unsigned long counter_idx);
267 1.1 skrll
268 1.1 skrll struct sbiret sbi_pmu_counter_config_matching(unsigned long counter_idx_base,
269 1.1 skrll unsigned long counter_idx_mask,
270 1.1 skrll unsigned long config_flags,
271 1.1 skrll unsigned long event_idx,
272 1.1 skrll uint64_t event_data);
273 1.1 skrll struct sbiret sbi_pmu_counter_start(unsigned long counter_idx_base,
274 1.1 skrll unsigned long counter_idx_mask,
275 1.1 skrll unsigned long start_flags,
276 1.1 skrll uint64_t initial_value);
277 1.1 skrll struct sbiret sbi_pmu_counter_stop(unsigned long counter_idx_base,
278 1.1 skrll unsigned long counter_idx_mask,
279 1.1 skrll unsigned long stop_flags);
280 1.1 skrll struct sbiret sbi_pmu_counter_fw_read(unsigned long counter_idx);
281 1.1 skrll
282 1.1 skrll
283 1.1 skrll
284 1.1 skrll static inline struct sbiret
285 1.1 skrll sbi_call(int eid, int fid,
286 1.1 skrll unsigned long arg0, unsigned long arg1, unsigned long arg2,
287 1.1 skrll unsigned long arg3, unsigned long arg4, unsigned long arg5)
288 1.1 skrll {
289 1.1 skrll struct sbiret ret;
290 1.1 skrll
291 1.1 skrll register register_t _a7 __asm ("a7") = eid;
292 1.1 skrll register register_t _a6 __asm ("a6") = fid;
293 1.1 skrll
294 1.1 skrll register register_t _a0 __asm ("a0") = arg0;
295 1.1 skrll register register_t _a1 __asm ("a1") = arg1;
296 1.1 skrll register register_t _a2 __asm ("a2") = arg2;
297 1.1 skrll register register_t _a3 __asm ("a3") = arg3;
298 1.1 skrll register register_t _a4 __asm ("a4") = arg4;
299 1.1 skrll register register_t _a5 __asm ("a5") = arg5;
300 1.1 skrll
301 1.1 skrll __asm __volatile (
302 1.1 skrll "ecall"
303 1.1 skrll : "+r" (_a0), "+r" (_a1)
304 1.1 skrll : "r" (_a2), "r" (_a3), "r" (_a4), "r" (_a5), "r" (_a6), "r" (_a7)
305 1.1 skrll : "memory");
306 1.1 skrll ret.error = _a0;
307 1.1 skrll ret.value = _a1;
308 1.1 skrll
309 1.1 skrll return ret;
310 1.1 skrll }
311 1.1 skrll
312 1.1 skrll
313 1.1 skrll #define SBI_CALL0(eid, fid) sbi_call(eid, fid, 0, 0, 0, 0, 0, 0)
314 1.1 skrll #define SBI_CALL1(eid, fid, a0) sbi_call(eid, fid, a0, 0, 0, 0, 0, 0)
315 1.1 skrll #define SBI_CALL2(eid, fid, a0, a1) sbi_call(eid, fid, a0, a1, 0, 0, 0, 0)
316 1.1 skrll #define SBI_CALL3(eid, fid, a0, a1, a2) sbi_call(eid, fid, a0, a1, a2, 0, 0, 0)
317 1.1 skrll #define SBI_CALL4(eid, fid, a0, a1, a2, a3) sbi_call(eid, fid, a0, a1, a2, a3, 0, 0)
318 1.1 skrll #define SBI_CALL5(eid, fid, a0, a1, a2, a3, a4) sbi_call(eid, fid, a0, a1, a2, a3, a4, 0)
319 1.1 skrll #define SBI_CALL6(eid, fid, a0, a1, a2, a3, a4, a5) sbi_call(eid, fid, a0, a1, a2, a3, a4, a5)
320 1.1 skrll
321 1.1 skrll
322 1.1 skrll
323 1.1 skrll #if defined(__RVSBI_LEGACY)
324 1.1 skrll
325 1.1 skrll #define SBI_LEGACY_SET_TIMER 0
326 1.1 skrll #define SBI_LEGACY_CONSOLE_PUTCHAR 1
327 1.1 skrll #define SBI_LEGACY_CONSOLE_GETCHAR 2
328 1.1 skrll #define SBI_LEGACY_CLEAR_IPI 3
329 1.1 skrll #define SBI_LEGACY_SEND_IPI 4
330 1.1 skrll #define SBI_LEGACY_REMOTE_FENCE_I 5
331 1.1 skrll #define SBI_LEGACY_REMOTE_SFENCE_VMA 6
332 1.1 skrll #define SBI_LEGACY_REMOTE_SFENCE_VMA_ASID 7
333 1.1 skrll #define SBI_LEGACY_SHUTDOWN 8
334 1.1 skrll
335 1.1 skrll #define SBI_LEGACY_CALL0(eid) sbi_call(eid, 0, 0, 0, 0, 0, 0, 0)
336 1.1 skrll #define SBI_LEGACY_CALL1(eid, a0) sbi_call(eid, 0, a0, 0, 0, 0, 0, 0)
337 1.1 skrll #define SBI_LEGACY_CALL2(eid, a0, a1) sbi_call(eid, 0, a0, a1, 0, 0, 0, 0)
338 1.1 skrll #define SBI_LEGACY_CALL3(eid, a0, a1, a2) sbi_call(eid, 0, a0, a1, a2, 0, 0, 0)
339 1.1 skrll #define SBI_LEGACY_CALL4(eid, a0, a1, a2, a3) sbi_call(eid, 0, a0, a1, a2, a3, 0, 0)
340 1.1 skrll #define SBI_LEGACY_CALL5(eid, a0, a1, a2, a3, a4) sbi_call(eid, 0, a0, a1, a2, a3, a4, 0)
341 1.1 skrll
342 1.1 skrll
343 1.1 skrll /*
344 1.1 skrll * void sbi_set_timer(uint64_t stime_value)
345 1.1 skrll */
346 1.1 skrll
347 1.1 skrll static inline long
348 1.1 skrll sbi_legacy_set_timer(uint64_t stime_value)
349 1.1 skrll {
350 1.1 skrll #ifdef _LP64
351 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_SET_TIMER, stime_value);
352 1.1 skrll #else
353 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL2(SBI_LEGACY_SET_TIMER,
354 1.1 skrll stime_value, stime_value >> 32);
355 1.1 skrll #endif
356 1.1 skrll return ret.error;
357 1.1 skrll }
358 1.1 skrll
359 1.1 skrll /*
360 1.1 skrll * void sbi_console_putchar(int ch)
361 1.1 skrll */
362 1.1 skrll
363 1.1 skrll static inline long
364 1.1 skrll sbi_legacy_console_putchar(int c) {
365 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_CONSOLE_PUTCHAR, c);
366 1.1 skrll
367 1.1 skrll return ret.error;
368 1.1 skrll }
369 1.1 skrll
370 1.1 skrll /*
371 1.1 skrll * long sbi_console_getchar(void)
372 1.1 skrll */
373 1.1 skrll static inline long
374 1.1 skrll sbi_legacy_console_getchar(void) {
375 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL0(SBI_LEGACY_CONSOLE_GETCHAR);
376 1.1 skrll
377 1.1 skrll return ret.error;
378 1.1 skrll }
379 1.1 skrll
380 1.1 skrll /*
381 1.1 skrll * long sbi_clear_ipi(void)
382 1.1 skrll */
383 1.1 skrll static inline long
384 1.1 skrll sbi_legacy_clear_ipi(void) {
385 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL0(SBI_LEGACY_CLEAR_IPI);
386 1.1 skrll
387 1.1 skrll return ret.error;
388 1.1 skrll }
389 1.1 skrll
390 1.1 skrll
391 1.1 skrll /*
392 1.1 skrll * hart_mask is a virtual address that points to a bit-vector of harts. The
393 1.1 skrll * bit vector is represented as a sequence of unsigned longs whose length
394 1.1 skrll * equals the number of harts in the system divided by the number of bits
395 1.1 skrll * in an unsigned long, rounded up to the next integer.
396 1.1 skrll */
397 1.1 skrll
398 1.1 skrll /*
399 1.1 skrll * void sbi_send_ipi(const unsigned long *hart_mask)
400 1.1 skrll */
401 1.1 skrll static inline long
402 1.1 skrll sbi_legacy_send_ipi(const unsigned long *hart_mask) {
403 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_SEND_IPI,
404 1.1 skrll (unsigned long)hart_mask);
405 1.1 skrll
406 1.1 skrll return ret.error;
407 1.1 skrll }
408 1.1 skrll
409 1.1 skrll /*
410 1.1 skrll * long sbi_remote_fence_i(const unsigned long *hart_mask)
411 1.1 skrll */
412 1.1 skrll static inline long
413 1.1 skrll sbi_legacy_remote_fence_i(const unsigned long *hart_mask) {
414 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_REMOTE_FENCE_I,
415 1.1 skrll (unsigned long)hart_mask);
416 1.1 skrll
417 1.1 skrll return ret.error;
418 1.1 skrll }
419 1.1 skrll
420 1.1 skrll /*
421 1.1 skrll * long sbi_remote_sfence_vma(const unsigned long *hart_mask,
422 1.1 skrll * unsigned long start,
423 1.1 skrll * unsigned long size)
424 1.1 skrll */
425 1.1 skrll static inline long
426 1.1 skrll sbi_legacy_remote_sfence_vma(const unsigned long *hart_mask,
427 1.1 skrll unsigned long start, unsigned long size)
428 1.1 skrll {
429 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL3(SBI_LEGACY_REMOTE_SFENCE_VMA,
430 1.1 skrll (unsigned long)hart_mask, start, size);
431 1.1 skrll
432 1.1 skrll return ret.error;
433 1.1 skrll }
434 1.1 skrll
435 1.1 skrll /*
436 1.1 skrll * long sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
437 1.1 skrll * unsigned long start,
438 1.1 skrll * unsigned long size,
439 1.1 skrll * unsigned long asid)
440 1.1 skrll */
441 1.1 skrll static inline long
442 1.1 skrll sbi_legacy_remote_sfence_vma_asid(const unsigned long *hart_mask,
443 1.1 skrll unsigned long start, unsigned long size, unsigned long asid)
444 1.1 skrll {
445 1.1 skrll struct sbiret ret = SBI_LEGACY_CALL4(SBI_LEGACY_REMOTE_SFENCE_VMA_ASID,
446 1.1 skrll (unsigned long)hart_mask, start, size, asid);
447 1.1 skrll
448 1.1 skrll return ret.error;
449 1.1 skrll }
450 1.1 skrll
451 1.1 skrll /*
452 1.1 skrll * void sbi_shutdown(void)
453 1.1 skrll */
454 1.1 skrll static inline void
455 1.1 skrll sbi_legacy_shutdown(void) {
456 1.1 skrll SBI_LEGACY_CALL0(SBI_LEGACY_SHUTDOWN);
457 1.1 skrll }
458 1.1 skrll
459 1.1 skrll #endif
460 1.1 skrll
461 1.1 skrll
462 1.1 skrll #endif /* _RISCV_SBI_H_ */
463