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 365f8228b2SRuslan Bukin #ifndef _MACHINE_SBI_H_ 375f8228b2SRuslan Bukin #define _MACHINE_SBI_H_ 385f8228b2SRuslan Bukin 390a0f40c7SMitchell Horne /* SBI Specification Version */ 400a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MAJOR_OFFSET 24 410a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MAJOR_MASK (0x7F << SBI_SPEC_VERS_MAJOR_OFFSET) 420a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MINOR_OFFSET 0 430a0f40c7SMitchell Horne #define SBI_SPEC_VERS_MINOR_MASK (0xFFFFFF << SBI_SPEC_VERS_MINOR_OFFSET) 440a0f40c7SMitchell Horne 450a0f40c7SMitchell Horne /* SBI Implementation IDs */ 460a0f40c7SMitchell Horne #define SBI_IMPL_ID_BBL 0 470a0f40c7SMitchell Horne #define SBI_IMPL_ID_OPENSBI 1 4825de8fb6SMitchell Horne #define SBI_IMPL_ID_XVISOR 2 4925de8fb6SMitchell Horne #define SBI_IMPL_ID_KVM 3 5025de8fb6SMitchell Horne #define SBI_IMPL_ID_RUSTSBI 4 5125de8fb6SMitchell Horne #define SBI_IMPL_ID_DIOSIX 5 52d5963606SRuslan Bukin #define SBI_IMPL_ID_COFFER 6 53d5963606SRuslan Bukin #define SBI_IMPL_ID_XEN_PROJECT 7 54d5963606SRuslan Bukin #define SBI_IMPL_ID_POLARFIRE_HSS 8 55d5963606SRuslan Bukin #define SBI_IMPL_ID_COREBOOT 9 56d5963606SRuslan Bukin #define SBI_IMPL_ID_OREBOOT 10 57d5963606SRuslan Bukin #define SBI_IMPL_ID_BHYVE 11 580a0f40c7SMitchell Horne 590a0f40c7SMitchell Horne /* SBI Error Codes */ 600a0f40c7SMitchell Horne #define SBI_SUCCESS 0 610a0f40c7SMitchell Horne #define SBI_ERR_FAILURE -1 620a0f40c7SMitchell Horne #define SBI_ERR_NOT_SUPPORTED -2 630a0f40c7SMitchell Horne #define SBI_ERR_INVALID_PARAM -3 640a0f40c7SMitchell Horne #define SBI_ERR_DENIED -4 650a0f40c7SMitchell Horne #define SBI_ERR_INVALID_ADDRESS -5 66bfe918faSMitchell Horne #define SBI_ERR_ALREADY_AVAILABLE -6 670a0f40c7SMitchell Horne 680a0f40c7SMitchell Horne /* SBI Base Extension */ 690a0f40c7SMitchell Horne #define SBI_EXT_ID_BASE 0x10 700a0f40c7SMitchell Horne #define SBI_BASE_GET_SPEC_VERSION 0 710a0f40c7SMitchell Horne #define SBI_BASE_GET_IMPL_ID 1 720a0f40c7SMitchell Horne #define SBI_BASE_GET_IMPL_VERSION 2 730a0f40c7SMitchell Horne #define SBI_BASE_PROBE_EXTENSION 3 740a0f40c7SMitchell Horne #define SBI_BASE_GET_MVENDORID 4 750a0f40c7SMitchell Horne #define SBI_BASE_GET_MARCHID 5 760a0f40c7SMitchell Horne #define SBI_BASE_GET_MIMPID 6 770a0f40c7SMitchell Horne 7889f34929SMitchell Horne /* Timer (TIME) Extension */ 7989f34929SMitchell Horne #define SBI_EXT_ID_TIME 0x54494D45 8089f34929SMitchell Horne #define SBI_TIME_SET_TIMER 0 8189f34929SMitchell Horne 8289f34929SMitchell Horne /* IPI (IPI) Extension */ 8389f34929SMitchell Horne #define SBI_EXT_ID_IPI 0x735049 8489f34929SMitchell Horne #define SBI_IPI_SEND_IPI 0 8589f34929SMitchell Horne 8689f34929SMitchell Horne /* RFENCE (RFNC) Extension */ 8789f34929SMitchell Horne #define SBI_EXT_ID_RFNC 0x52464E43 8889f34929SMitchell Horne #define SBI_RFNC_REMOTE_FENCE_I 0 8989f34929SMitchell Horne #define SBI_RFNC_REMOTE_SFENCE_VMA 1 9089f34929SMitchell Horne #define SBI_RFNC_REMOTE_SFENCE_VMA_ASID 2 9189f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_GVMA_VMID 3 9289f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_GVMA 4 9389f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_VVMA_ASID 5 9489f34929SMitchell Horne #define SBI_RFNC_REMOTE_HFENCE_VVMA 6 9589f34929SMitchell Horne 96bfe918faSMitchell Horne /* Hart State Management (HSM) Extension */ 97bfe918faSMitchell Horne #define SBI_EXT_ID_HSM 0x48534D 98bfe918faSMitchell Horne #define SBI_HSM_HART_START 0 99bfe918faSMitchell Horne #define SBI_HSM_HART_STOP 1 100bfe918faSMitchell Horne #define SBI_HSM_HART_STATUS 2 101bfe918faSMitchell Horne #define SBI_HSM_STATUS_STARTED 0 102bfe918faSMitchell Horne #define SBI_HSM_STATUS_STOPPED 1 103bfe918faSMitchell Horne #define SBI_HSM_STATUS_START_PENDING 2 104bfe918faSMitchell Horne #define SBI_HSM_STATUS_STOP_PENDING 3 105bfe918faSMitchell Horne 1069bae4ce6SDanjel Qyteza /* System Reset (SRST) Extension */ 1079bae4ce6SDanjel Qyteza #define SBI_EXT_ID_SRST 0x53525354 1089bae4ce6SDanjel Qyteza #define SBI_SRST_SYSTEM_RESET 0 1099bae4ce6SDanjel Qyteza #define SBI_SRST_TYPE_SHUTDOWN 0 1109bae4ce6SDanjel Qyteza #define SBI_SRST_TYPE_COLD_REBOOT 1 1119bae4ce6SDanjel Qyteza #define SBI_SRST_TYPE_WARM_REBOOT 2 1129bae4ce6SDanjel Qyteza #define SBI_SRST_REASON_NONE 0 1139bae4ce6SDanjel Qyteza #define SBI_SRST_REASON_SYSTEM_FAILURE 1 1149bae4ce6SDanjel Qyteza 1150a0f40c7SMitchell Horne /* Legacy Extensions */ 116af19cc59SRuslan Bukin #define SBI_SET_TIMER 0 117af19cc59SRuslan Bukin #define SBI_CONSOLE_PUTCHAR 1 118af19cc59SRuslan Bukin #define SBI_CONSOLE_GETCHAR 2 119af19cc59SRuslan Bukin #define SBI_CLEAR_IPI 3 120af19cc59SRuslan Bukin #define SBI_SEND_IPI 4 121af19cc59SRuslan Bukin #define SBI_REMOTE_FENCE_I 5 122af19cc59SRuslan Bukin #define SBI_REMOTE_SFENCE_VMA 6 123af19cc59SRuslan Bukin #define SBI_REMOTE_SFENCE_VMA_ASID 7 124af19cc59SRuslan Bukin #define SBI_SHUTDOWN 8 1255f8228b2SRuslan Bukin 126*e9fa3991SMitchell Horne #ifndef LOCORE 127*e9fa3991SMitchell Horne 12889f34929SMitchell Horne #define SBI_CALL0(e, f) SBI_CALL5(e, f, 0, 0, 0, 0, 0) 12989f34929SMitchell Horne #define SBI_CALL1(e, f, p1) SBI_CALL5(e, f, p1, 0, 0, 0, 0) 13089f34929SMitchell Horne #define SBI_CALL2(e, f, p1, p2) SBI_CALL5(e, f, p1, p2, 0, 0, 0) 13189f34929SMitchell Horne #define SBI_CALL3(e, f, p1, p2, p3) SBI_CALL5(e, f, p1, p2, p3, 0, 0) 13289f34929SMitchell Horne #define SBI_CALL4(e, f, p1, p2, p3, p4) SBI_CALL5(e, f, p1, p2, p3, p4, 0) 13389f34929SMitchell Horne #define SBI_CALL5(e, f, p1, p2, p3, p4, p5) sbi_call(e, f, p1, p2, p3, p4, p5) 134331baa6fSMitchell Horne 13573efa2fbSJohn Baldwin /* 13673efa2fbSJohn Baldwin * Documentation available at 1370a0f40c7SMitchell Horne * https://github.com/riscv/riscv-sbi-doc/blob/master/riscv-sbi.adoc 13873efa2fbSJohn Baldwin */ 1395f8228b2SRuslan Bukin 1400a0f40c7SMitchell Horne struct sbi_ret { 1410a0f40c7SMitchell Horne long error; 1420a0f40c7SMitchell Horne long value; 1430a0f40c7SMitchell Horne }; 1440a0f40c7SMitchell Horne 1450a0f40c7SMitchell Horne static __inline struct sbi_ret 146331baa6fSMitchell Horne sbi_call(uint64_t arg7, uint64_t arg6, uint64_t arg0, uint64_t arg1, 14789f34929SMitchell Horne uint64_t arg2, uint64_t arg3, uint64_t arg4) 14873efa2fbSJohn Baldwin { 1490a0f40c7SMitchell Horne struct sbi_ret ret; 1500a0f40c7SMitchell Horne 151af19cc59SRuslan Bukin register uintptr_t a0 __asm ("a0") = (uintptr_t)(arg0); 152af19cc59SRuslan Bukin register uintptr_t a1 __asm ("a1") = (uintptr_t)(arg1); 153af19cc59SRuslan Bukin register uintptr_t a2 __asm ("a2") = (uintptr_t)(arg2); 15473efa2fbSJohn Baldwin register uintptr_t a3 __asm ("a3") = (uintptr_t)(arg3); 15589f34929SMitchell Horne register uintptr_t a4 __asm ("a4") = (uintptr_t)(arg4); 156331baa6fSMitchell Horne register uintptr_t a6 __asm ("a6") = (uintptr_t)(arg6); 157af19cc59SRuslan Bukin register uintptr_t a7 __asm ("a7") = (uintptr_t)(arg7); 15873efa2fbSJohn Baldwin 159af19cc59SRuslan Bukin __asm __volatile( \ 160af19cc59SRuslan Bukin "ecall" \ 1610a0f40c7SMitchell Horne :"+r"(a0), "+r"(a1) \ 16289f34929SMitchell Horne :"r"(a2), "r"(a3), "r"(a4), "r"(a6), "r"(a7) \ 163af19cc59SRuslan Bukin :"memory"); 1645f8228b2SRuslan Bukin 1650a0f40c7SMitchell Horne ret.error = a0; 1660a0f40c7SMitchell Horne ret.value = a1; 1670a0f40c7SMitchell Horne return (ret); 168af19cc59SRuslan Bukin } 1695f8228b2SRuslan Bukin 170c55272fdSJessica Clarke /* Base extension functions. */ 1710a0f40c7SMitchell Horne static __inline long 1720a0f40c7SMitchell Horne sbi_probe_extension(long id) 1730a0f40c7SMitchell Horne { 1740a0f40c7SMitchell Horne return (SBI_CALL1(SBI_EXT_ID_BASE, SBI_BASE_PROBE_EXTENSION, id).value); 1750a0f40c7SMitchell Horne } 1760a0f40c7SMitchell Horne 17789f34929SMitchell Horne /* TIME extension functions. */ 17889f34929SMitchell Horne void sbi_set_timer(uint64_t val); 17989f34929SMitchell Horne 18089f34929SMitchell Horne /* IPI extension functions. */ 18189f34929SMitchell Horne void sbi_send_ipi(const u_long *hart_mask); 18289f34929SMitchell Horne 18389f34929SMitchell Horne /* RFENCE extension functions. */ 18489f34929SMitchell Horne void sbi_remote_fence_i(const u_long *hart_mask); 18589f34929SMitchell Horne void sbi_remote_sfence_vma(const u_long *hart_mask, u_long start, u_long size); 18689f34929SMitchell Horne void sbi_remote_sfence_vma_asid(const u_long *hart_mask, u_long start, 18789f34929SMitchell Horne u_long size, u_long asid); 18889f34929SMitchell Horne 189bfe918faSMitchell Horne /* Hart State Management extension functions. */ 190bfe918faSMitchell Horne 191bfe918faSMitchell Horne /* 192bfe918faSMitchell Horne * Start execution on the specified hart at physical address start_addr. The 193bfe918faSMitchell Horne * register a0 will contain the hart's ID, and a1 will contain the value of 194bfe918faSMitchell Horne * priv. 195bfe918faSMitchell Horne */ 196bfe918faSMitchell Horne int sbi_hsm_hart_start(u_long hart, u_long start_addr, u_long priv); 197bfe918faSMitchell Horne 198bfe918faSMitchell Horne /* 199bfe918faSMitchell Horne * Stop execution on the current hart. Interrupts should be disabled, or this 200bfe918faSMitchell Horne * function may return. 201bfe918faSMitchell Horne */ 202bfe918faSMitchell Horne void sbi_hsm_hart_stop(void); 203bfe918faSMitchell Horne 204bfe918faSMitchell Horne /* 205bfe918faSMitchell Horne * Get the execution status of the specified hart. The status will be one of: 206bfe918faSMitchell Horne * - SBI_HSM_STATUS_STARTED 207bfe918faSMitchell Horne * - SBI_HSM_STATUS_STOPPED 208bfe918faSMitchell Horne * - SBI_HSM_STATUS_START_PENDING 209bfe918faSMitchell Horne * - SBI_HSM_STATUS_STOP_PENDING 210bfe918faSMitchell Horne */ 211bfe918faSMitchell Horne int sbi_hsm_hart_status(u_long hart); 212bfe918faSMitchell Horne 2139bae4ce6SDanjel Qyteza /* System Reset extension functions. */ 2149bae4ce6SDanjel Qyteza 2159bae4ce6SDanjel Qyteza /* 2169bae4ce6SDanjel Qyteza * Reset the system based on the following 'type' and 'reason' chosen from: 2179bae4ce6SDanjel Qyteza * - SBI_SRST_TYPE_SHUTDOWN 2189bae4ce6SDanjel Qyteza * - SBI_SRST_TYPE_COLD_REBOOT 2199bae4ce6SDanjel Qyteza * - SBI_SRST_TYPE_WARM_REBOOT 2209bae4ce6SDanjel Qyteza * - SBI_SRST_REASON_NONE 2219bae4ce6SDanjel Qyteza * - SBI_SRST_REASON_SYSTEM_FAILURE 2229bae4ce6SDanjel Qyteza */ 2239bae4ce6SDanjel Qyteza void sbi_system_reset(u_long reset_type, u_long reset_reason); 2249bae4ce6SDanjel Qyteza 2250a0f40c7SMitchell Horne /* Legacy extension functions. */ 226af19cc59SRuslan Bukin static __inline void 227af19cc59SRuslan Bukin sbi_console_putchar(int ch) 228af19cc59SRuslan Bukin { 229af19cc59SRuslan Bukin 230331baa6fSMitchell Horne (void)SBI_CALL1(SBI_CONSOLE_PUTCHAR, 0, ch); 231af19cc59SRuslan Bukin } 232af19cc59SRuslan Bukin 233af19cc59SRuslan Bukin static __inline int 234af19cc59SRuslan Bukin sbi_console_getchar(void) 235af19cc59SRuslan Bukin { 236af19cc59SRuslan Bukin 2370a0f40c7SMitchell Horne /* 2380a0f40c7SMitchell Horne * XXX: The "error" is returned here because legacy SBI functions 2390a0f40c7SMitchell Horne * continue to return their value in a0. 2400a0f40c7SMitchell Horne */ 2410a0f40c7SMitchell Horne return (SBI_CALL0(SBI_CONSOLE_GETCHAR, 0).error); 242af19cc59SRuslan Bukin } 243af19cc59SRuslan Bukin 244a1092942SMitchell Horne void sbi_print_version(void); 2450a0f40c7SMitchell Horne void sbi_init(void); 2460a0f40c7SMitchell Horne 247*e9fa3991SMitchell Horne #endif /* !LOCORE */ 2485f8228b2SRuslan Bukin #endif /* !_MACHINE_SBI_H_ */ 249