1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 #ifndef _ASMRISCV_SBI_H_ 3 #define _ASMRISCV_SBI_H_ 4 5 #define SBI_SUCCESS 0 6 #define SBI_ERR_FAILURE -1 7 #define SBI_ERR_NOT_SUPPORTED -2 8 #define SBI_ERR_INVALID_PARAM -3 9 #define SBI_ERR_DENIED -4 10 #define SBI_ERR_INVALID_ADDRESS -5 11 #define SBI_ERR_ALREADY_AVAILABLE -6 12 #define SBI_ERR_ALREADY_STARTED -7 13 #define SBI_ERR_ALREADY_STOPPED -8 14 #define SBI_ERR_NO_SHMEM -9 15 #define SBI_ERR_INVALID_STATE -10 16 #define SBI_ERR_BAD_RANGE -11 17 #define SBI_ERR_TIMEOUT -12 18 #define SBI_ERR_IO -13 19 #define SBI_ERR_DENIED_LOCKED -14 20 21 #define SBI_IMPL_BBL 0 22 #define SBI_IMPL_OPENSBI 1 23 #define SBI_IMPL_XVISOR 2 24 #define SBI_IMPL_KVM 3 25 #define SBI_IMPL_RUSTSBI 4 26 #define SBI_IMPL_DIOSIX 5 27 #define SBI_IMPL_COFFER 6 28 #define SBI_IMPL_XEN 7 29 #define SBI_IMPL_POLARFIRE_HSS 8 30 #define SBI_IMPL_COREBOOT 9 31 #define SBI_IMPL_OREBOOT 10 32 #define SBI_IMPL_BHYVE 11 33 34 /* SBI spec version fields */ 35 #define SBI_SPEC_VERSION_MAJOR_SHIFT 24 36 #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f 37 #define SBI_SPEC_VERSION_MINOR_MASK 0xffffff 38 #define SBI_SPEC_VERSION_MASK ((SBI_SPEC_VERSION_MAJOR_MASK << SBI_SPEC_VERSION_MAJOR_SHIFT) | \ 39 SBI_SPEC_VERSION_MINOR_MASK) 40 41 #ifndef __ASSEMBLER__ 42 #include <cpumask.h> 43 44 enum sbi_ext_id { 45 SBI_EXT_BASE = 0x10, 46 SBI_EXT_TIME = 0x54494d45, 47 SBI_EXT_IPI = 0x735049, 48 SBI_EXT_HSM = 0x48534d, 49 SBI_EXT_SRST = 0x53525354, 50 SBI_EXT_DBCN = 0x4442434E, 51 SBI_EXT_SUSP = 0x53555350, 52 SBI_EXT_FWFT = 0x46574654, 53 }; 54 55 enum sbi_ext_base_fid { 56 SBI_EXT_BASE_GET_SPEC_VERSION = 0, 57 SBI_EXT_BASE_GET_IMP_ID, 58 SBI_EXT_BASE_GET_IMP_VERSION, 59 SBI_EXT_BASE_PROBE_EXT, 60 SBI_EXT_BASE_GET_MVENDORID, 61 SBI_EXT_BASE_GET_MARCHID, 62 SBI_EXT_BASE_GET_MIMPID, 63 }; 64 65 enum sbi_ext_hsm_fid { 66 SBI_EXT_HSM_HART_START = 0, 67 SBI_EXT_HSM_HART_STOP, 68 SBI_EXT_HSM_HART_STATUS, 69 SBI_EXT_HSM_HART_SUSPEND, 70 }; 71 72 enum sbi_ext_time_fid { 73 SBI_EXT_TIME_SET_TIMER = 0, 74 }; 75 76 enum sbi_ext_ipi_fid { 77 SBI_EXT_IPI_SEND_IPI = 0, 78 }; 79 80 enum sbi_ext_hsm_sid { 81 SBI_EXT_HSM_STARTED = 0, 82 SBI_EXT_HSM_STOPPED, 83 SBI_EXT_HSM_START_PENDING, 84 SBI_EXT_HSM_STOP_PENDING, 85 SBI_EXT_HSM_SUSPENDED, 86 SBI_EXT_HSM_SUSPEND_PENDING, 87 SBI_EXT_HSM_RESUME_PENDING, 88 }; 89 90 enum sbi_ext_hsm_hart_suspend_type { 91 SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0, 92 SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000, 93 }; 94 95 enum sbi_ext_dbcn_fid { 96 SBI_EXT_DBCN_CONSOLE_WRITE = 0, 97 SBI_EXT_DBCN_CONSOLE_READ, 98 SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, 99 }; 100 101 102 enum sbi_ext_fwft_fid { 103 SBI_EXT_FWFT_SET = 0, 104 SBI_EXT_FWFT_GET, 105 }; 106 107 #define SBI_FWFT_MISALIGNED_EXC_DELEG 0x0 108 #define SBI_FWFT_LANDING_PAD 0x1 109 #define SBI_FWFT_SHADOW_STACK 0x2 110 #define SBI_FWFT_DOUBLE_TRAP 0x3 111 #define SBI_FWFT_PTE_AD_HW_UPDATING 0x4 112 #define SBI_FWFT_POINTER_MASKING_PMLEN 0x5 113 #define SBI_FWFT_LOCAL_RESERVED_START 0x6 114 #define SBI_FWFT_LOCAL_RESERVED_END 0x3fffffff 115 #define SBI_FWFT_LOCAL_PLATFORM_START 0x40000000 116 #define SBI_FWFT_LOCAL_PLATFORM_END 0x7fffffff 117 118 #define SBI_FWFT_GLOBAL_RESERVED_START 0x80000000 119 #define SBI_FWFT_GLOBAL_RESERVED_END 0xbfffffff 120 #define SBI_FWFT_GLOBAL_PLATFORM_START 0xc0000000 121 #define SBI_FWFT_GLOBAL_PLATFORM_END 0xffffffff 122 123 #define SBI_FWFT_PLATFORM_FEATURE_BIT BIT(30) 124 #define SBI_FWFT_GLOBAL_FEATURE_BIT BIT(31) 125 126 #define SBI_FWFT_SET_FLAG_LOCK BIT(0) 127 128 struct sbiret { 129 long error; 130 long value; 131 }; 132 133 static inline unsigned long sbi_mk_version(unsigned long major, unsigned long minor) 134 { 135 return ((major & SBI_SPEC_VERSION_MAJOR_MASK) << SBI_SPEC_VERSION_MAJOR_SHIFT) 136 | (minor & SBI_SPEC_VERSION_MINOR_MASK); 137 } 138 139 static inline unsigned long sbi_impl_opensbi_mk_version(unsigned long major, unsigned long minor) 140 { 141 return (((major & 0xffff) << 16) | (minor & 0xffff)); 142 } 143 144 struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, 145 unsigned long arg1, unsigned long arg2, 146 unsigned long arg3, unsigned long arg4, 147 unsigned long arg5); 148 149 void sbi_shutdown(void); 150 struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp); 151 struct sbiret sbi_hart_stop(void); 152 struct sbiret sbi_hart_get_status(unsigned long hartid); 153 struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base); 154 struct sbiret sbi_send_ipi_cpu(int cpu); 155 struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask); 156 struct sbiret sbi_send_ipi_broadcast(void); 157 struct sbiret sbi_set_timer(unsigned long stime_value); 158 struct sbiret sbi_get_spec_version(void); 159 unsigned long sbi_get_imp_version(void); 160 unsigned long sbi_get_imp_id(void); 161 long sbi_probe(int ext); 162 163 #endif /* !__ASSEMBLER__ */ 164 #endif /* _ASMRISCV_SBI_H_ */ 165