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 149c92b28eSAndrew Jones 159c92b28eSAndrew Jones #ifndef __ASSEMBLY__ 1625475fa5SAndrew Jones #include <cpumask.h> 179c92b28eSAndrew Jones 189ccb00e4SAndrew Jones enum sbi_ext_id { 199ccb00e4SAndrew Jones SBI_EXT_BASE = 0x10, 2014fa12b1SJames Raphael Tiovalen SBI_EXT_TIME = 0x54494d45, 216489b8b0SJames Raphael Tiovalen SBI_EXT_IPI = 0x735049, 229c92b28eSAndrew Jones SBI_EXT_HSM = 0x48534d, 239ccb00e4SAndrew Jones SBI_EXT_SRST = 0x53525354, 24ce58d3a4SCade Richard SBI_EXT_DBCN = 0x4442434E, 259ccb00e4SAndrew Jones }; 269ccb00e4SAndrew Jones 279ccb00e4SAndrew Jones enum sbi_ext_base_fid { 289ccb00e4SAndrew Jones SBI_EXT_BASE_GET_SPEC_VERSION = 0, 299ccb00e4SAndrew Jones SBI_EXT_BASE_GET_IMP_ID, 309ccb00e4SAndrew Jones SBI_EXT_BASE_GET_IMP_VERSION, 319ccb00e4SAndrew Jones SBI_EXT_BASE_PROBE_EXT, 329ccb00e4SAndrew Jones SBI_EXT_BASE_GET_MVENDORID, 339ccb00e4SAndrew Jones SBI_EXT_BASE_GET_MARCHID, 349ccb00e4SAndrew Jones SBI_EXT_BASE_GET_MIMPID, 359ccb00e4SAndrew Jones }; 369ccb00e4SAndrew Jones 379c92b28eSAndrew Jones enum sbi_ext_hsm_fid { 389c92b28eSAndrew Jones SBI_EXT_HSM_HART_START = 0, 399c92b28eSAndrew Jones SBI_EXT_HSM_HART_STOP, 409c92b28eSAndrew Jones SBI_EXT_HSM_HART_STATUS, 419c92b28eSAndrew Jones SBI_EXT_HSM_HART_SUSPEND, 429c92b28eSAndrew Jones }; 439c92b28eSAndrew Jones 4414fa12b1SJames Raphael Tiovalen enum sbi_ext_time_fid { 4514fa12b1SJames Raphael Tiovalen SBI_EXT_TIME_SET_TIMER = 0, 4614fa12b1SJames Raphael Tiovalen }; 4714fa12b1SJames Raphael Tiovalen 486489b8b0SJames Raphael Tiovalen enum sbi_ext_ipi_fid { 496489b8b0SJames Raphael Tiovalen SBI_EXT_IPI_SEND_IPI = 0, 506489b8b0SJames Raphael Tiovalen }; 516489b8b0SJames Raphael Tiovalen 5267b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_sid { 5367b8f462SJames Raphael Tiovalen SBI_EXT_HSM_STARTED = 0, 5467b8f462SJames Raphael Tiovalen SBI_EXT_HSM_STOPPED, 5567b8f462SJames Raphael Tiovalen SBI_EXT_HSM_START_PENDING, 5667b8f462SJames Raphael Tiovalen SBI_EXT_HSM_STOP_PENDING, 5767b8f462SJames Raphael Tiovalen SBI_EXT_HSM_SUSPENDED, 5867b8f462SJames Raphael Tiovalen SBI_EXT_HSM_SUSPEND_PENDING, 5967b8f462SJames Raphael Tiovalen SBI_EXT_HSM_RESUME_PENDING, 6067b8f462SJames Raphael Tiovalen }; 6167b8f462SJames Raphael Tiovalen 6267b8f462SJames Raphael Tiovalen enum sbi_ext_hsm_hart_suspend_type { 6367b8f462SJames Raphael Tiovalen SBI_EXT_HSM_HART_SUSPEND_RETENTIVE = 0, 6467b8f462SJames Raphael Tiovalen SBI_EXT_HSM_HART_SUSPEND_NON_RETENTIVE = 0x80000000, 6567b8f462SJames Raphael Tiovalen }; 6667b8f462SJames Raphael Tiovalen 67ce58d3a4SCade Richard enum sbi_ext_dbcn_fid { 68ce58d3a4SCade Richard SBI_EXT_DBCN_CONSOLE_WRITE = 0, 69ce58d3a4SCade Richard SBI_EXT_DBCN_CONSOLE_READ, 70ce58d3a4SCade Richard SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, 71ce58d3a4SCade Richard }; 72ce58d3a4SCade Richard 739ccb00e4SAndrew Jones struct sbiret { 749ccb00e4SAndrew Jones long error; 759ccb00e4SAndrew Jones long value; 769ccb00e4SAndrew Jones }; 779ccb00e4SAndrew Jones 789ccb00e4SAndrew Jones struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, 799ccb00e4SAndrew Jones unsigned long arg1, unsigned long arg2, 809ccb00e4SAndrew Jones unsigned long arg3, unsigned long arg4, 819ccb00e4SAndrew Jones unsigned long arg5); 829ccb00e4SAndrew Jones 839ccb00e4SAndrew Jones void sbi_shutdown(void); 849c92b28eSAndrew Jones struct sbiret sbi_hart_start(unsigned long hartid, unsigned long entry, unsigned long sp); 8567b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_stop(void); 8667b8f462SJames Raphael Tiovalen struct sbiret sbi_hart_get_status(unsigned long hartid); 876489b8b0SJames Raphael Tiovalen struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base); 8825475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpu(int cpu); 8925475fa5SAndrew Jones struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask); 90*56ca8093SAndrew Jones struct sbiret sbi_send_ipi_broadcast(void); 919340e4b7SAndrew Jones struct sbiret sbi_set_timer(unsigned long stime_value); 927040d2a9SJames Raphael Tiovalen long sbi_probe(int ext); 939ccb00e4SAndrew Jones 949c92b28eSAndrew Jones #endif /* !__ASSEMBLY__ */ 959ccb00e4SAndrew Jones #endif /* _ASMRISCV_SBI_H_ */ 96