19ccb00e4SAndrew Jones /* SPDX-License-Identifier: GPL-2.0-only */ 29ccb00e4SAndrew Jones #ifndef _ASMRISCV_SBI_H_ 39ccb00e4SAndrew Jones #define _ASMRISCV_SBI_H_ 49ccb00e4SAndrew Jones 59c92b28eSAndrew Jones #define SBI_SUCCESS 0 69c92b28eSAndrew Jones #define SBI_ERR_FAILURE -1 79c92b28eSAndrew Jones #define SBI_ERR_NOT_SUPPORTED -2 89c92b28eSAndrew Jones #define SBI_ERR_INVALID_PARAM -3 99c92b28eSAndrew Jones #define SBI_ERR_DENIED -4 109c92b28eSAndrew Jones #define SBI_ERR_INVALID_ADDRESS -5 119c92b28eSAndrew Jones #define SBI_ERR_ALREADY_AVAILABLE -6 129c92b28eSAndrew Jones #define SBI_ERR_ALREADY_STARTED -7 139c92b28eSAndrew Jones #define SBI_ERR_ALREADY_STOPPED -8 14f1302432SClément Léger #define SBI_ERR_NO_SHMEM -9 15f1302432SClément Léger #define SBI_ERR_INVALID_STATE -10 16f1302432SClément Léger #define SBI_ERR_BAD_RANGE -11 17f1302432SClément Léger #define SBI_ERR_TIMEOUT -12 18f1302432SClément Léger #define SBI_ERR_IO -13 19f1302432SClément Léger #define SBI_ERR_DENIED_LOCKED -14 209c92b28eSAndrew Jones 21240729eeSClément Léger #define SBI_IMPL_BBL 0 22240729eeSClément Léger #define SBI_IMPL_OPENSBI 1 23240729eeSClément Léger #define SBI_IMPL_XVISOR 2 24240729eeSClément Léger #define SBI_IMPL_KVM 3 25240729eeSClément Léger #define SBI_IMPL_RUSTSBI 4 26240729eeSClément Léger #define SBI_IMPL_DIOSIX 5 27240729eeSClément Léger #define SBI_IMPL_COFFER 6 28240729eeSClément Léger #define SBI_IMPL_XEN 7 29240729eeSClément Léger #define SBI_IMPL_POLARFIRE_HSS 8 30240729eeSClément Léger #define SBI_IMPL_COREBOOT 9 31240729eeSClément Léger #define SBI_IMPL_OREBOOT 10 32240729eeSClément Léger #define SBI_IMPL_BHYVE 11 33240729eeSClément Léger 34b9d58c27SClément Léger /* SBI spec version fields */ 35b9d58c27SClément Léger #define SBI_SPEC_VERSION_MAJOR_SHIFT 24 36b9d58c27SClément Léger #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f 37b9d58c27SClément Léger #define SBI_SPEC_VERSION_MINOR_MASK 0xffffff 38b9d58c27SClément Léger #define SBI_SPEC_VERSION_MASK ((SBI_SPEC_VERSION_MAJOR_MASK << SBI_SPEC_VERSION_MAJOR_SHIFT) | \ 39b9d58c27SClément Léger SBI_SPEC_VERSION_MINOR_MASK) 40b9d58c27SClément Léger 410cc3a351SSean Christopherson #ifndef __ASSEMBLER__ 4225475fa5SAndrew Jones #include <cpumask.h> 439c92b28eSAndrew Jones 449ccb00e4SAndrew Jones enum sbi_ext_id { 459ccb00e4SAndrew Jones SBI_EXT_BASE = 0x10, 4614fa12b1SJames Raphael Tiovalen SBI_EXT_TIME = 0x54494d45, 476489b8b0SJames Raphael Tiovalen SBI_EXT_IPI = 0x735049, 489c92b28eSAndrew Jones SBI_EXT_HSM = 0x48534d, 499ccb00e4SAndrew Jones SBI_EXT_SRST = 0x53525354, 50ce58d3a4SCade Richard SBI_EXT_DBCN = 0x4442434E, 512ffe016fSAndrew Jones SBI_EXT_SUSP = 0x53555350, 52f1302432SClément Léger SBI_EXT_FWFT = 0x46574654, 53*f16317a7SClément Léger SBI_EXT_SSE = 0x535345, 549ccb00e4SAndrew Jones }; 559ccb00e4SAndrew Jones 569ccb00e4SAndrew Jones enum sbi_ext_base_fid { 579ccb00e4SAndrew Jones SBI_EXT_BASE_GET_SPEC_VERSION = 0, 589ccb00e4SAndrew Jones SBI_EXT_BASE_GET_IMP_ID, 599ccb00e4SAndrew Jones SBI_EXT_BASE_GET_IMP_VERSION, 609ccb00e4SAndrew Jones SBI_EXT_BASE_PROBE_EXT, 619ccb00e4SAndrew Jones SBI_EXT_BASE_GET_MVENDORID, 629ccb00e4SAndrew Jones SBI_EXT_BASE_GET_MARCHID, 639ccb00e4SAndrew Jones SBI_EXT_BASE_GET_MIMPID, 649ccb00e4SAndrew Jones }; 659ccb00e4SAndrew Jones 669c92b28eSAndrew Jones enum sbi_ext_hsm_fid { 679c92b28eSAndrew Jones SBI_EXT_HSM_HART_START = 0, 689c92b28eSAndrew Jones SBI_EXT_HSM_HART_STOP, 699c92b28eSAndrew Jones SBI_EXT_HSM_HART_STATUS, 709c92b28eSAndrew Jones SBI_EXT_HSM_HART_SUSPEND, 719c92b28eSAndrew Jones }; 729c92b28eSAndrew Jones 7314fa12b1SJames Raphael Tiovalen enum sbi_ext_time_fid { 7414fa12b1SJames Raphael Tiovalen SBI_EXT_TIME_SET_TIMER = 0, 7514fa12b1SJames Raphael Tiovalen }; 7614fa12b1SJames Raphael Tiovalen 776489b8b0SJames Raphael Tiovalen enum sbi_ext_ipi_fid { 786489b8b0SJames Raphael Tiovalen SBI_EXT_IPI_SEND_IPI = 0, 796489b8b0SJames Raphael Tiovalen }; 806489b8b0SJames Raphael Tiovalen 8167b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_sid { 8267b8f462SJames Raphael Tiovalen SBI_EXT_HSM_STARTED = 0, 8367b8f462SJames Raphael Tiovalen SBI_EXT_HSM_STOPPED, 8467b8f462SJames Raphael Tiovalen SBI_EXT_HSM_START_PENDING, 8567b8f462SJames Raphael Tiovalen SBI_EXT_HSM_STOP_PENDING, 8667b8f462SJames Raphael Tiovalen SBI_EXT_HSM_SUSPENDED, 8767b8f462SJames Raphael Tiovalen SBI_EXT_HSM_SUSPEND_PENDING, 8867b8f462SJames Raphael Tiovalen SBI_EXT_HSM_RESUME_PENDING, 8967b8f462SJames Raphael Tiovalen }; 9067b8f462SJames Raphael Tiovalen 9167b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_hart_suspend_type { 9267b8f462SJames Raphael Tiovalen SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0, 9367b8f462SJames Raphael Tiovalen SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000, 9467b8f462SJames Raphael Tiovalen }; 9567b8f462SJames Raphael Tiovalen 96ce58d3a4SCade Richard enum sbi_ext_dbcn_fid { 97ce58d3a4SCade Richard SBI_EXT_DBCN_CONSOLE_WRITE = 0, 98ce58d3a4SCade Richard SBI_EXT_DBCN_CONSOLE_READ, 99ce58d3a4SCade Richard SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, 100ce58d3a4SCade Richard }; 101ce58d3a4SCade Richard 102f1302432SClément Léger enum sbi_ext_fwft_fid { 103f1302432SClément Léger SBI_EXT_FWFT_SET = 0, 104f1302432SClément Léger SBI_EXT_FWFT_GET, 105f1302432SClément Léger }; 106f1302432SClément Léger 107f1302432SClément Léger #define SBI_FWFT_MISALIGNED_EXC_DELEG 0x0 108f1302432SClément Léger #define SBI_FWFT_LANDING_PAD 0x1 109f1302432SClément Léger #define SBI_FWFT_SHADOW_STACK 0x2 110f1302432SClément Léger #define SBI_FWFT_DOUBLE_TRAP 0x3 111f1302432SClément Léger #define SBI_FWFT_PTE_AD_HW_UPDATING 0x4 112f1302432SClément Léger #define SBI_FWFT_POINTER_MASKING_PMLEN 0x5 113f1302432SClément Léger #define SBI_FWFT_LOCAL_RESERVED_START 0x6 114f1302432SClément Léger #define SBI_FWFT_LOCAL_RESERVED_END 0x3fffffff 115f1302432SClément Léger #define SBI_FWFT_LOCAL_PLATFORM_START 0x40000000 116f1302432SClément Léger #define SBI_FWFT_LOCAL_PLATFORM_END 0x7fffffff 117f1302432SClément Léger 118f1302432SClément Léger #define SBI_FWFT_GLOBAL_RESERVED_START 0x80000000 119f1302432SClément Léger #define SBI_FWFT_GLOBAL_RESERVED_END 0xbfffffff 120f1302432SClément Léger #define SBI_FWFT_GLOBAL_PLATFORM_START 0xc0000000 121f1302432SClément Léger #define SBI_FWFT_GLOBAL_PLATFORM_END 0xffffffff 122f1302432SClément Léger 123f1302432SClément Léger #define SBI_FWFT_PLATFORM_FEATURE_BIT BIT(30) 124f1302432SClément Léger #define SBI_FWFT_GLOBAL_FEATURE_BIT BIT(31) 125f1302432SClément Léger 126f1302432SClément Léger #define SBI_FWFT_SET_FLAG_LOCK BIT(0) 127f1302432SClément Léger 128*f16317a7SClément Léger enum sbi_ext_sse_fid { 129*f16317a7SClément Léger SBI_EXT_SSE_READ_ATTRS = 0, 130*f16317a7SClément Léger SBI_EXT_SSE_WRITE_ATTRS, 131*f16317a7SClément Léger SBI_EXT_SSE_REGISTER, 132*f16317a7SClément Léger SBI_EXT_SSE_UNREGISTER, 133*f16317a7SClément Léger SBI_EXT_SSE_ENABLE, 134*f16317a7SClément Léger SBI_EXT_SSE_DISABLE, 135*f16317a7SClément Léger SBI_EXT_SSE_COMPLETE, 136*f16317a7SClément Léger SBI_EXT_SSE_INJECT, 137*f16317a7SClément Léger SBI_EXT_SSE_HART_UNMASK, 138*f16317a7SClément Léger SBI_EXT_SSE_HART_MASK, 139*f16317a7SClément Léger }; 140*f16317a7SClément Léger 141*f16317a7SClément Léger /* SBI SSE Event Attributes. */ 142*f16317a7SClément Léger enum sbi_sse_attr_id { 143*f16317a7SClément Léger SBI_SSE_ATTR_STATUS = 0x00000000, 144*f16317a7SClément Léger SBI_SSE_ATTR_PRIORITY = 0x00000001, 145*f16317a7SClément Léger SBI_SSE_ATTR_CONFIG = 0x00000002, 146*f16317a7SClément Léger SBI_SSE_ATTR_PREFERRED_HART = 0x00000003, 147*f16317a7SClément Léger SBI_SSE_ATTR_ENTRY_PC = 0x00000004, 148*f16317a7SClément Léger SBI_SSE_ATTR_ENTRY_ARG = 0x00000005, 149*f16317a7SClément Léger SBI_SSE_ATTR_INTERRUPTED_SEPC = 0x00000006, 150*f16317a7SClément Léger SBI_SSE_ATTR_INTERRUPTED_FLAGS = 0x00000007, 151*f16317a7SClément Léger SBI_SSE_ATTR_INTERRUPTED_A6 = 0x00000008, 152*f16317a7SClément Léger SBI_SSE_ATTR_INTERRUPTED_A7 = 0x00000009, 153*f16317a7SClément Léger }; 154*f16317a7SClément Léger 155*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_STATE_OFFSET 0 156*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_STATE_MASK 0x3 157*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_PENDING_OFFSET 2 158*f16317a7SClément Léger #define SBI_SSE_ATTR_STATUS_INJECT_OFFSET 3 159*f16317a7SClément Léger 160*f16317a7SClément Léger #define SBI_SSE_ATTR_CONFIG_ONESHOT BIT(0) 161*f16317a7SClément Léger 162*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SPP BIT(0) 163*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SPIE BIT(1) 164*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_HSTATUS_SPV BIT(2) 165*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_HSTATUS_SPVP BIT(3) 166*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SPELP BIT(4) 167*f16317a7SClément Léger #define SBI_SSE_ATTR_INTERRUPTED_FLAGS_SSTATUS_SDT BIT(5) 168*f16317a7SClément Léger 169*f16317a7SClément Léger enum sbi_sse_state { 170*f16317a7SClément Léger SBI_SSE_STATE_UNUSED = 0, 171*f16317a7SClément Léger SBI_SSE_STATE_REGISTERED = 1, 172*f16317a7SClément Léger SBI_SSE_STATE_ENABLED = 2, 173*f16317a7SClément Léger SBI_SSE_STATE_RUNNING = 3, 174*f16317a7SClément Léger }; 175*f16317a7SClément Léger 176*f16317a7SClément Léger /* SBI SSE Event IDs. */ 177*f16317a7SClément Léger /* Range 0x00000000 - 0x0000ffff */ 178*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_HIGH_PRIO_RAS 0x00000000 179*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_DOUBLE_TRAP 0x00000001 180*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_0_START 0x00000002 181*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_0_END 0x00003fff 182*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_0_START 0x00004000 183*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_0_END 0x00007fff 184*f16317a7SClément Léger 185*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_HIGH_PRIO_RAS 0x00008000 186*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_0_START 0x00008001 187*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_0_END 0x0000bfff 188*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_0_START 0x0000c000 189*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_0_END 0x0000ffff 190*f16317a7SClément Léger 191*f16317a7SClément Léger /* Range 0x00010000 - 0x0001ffff */ 192*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PMU_OVERFLOW 0x00010000 193*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_1_START 0x00010001 194*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_1_END 0x00013fff 195*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_1_START 0x00014000 196*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_1_END 0x00017fff 197*f16317a7SClément Léger 198*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_1_START 0x00018000 199*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_1_END 0x0001bfff 200*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_1_START 0x0001c000 201*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_1_END 0x0001ffff 202*f16317a7SClément Léger 203*f16317a7SClément Léger /* Range 0x00100000 - 0x0010ffff */ 204*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_LOW_PRIO_RAS 0x00100000 205*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_2_START 0x00100001 206*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_2_END 0x00103fff 207*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_2_START 0x00104000 208*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_2_END 0x00107fff 209*f16317a7SClément Léger 210*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_LOW_PRIO_RAS 0x00108000 211*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_2_START 0x00108001 212*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_2_END 0x0010bfff 213*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_2_START 0x0010c000 214*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_2_END 0x0010ffff 215*f16317a7SClément Léger 216*f16317a7SClément Léger /* Range 0xffff0000 - 0xffffffff */ 217*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_SOFTWARE 0xffff0000 218*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_3_START 0xffff0001 219*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_RESERVED_3_END 0xffff3fff 220*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_3_START 0xffff4000 221*f16317a7SClément Léger #define SBI_SSE_EVENT_LOCAL_PLAT_3_END 0xffff7fff 222*f16317a7SClément Léger 223*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_SOFTWARE 0xffff8000 224*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_3_START 0xffff8001 225*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_RESERVED_3_END 0xffffbfff 226*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_3_START 0xffffc000 227*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_PLAT_3_END 0xffffffff 228*f16317a7SClément Léger 229*f16317a7SClément Léger #define SBI_SSE_EVENT_PLATFORM_BIT BIT(14) 230*f16317a7SClément Léger #define SBI_SSE_EVENT_GLOBAL_BIT BIT(15) 231*f16317a7SClément Léger 2329ccb00e4SAndrew Jones struct sbiret { 2339ccb00e4SAndrew Jones long error; 2349ccb00e4SAndrew Jones long value; 2359ccb00e4SAndrew Jones }; 2369ccb00e4SAndrew Jones 237b9d58c27SClément Léger static inline unsigned long sbi_mk_version(unsigned long major, unsigned long minor) 238b9d58c27SClément Léger { 239b9d58c27SClément Léger return ((major & SBI_SPEC_VERSION_MAJOR_MASK) << SBI_SPEC_VERSION_MAJOR_SHIFT) 240b9d58c27SClément Léger | (minor & SBI_SPEC_VERSION_MINOR_MASK); 241b9d58c27SClément Léger } 242b9d58c27SClément Léger 243240729eeSClément Léger static inline unsigned long sbi_impl_opensbi_mk_version(unsigned long major, unsigned long minor) 244240729eeSClément Léger { 245240729eeSClément Léger return (((major & 0xffff) << 16) | (minor & 0xffff)); 246240729eeSClément Léger } 247240729eeSClément Léger 2489ccb00e4SAndrew Jones struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, 2499ccb00e4SAndrew Jones unsigned long arg1, unsigned long arg2, 2509ccb00e4SAndrew Jones unsigned long arg3, unsigned long arg4, 2519ccb00e4SAndrew Jones unsigned long arg5); 2529ccb00e4SAndrew Jones 2539ccb00e4SAndrew Jones void sbi_shutdown(void); 2549c92b28eSAndrew Jones struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp); 25567b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_stop(void); 25667b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_get_status(unsigned long hartid); 2576489b8b0SJames Raphael Tiovalen struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base); 25825475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpu(int cpu); 25925475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask); 26056ca8093SAndrew Jones struct sbiret sbi_send_ipi_broadcast(void); 2619340e4b7SAndrew Jones struct sbiret sbi_set_timer(unsigned long stime_value); 262b9d58c27SClément Léger struct sbiret sbi_get_spec_version(void); 263240729eeSClément Léger unsigned long sbi_get_imp_version(void); 264240729eeSClément Léger unsigned long sbi_get_imp_id(void); 2657040d2a9SJames Raphael Tiovalen long sbi_probe(int ext); 2669ccb00e4SAndrew Jones 2670cc3a351SSean Christopherson #endif /* !__ASSEMBLER__ */ 2689ccb00e4SAndrew Jones #endif /* _ASMRISCV_SBI_H_ */ 269