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 #ifndef __ASSEMBLER__ 22 #include <cpumask.h> 23 24 enum sbi_ext_id { 25 SBI_EXT_BASE = 0x10, 26 SBI_EXT_TIME = 0x54494d45, 27 SBI_EXT_IPI = 0x735049, 28 SBI_EXT_HSM = 0x48534d, 29 SBI_EXT_SRST = 0x53525354, 30 SBI_EXT_DBCN = 0x4442434E, 31 SBI_EXT_SUSP = 0x53555350, 32 SBI_EXT_FWFT = 0x46574654, 33 }; 34 35 enum sbi_ext_base_fid { 36 SBI_EXT_BASE_GET_SPEC_VERSION = 0, 37 SBI_EXT_BASE_GET_IMP_ID, 38 SBI_EXT_BASE_GET_IMP_VERSION, 39 SBI_EXT_BASE_PROBE_EXT, 40 SBI_EXT_BASE_GET_MVENDORID, 41 SBI_EXT_BASE_GET_MARCHID, 42 SBI_EXT_BASE_GET_MIMPID, 43 }; 44 45 enum sbi_ext_hsm_fid { 46 SBI_EXT_HSM_HART_START = 0, 47 SBI_EXT_HSM_HART_STOP, 48 SBI_EXT_HSM_HART_STATUS, 49 SBI_EXT_HSM_HART_SUSPEND, 50 }; 51 52 enum sbi_ext_time_fid { 53 SBI_EXT_TIME_SET_TIMER = 0, 54 }; 55 56 enum sbi_ext_ipi_fid { 57 SBI_EXT_IPI_SEND_IPI = 0, 58 }; 59 60 enum sbi_ext_hsm_sid { 61 SBI_EXT_HSM_STARTED = 0, 62 SBI_EXT_HSM_STOPPED, 63 SBI_EXT_HSM_START_PENDING, 64 SBI_EXT_HSM_STOP_PENDING, 65 SBI_EXT_HSM_SUSPENDED, 66 SBI_EXT_HSM_SUSPEND_PENDING, 67 SBI_EXT_HSM_RESUME_PENDING, 68 }; 69 70 enum sbi_ext_hsm_hart_suspend_type { 71 SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0, 72 SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000, 73 }; 74 75 enum sbi_ext_dbcn_fid { 76 SBI_EXT_DBCN_CONSOLE_WRITE = 0, 77 SBI_EXT_DBCN_CONSOLE_READ, 78 SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, 79 }; 80 81 82 enum sbi_ext_fwft_fid { 83 SBI_EXT_FWFT_SET = 0, 84 SBI_EXT_FWFT_GET, 85 }; 86 87 #define SBI_FWFT_MISALIGNED_EXC_DELEG 0x0 88 #define SBI_FWFT_LANDING_PAD 0x1 89 #define SBI_FWFT_SHADOW_STACK 0x2 90 #define SBI_FWFT_DOUBLE_TRAP 0x3 91 #define SBI_FWFT_PTE_AD_HW_UPDATING 0x4 92 #define SBI_FWFT_POINTER_MASKING_PMLEN 0x5 93 #define SBI_FWFT_LOCAL_RESERVED_START 0x6 94 #define SBI_FWFT_LOCAL_RESERVED_END 0x3fffffff 95 #define SBI_FWFT_LOCAL_PLATFORM_START 0x40000000 96 #define SBI_FWFT_LOCAL_PLATFORM_END 0x7fffffff 97 98 #define SBI_FWFT_GLOBAL_RESERVED_START 0x80000000 99 #define SBI_FWFT_GLOBAL_RESERVED_END 0xbfffffff 100 #define SBI_FWFT_GLOBAL_PLATFORM_START 0xc0000000 101 #define SBI_FWFT_GLOBAL_PLATFORM_END 0xffffffff 102 103 #define SBI_FWFT_PLATFORM_FEATURE_BIT BIT(30) 104 #define SBI_FWFT_GLOBAL_FEATURE_BIT BIT(31) 105 106 #define SBI_FWFT_SET_FLAG_LOCK BIT(0) 107 108 struct sbiret { 109 long error; 110 long value; 111 }; 112 113 struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, 114 unsigned long arg1, unsigned long arg2, 115 unsigned long arg3, unsigned long arg4, 116 unsigned long arg5); 117 118 void sbi_shutdown(void); 119 struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp); 120 struct sbiret sbi_hart_stop(void); 121 struct sbiret sbi_hart_get_status(unsigned long hartid); 122 struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base); 123 struct sbiret sbi_send_ipi_cpu(int cpu); 124 struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask); 125 struct sbiret sbi_send_ipi_broadcast(void); 126 struct sbiret sbi_set_timer(unsigned long stime_value); 127 long sbi_probe(int ext); 128 129 #endif /* !__ASSEMBLER__ */ 130 #endif /* _ASMRISCV_SBI_H_ */ 131