1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Copyright 2022, 2025 NXP 4 */ 5 6 #ifndef __SBI_H 7 #define __SBI_H 8 9 #if defined(CFG_RISCV_SBI) 10 11 /* SBI return error codes */ 12 #define SBI_SUCCESS 0 13 #define SBI_ERR_FAILURE -1 14 #define SBI_ERR_NOT_SUPPORTED -2 15 #define SBI_ERR_INVALID_PARAM -3 16 #define SBI_ERR_DENIED -4 17 #define SBI_ERR_INVALID_ADDRESS -5 18 #define SBI_ERR_ALREADY_AVAILABLE -6 19 #define SBI_ERR_ALREADY_STARTED -7 20 #define SBI_ERR_ALREADY_STOPPED -8 21 #define SBI_ERR_NO_SHMEM -9 22 #define SBI_ERR_INVALID_STATE -10 23 #define SBI_ERR_BAD_RANGE -11 24 #define SBI_ERR_TIMEOUT -12 25 #define SBI_ERR_IO -13 26 #define SBI_ERR_DENIED_LOCKED -14 27 28 #define SBI_LAST_ERR SBI_ERR_DENIED_LOCKED 29 30 /* SBI Extension IDs */ 31 #define SBI_EXT_0_1_CONSOLE_PUTCHAR 0x01 32 #define SBI_EXT_BASE 0x10 33 #define SBI_EXT_HSM 0x48534D 34 #define SBI_EXT_DBCN 0x4442434E 35 #define SBI_EXT_TEE 0x544545 36 #define SBI_EXT_MPXY 0x4D505859 37 38 #ifndef __ASSEMBLER__ 39 40 struct sbiret { 41 long error; 42 long value; 43 }; 44 45 #define _sbi_ecall(ext, fid, arg0, arg1, arg2, arg3, arg4, arg5, ...) ({ \ 46 register unsigned long a0 asm("a0") = (unsigned long)arg0; \ 47 register unsigned long a1 asm("a1") = (unsigned long)arg1; \ 48 register unsigned long a2 asm("a2") = (unsigned long)arg2; \ 49 register unsigned long a3 asm("a3") = (unsigned long)arg3; \ 50 register unsigned long a4 asm("a4") = (unsigned long)arg4; \ 51 register unsigned long a5 asm("a5") = (unsigned long)arg5; \ 52 register unsigned long a6 asm("a6") = (unsigned long)fid; \ 53 register unsigned long a7 asm("a7") = (unsigned long)ext; \ 54 asm volatile ("ecall" \ 55 : "+r" (a0), "+r" (a1) \ 56 : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r"(a6), "r"(a7) \ 57 : "memory"); \ 58 (struct sbiret){ .error = a0, .value = a1 }; \ 59 }) 60 61 #define sbi_ecall(...) _sbi_ecall(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0) 62 63 /* SBI function IDs for Base extension */ 64 enum sbi_ext_base_fid { 65 SBI_EXT_BASE_GET_SPEC_VERSION = 0, 66 SBI_EXT_BASE_GET_IMP_ID, 67 SBI_EXT_BASE_GET_IMP_VERSION, 68 SBI_EXT_BASE_PROBE_EXT, 69 SBI_EXT_BASE_GET_MVENDORID, 70 SBI_EXT_BASE_GET_MARCHID, 71 SBI_EXT_BASE_GET_MIMPID, 72 }; 73 74 /* SBI function IDs for HSM extension */ 75 enum sbi_ext_hsm_fid { 76 SBI_EXT_HSM_HART_START = 0, 77 SBI_EXT_HSM_HART_STOP, 78 SBI_EXT_HSM_HART_GET_STATUS, 79 SBI_EXT_HSM_HART_SUSPEND, 80 }; 81 82 /* SBI function IDs for Debug Console extension */ 83 enum sbi_ext_dbcn_fid { 84 SBI_EXT_DBCN_CONSOLE_WRITE = 0, 85 SBI_EXT_DBCN_CONSOLE_READ = 1, 86 SBI_EXT_DBCN_CONSOLE_WRITE_BYTE = 2, 87 }; 88 89 enum sbi_hsm_hart_state { 90 SBI_HSM_STATE_STARTED = 0, 91 SBI_HSM_STATE_STOPPED, 92 SBI_HSM_STATE_START_PENDING, 93 SBI_HSM_STATE_STOP_PENDING, 94 SBI_HSM_STATE_SUSPENDED, 95 SBI_HSM_STATE_SUSPEND_PENDING, 96 SBI_HSM_STATE_RESUME_PENDING, 97 }; 98 99 #include <compiler.h> 100 #include <encoding.h> 101 #include <stdint.h> 102 #include <sys/cdefs.h> 103 #include <types_ext.h> 104 #include <util.h> 105 106 int sbi_probe_extension(int extid); 107 void sbi_console_putchar(int ch); 108 int sbi_dbcn_write_byte(unsigned char ch); 109 int sbi_hsm_hart_start(uint32_t hartid, paddr_t start_addr, unsigned long arg); 110 int sbi_hsm_hart_get_status(uint32_t hartid, enum sbi_hsm_hart_state *status); 111 112 #endif /*__ASSEMBLER__*/ 113 #endif /*defined(CFG_RISCV_SBI)*/ 114 #endif /*__SBI_H*/ 115