15f8228b2SRuslan Bukin /*- 2af19cc59SRuslan Bukin * Copyright (c) 2016-2017 Ruslan Bukin <br@bsdpad.com> 35f8228b2SRuslan Bukin * All rights reserved. 40a0f40c7SMitchell Horne * Copyright (c) 2019 Mitchell Horne <mhorne@FreeBSD.org> 55f8228b2SRuslan Bukin * 65f8228b2SRuslan Bukin * Portions of this software were developed by SRI International and the 75f8228b2SRuslan Bukin * University of Cambridge Computer Laboratory under DARPA/AFRL contract 85f8228b2SRuslan Bukin * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 95f8228b2SRuslan Bukin * 105f8228b2SRuslan Bukin * Portions of this software were developed by the University of Cambridge 115f8228b2SRuslan Bukin * Computer Laboratory as part of the CTSRD Project, with support from the 125f8228b2SRuslan Bukin * UK Higher Education Innovation Fund (HEIF). 135f8228b2SRuslan Bukin * 145f8228b2SRuslan Bukin * Redistribution and use in source and binary forms, with or without 155f8228b2SRuslan Bukin * modification, are permitted provided that the following conditions 165f8228b2SRuslan Bukin * are met: 175f8228b2SRuslan Bukin * 1. Redistributions of source code must retain the above copyright 185f8228b2SRuslan Bukin * notice, this list of conditions and the following disclaimer. 195f8228b2SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 205f8228b2SRuslan Bukin * notice, this list of conditions and the following disclaimer in the 215f8228b2SRuslan Bukin * documentation and/or other materials provided with the distribution. 225f8228b2SRuslan Bukin * 235f8228b2SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 245f8228b2SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 255f8228b2SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 265f8228b2SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 275f8228b2SRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 285f8228b2SRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 295f8228b2SRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 305f8228b2SRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 315f8228b2SRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 325f8228b2SRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 335f8228b2SRuslan Bukin * SUCH DAMAGE. 345f8228b2SRuslan Bukin * 355f8228b2SRuslan Bukin * $FreeBSD$ 365f8228b2SRuslan Bukin */ 375f8228b2SRuslan Bukin 385f8228b2SRuslan Bukin #ifndef _MACHINE_SBI_H_ 395f8228b2SRuslan Bukin #define _MACHINE_SBI_H_ 405f8228b2SRuslan Bukin 410a0f40c7SMitchell Horne /* SBI Specification Version */ 420a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MAJOR_OFFSET 24 430a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MAJOR_MASK (0x7F << SBI_SPEC_VERS_MAJOR_OFFSET) 440a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MINOR_OFFSET 0 450a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MINOR_MASK (0xFFFFFF << SBI_SPEC_VERS_MINOR_OFFSET) 460a0f40c7SMitchell Horne 470a0f40c7SMitchell Horne /* SBI Implementation IDs */ 480a0f40c7SMitchell Horne #define SBI_IMPL_ID_BBL 0 490a0f40c7SMitchell Horne #define SBI_IMPL_ID_OPENSBI 1 5025de8fb6SMitchell Horne #define SBI_IMPL_ID_XVISOR 2 5125de8fb6SMitchell Horne #define SBI_IMPL_ID_KVM 3 5225de8fb6SMitchell Horne #define SBI_IMPL_ID_RUSTSBI 4 5325de8fb6SMitchell Horne #define SBI_IMPL_ID_DIOSIX 5 540a0f40c7SMitchell Horne 550a0f40c7SMitchell Horne /* SBI Error Codes */ 560a0f40c7SMitchell Horne #define SBI_SUCCESS 0 570a0f40c7SMitchell Horne #define SBI_ERR_FAILURE -1 580a0f40c7SMitchell Horne #define SBI_ERR_NOT_SUPPORTED -2 590a0f40c7SMitchell Horne #define SBI_ERR_INVALID_PARAM -3 600a0f40c7SMitchell Horne #define SBI_ERR_DENIED -4 610a0f40c7SMitchell Horne #define SBI_ERR_INVALID_ADDRESS -5 62bfe918faSMitchell Horne #define SBI_ERR_ALREADY_AVAILABLE -6 630a0f40c7SMitchell Horne 640a0f40c7SMitchell Horne /* SBI Base Extension */ 650a0f40c7SMitchell Horne #define SBI_EXT_ID_BASE 0x10 660a0f40c7SMitchell Horne #define SBI_BASE_GET_SPEC_VERSION 0 670a0f40c7SMitchell Horne #define SBI_BASE_GET_IMPL_ID 1 680a0f40c7SMitchell Horne #define SBI_BASE_GET_IMPL_VERSION 2 690a0f40c7SMitchell Horne #define SBI_BASE_PROBE_EXTENSION 3 700a0f40c7SMitchell Horne #define SBI_BASE_GET_MVENDORID 4 710a0f40c7SMitchell Horne #define SBI_BASE_GET_MARCHID 5 720a0f40c7SMitchell Horne #define SBI_BASE_GET_MIMPID 6 730a0f40c7SMitchell Horne 7489f34929SMitchell Horne /* Timer (TIME) Extension */ 7589f34929SMitchell Horne #define SBI_EXT_ID_TIME 0x54494D45 7689f34929SMitchell Horne #define SBI_TIME_SET_TIMER 0 7789f34929SMitchell Horne 7889f34929SMitchell Horne /* IPI (IPI) Extension */ 7989f34929SMitchell Horne #define SBI_EXT_ID_IPI 0x735049 8089f34929SMitchell Horne #define SBI_IPI_SEND_IPI 0 8189f34929SMitchell Horne 8289f34929SMitchell Horne /* RFENCE (RFNC) Extension */ 8389f34929SMitchell Horne #define SBI_EXT_ID_RFNC 0x52464E43 8489f34929SMitchell Horne #define SBI_RFNC_REMOTE_FENCE_I 0 8589f34929SMitchell Horne #define SBI_RFNC_REMOTE_SFENCE_VMA 1 8689f34929SMitchell Horne #define SBI_RFNC_REMOTE_SFENCE_VMA_ASID 2 8789f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_GVMA_VMID 3 8889f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_GVMA 4 8989f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_VVMA_ASID 5 9089f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_VVMA 6 9189f34929SMitchell Horne 92bfe918faSMitchell Horne /* Hart State Management (HSM) Extension */ 93bfe918faSMitchell Horne #define SBI_EXT_ID_HSM 0x48534D 94bfe918faSMitchell Horne #define SBI_HSM_HART_START 0 95bfe918faSMitchell Horne #define SBI_HSM_HART_STOP 1 96bfe918faSMitchell Horne #define SBI_HSM_HART_STATUS 2 97bfe918faSMitchell Horne #define SBI_HSM_STATUS_STARTED 0 98bfe918faSMitchell Horne #define SBI_HSM_STATUS_STOPPED 1 99bfe918faSMitchell Horne #define SBI_HSM_STATUS_START_PENDING 2 100bfe918faSMitchell Horne #define SBI_HSM_STATUS_STOP_PENDING 3 101bfe918faSMitchell Horne 1029bae4ce6SDanjel Qyteza /* System Reset (SRST) Extension */ 1039bae4ce6SDanjel Qyteza #define SBI_EXT_ID_SRST 0x53525354 1049bae4ce6SDanjel Qyteza #define SBI_SRST_SYSTEM_RESET 0 1059bae4ce6SDanjel Qyteza #define SBI_SRST_TYPE_SHUTDOWN 0 1069bae4ce6SDanjel Qyteza #define SBI_SRST_TYPE_COLD_REBOOT 1 1079bae4ce6SDanjel Qyteza #define SBI_SRST_TYPE_WARM_REBOOT 2 1089bae4ce6SDanjel Qyteza #define SBI_SRST_REASON_NONE 0 1099bae4ce6SDanjel Qyteza #define SBI_SRST_REASON_SYSTEM_FAILURE 1 1109bae4ce6SDanjel Qyteza 1110a0f40c7SMitchell Horne /* Legacy Extensions */ 112af19cc59SRuslan Bukin #define SBI_SET_TIMER 0 113af19cc59SRuslan Bukin #define SBI_CONSOLE_PUTCHAR 1 114af19cc59SRuslan Bukin #define SBI_CONSOLE_GETCHAR 2 115af19cc59SRuslan Bukin #define SBI_CLEAR_IPI 3 116af19cc59SRuslan Bukin #define SBI_SEND_IPI 4 117af19cc59SRuslan Bukin #define SBI_REMOTE_FENCE_I 5 118af19cc59SRuslan Bukin #define SBI_REMOTE_SFENCE_VMA 6 119af19cc59SRuslan Bukin #define SBI_REMOTE_SFENCE_VMA_ASID 7 120af19cc59SRuslan Bukin #define SBI_SHUTDOWN 8 1215f8228b2SRuslan Bukin 12289f34929SMitchell Horne #define SBI_CALL0(e, f) SBI_CALL5(e, f, 0, 0, 0, 0, 0) 12389f34929SMitchell Horne #define SBI_CALL1(e, f, p1) SBI_CALL5(e, f, p1, 0, 0, 0, 0) 12489f34929SMitchell Horne #define SBI_CALL2(e, f, p1, p2) SBI_CALL5(e, f, p1, p2, 0, 0, 0) 12589f34929SMitchell Horne #define SBI_CALL3(e, f, p1, p2, p3) SBI_CALL5(e, f, p1, p2, p3, 0, 0) 12689f34929SMitchell Horne #define SBI_CALL4(e, f, p1, p2, p3, p4) SBI_CALL5(e, f, p1, p2, p3, p4, 0) 12789f34929SMitchell Horne #define SBI_CALL5(e, f, p1, p2, p3, p4, p5) sbi_call(e, f, p1, p2, p3, p4, p5) 128331baa6fSMitchell Horne 12973efa2fbSJohn Baldwin /* 13073efa2fbSJohn Baldwin * Documentation available at 1310a0f40c7SMitchell Horne * https://github.com/riscv/riscv-sbi-doc/blob/master/riscv-sbi.adoc 13273efa2fbSJohn Baldwin */ 1335f8228b2SRuslan Bukin 1340a0f40c7SMitchell Horne struct sbi_ret { 1350a0f40c7SMitchell Horne long error; 1360a0f40c7SMitchell Horne long value; 1370a0f40c7SMitchell Horne }; 1380a0f40c7SMitchell Horne 1390a0f40c7SMitchell Horne static __inline struct sbi_ret 140331baa6fSMitchell Horne sbi_call(uint64_t arg7, uint64_t arg6, uint64_t arg0, uint64_t arg1, 14189f34929SMitchell Horne uint64_t arg2, uint64_t arg3, uint64_t arg4) 14273efa2fbSJohn Baldwin { 1430a0f40c7SMitchell Horne struct sbi_ret ret; 1440a0f40c7SMitchell Horne 145af19cc59SRuslan Bukin register uintptr_t a0 __asm ("a0") = (uintptr_t)(arg0); 146af19cc59SRuslan Bukin register uintptr_t a1 __asm ("a1") = (uintptr_t)(arg1); 147af19cc59SRuslan Bukin register uintptr_t a2 __asm ("a2") = (uintptr_t)(arg2); 14873efa2fbSJohn Baldwin register uintptr_t a3 __asm ("a3") = (uintptr_t)(arg3); 14989f34929SMitchell Horne register uintptr_t a4 __asm ("a4") = (uintptr_t)(arg4); 150331baa6fSMitchell Horne register uintptr_t a6 __asm ("a6") = (uintptr_t)(arg6); 151af19cc59SRuslan Bukin register uintptr_t a7 __asm ("a7") = (uintptr_t)(arg7); 15273efa2fbSJohn Baldwin 153af19cc59SRuslan Bukin __asm __volatile( \ 154af19cc59SRuslan Bukin "ecall" \ 1550a0f40c7SMitchell Horne :"+r"(a0), "+r"(a1) \ 15689f34929SMitchell Horne :"r"(a2), "r"(a3), "r"(a4), "r"(a6), "r"(a7) \ 157af19cc59SRuslan Bukin :"memory"); 1585f8228b2SRuslan Bukin 1590a0f40c7SMitchell Horne ret.error = a0; 1600a0f40c7SMitchell Horne ret.value = a1; 1610a0f40c7SMitchell Horne return (ret); 162af19cc59SRuslan Bukin } 1635f8228b2SRuslan Bukin 1640a0f40c7SMitchell Horne /* Base extension functions and variables. */ 1650a0f40c7SMitchell Horne extern u_long sbi_spec_version; 1660a0f40c7SMitchell Horne extern u_long sbi_impl_id; 1670a0f40c7SMitchell Horne extern u_long sbi_impl_version; 1680a0f40c7SMitchell Horne 1690a0f40c7SMitchell Horne static __inline long 1700a0f40c7SMitchell Horne sbi_probe_extension(long id) 1710a0f40c7SMitchell Horne { 1720a0f40c7SMitchell Horne return (SBI_CALL1(SBI_EXT_ID_BASE, SBI_BASE_PROBE_EXTENSION, id).value); 1730a0f40c7SMitchell Horne } 1740a0f40c7SMitchell Horne 17589f34929SMitchell Horne /* TIME extension functions. */ 17689f34929SMitchell Horne void sbi_set_timer(uint64_t val); 17789f34929SMitchell Horne 17889f34929SMitchell Horne /* IPI extension functions. */ 17989f34929SMitchell Horne void sbi_send_ipi(const u_long *hart_mask); 18089f34929SMitchell Horne 18189f34929SMitchell Horne /* RFENCE extension functions. */ 18289f34929SMitchell Horne void sbi_remote_fence_i(const u_long *hart_mask); 18389f34929SMitchell Horne void sbi_remote_sfence_vma(const u_long *hart_mask, u_long start, u_long size); 18489f34929SMitchell Horne void sbi_remote_sfence_vma_asid(const u_long *hart_mask, u_long start, 18589f34929SMitchell Horne u_long size, u_long asid); 18689f34929SMitchell Horne 187bfe918faSMitchell Horne /* Hart State Management extension functions. */ 188bfe918faSMitchell Horne 189bfe918faSMitchell Horne /* 190bfe918faSMitchell Horne * Start execution on the specified hart at physical address start_addr. The 191bfe918faSMitchell Horne * register a0 will contain the hart's ID, and a1 will contain the value of 192bfe918faSMitchell Horne * priv. 193bfe918faSMitchell Horne */ 194bfe918faSMitchell Horne int sbi_hsm_hart_start(u_long hart, u_long start_addr, u_long priv); 195bfe918faSMitchell Horne 196bfe918faSMitchell Horne /* 197bfe918faSMitchell Horne * Stop execution on the current hart. Interrupts should be disabled, or this 198bfe918faSMitchell Horne * function may return. 199bfe918faSMitchell Horne */ 200bfe918faSMitchell Horne void sbi_hsm_hart_stop(void); 201bfe918faSMitchell Horne 202bfe918faSMitchell Horne /* 203bfe918faSMitchell Horne * Get the execution status of the specified hart. The status will be one of: 204bfe918faSMitchell Horne * - SBI_HSM_STATUS_STARTED 205bfe918faSMitchell Horne * - SBI_HSM_STATUS_STOPPED 206bfe918faSMitchell Horne * - SBI_HSM_STATUS_START_PENDING 207bfe918faSMitchell Horne * - SBI_HSM_STATUS_STOP_PENDING 208bfe918faSMitchell Horne */ 209bfe918faSMitchell Horne int sbi_hsm_hart_status(u_long hart); 210bfe918faSMitchell Horne 2119bae4ce6SDanjel Qyteza /* System Reset extension functions. */ 2129bae4ce6SDanjel Qyteza 2139bae4ce6SDanjel Qyteza /* 2149bae4ce6SDanjel Qyteza * Reset the system based on the following 'type' and 'reason' chosen from: 2159bae4ce6SDanjel Qyteza * - SBI_SRST_TYPE_SHUTDOWN 2169bae4ce6SDanjel Qyteza * - SBI_SRST_TYPE_COLD_REBOOT 2179bae4ce6SDanjel Qyteza * - SBI_SRST_TYPE_WARM_REBOOT 2189bae4ce6SDanjel Qyteza * - SBI_SRST_REASON_NONE 2199bae4ce6SDanjel Qyteza * - SBI_SRST_REASON_SYSTEM_FAILURE 2209bae4ce6SDanjel Qyteza */ 2219bae4ce6SDanjel Qyteza void sbi_system_reset(u_long reset_type, u_long reset_reason); 2229bae4ce6SDanjel Qyteza 2230a0f40c7SMitchell Horne /* Legacy extension functions. */ 224af19cc59SRuslan Bukin static __inline void 225af19cc59SRuslan Bukin sbi_console_putchar(int ch) 226af19cc59SRuslan Bukin { 227af19cc59SRuslan Bukin 228331baa6fSMitchell Horne (void)SBI_CALL1(SBI_CONSOLE_PUTCHAR, 0, ch); 229af19cc59SRuslan Bukin } 230af19cc59SRuslan Bukin 231af19cc59SRuslan Bukin static __inline int 232af19cc59SRuslan Bukin sbi_console_getchar(void) 233af19cc59SRuslan Bukin { 234af19cc59SRuslan Bukin 2350a0f40c7SMitchell Horne /* 2360a0f40c7SMitchell Horne * XXX: The "error" is returned here because legacy SBI functions 2370a0f40c7SMitchell Horne * continue to return their value in a0. 2380a0f40c7SMitchell Horne */ 2390a0f40c7SMitchell Horne return (SBI_CALL0(SBI_CONSOLE_GETCHAR, 0).error); 240af19cc59SRuslan Bukin } 241af19cc59SRuslan Bukin 242a1092942SMitchell Horne void sbi_print_version(void); 2430a0f40c7SMitchell Horne void sbi_init(void); 2440a0f40c7SMitchell Horne 2455f8228b2SRuslan Bukin #endif /* !_MACHINE_SBI_H_ */ 246