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