13cdf0b24SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */ 23cdf0b24SMarouene Boubakri /* 31af87903SMarouene Boubakri * Copyright 2022, 2025 NXP 43cdf0b24SMarouene Boubakri */ 53cdf0b24SMarouene Boubakri 6d50fee03SEtienne Carriere #ifndef __SBI_H 7d50fee03SEtienne Carriere #define __SBI_H 83cdf0b24SMarouene Boubakri 93cdf0b24SMarouene Boubakri #if defined(CFG_RISCV_SBI) 103cdf0b24SMarouene Boubakri 113cdf0b24SMarouene Boubakri /* SBI return error codes */ 123cdf0b24SMarouene Boubakri #define SBI_SUCCESS 0 133cdf0b24SMarouene Boubakri #define SBI_ERR_FAILURE -1 143cdf0b24SMarouene Boubakri #define SBI_ERR_NOT_SUPPORTED -2 153cdf0b24SMarouene Boubakri #define SBI_ERR_INVALID_PARAM -3 163cdf0b24SMarouene Boubakri #define SBI_ERR_DENIED -4 173cdf0b24SMarouene Boubakri #define SBI_ERR_INVALID_ADDRESS -5 183cdf0b24SMarouene Boubakri #define SBI_ERR_ALREADY_AVAILABLE -6 193cdf0b24SMarouene Boubakri #define SBI_ERR_ALREADY_STARTED -7 203cdf0b24SMarouene Boubakri #define SBI_ERR_ALREADY_STOPPED -8 211af87903SMarouene Boubakri #define SBI_ERR_NO_SHMEM -9 221af87903SMarouene Boubakri #define SBI_ERR_INVALID_STATE -10 231af87903SMarouene Boubakri #define SBI_ERR_BAD_RANGE -11 241af87903SMarouene Boubakri #define SBI_ERR_TIMEOUT -12 251af87903SMarouene Boubakri #define SBI_ERR_IO -13 261af87903SMarouene Boubakri #define SBI_ERR_DENIED_LOCKED -14 271af87903SMarouene Boubakri 281af87903SMarouene Boubakri #define SBI_LAST_ERR SBI_ERR_DENIED_LOCKED 293cdf0b24SMarouene Boubakri 303cdf0b24SMarouene Boubakri /* SBI Extension IDs */ 312b31189cSYu Chien Peter Lin #define SBI_EXT_0_1_CONSOLE_PUTCHAR 0x01 32d1c9f59aSYu Chien Peter Lin #define SBI_EXT_BASE 0x10 333cdf0b24SMarouene Boubakri #define SBI_EXT_HSM 0x48534D 34d1c9f59aSYu Chien Peter Lin #define SBI_EXT_DBCN 0x4442434E 350fb22936SAlvin Chang #define SBI_EXT_TEE 0x544545 36cc967d3fSMarouene Boubakri #define SBI_EXT_MPXY 0x4D505859 373cdf0b24SMarouene Boubakri 383cdf0b24SMarouene Boubakri #ifndef __ASSEMBLER__ 393cdf0b24SMarouene Boubakri 40*37ad62c2SMarouene Boubakri struct sbiret { 41*37ad62c2SMarouene Boubakri long error; 42*37ad62c2SMarouene Boubakri long value; 43*37ad62c2SMarouene Boubakri }; 44*37ad62c2SMarouene Boubakri 45*37ad62c2SMarouene Boubakri #define _sbi_ecall(ext, fid, arg0, arg1, arg2, arg3, arg4, arg5, ...) ({ \ 46*37ad62c2SMarouene Boubakri register unsigned long a0 asm("a0") = (unsigned long)arg0; \ 47*37ad62c2SMarouene Boubakri register unsigned long a1 asm("a1") = (unsigned long)arg1; \ 48*37ad62c2SMarouene Boubakri register unsigned long a2 asm("a2") = (unsigned long)arg2; \ 49*37ad62c2SMarouene Boubakri register unsigned long a3 asm("a3") = (unsigned long)arg3; \ 50*37ad62c2SMarouene Boubakri register unsigned long a4 asm("a4") = (unsigned long)arg4; \ 51*37ad62c2SMarouene Boubakri register unsigned long a5 asm("a5") = (unsigned long)arg5; \ 52*37ad62c2SMarouene Boubakri register unsigned long a6 asm("a6") = (unsigned long)fid; \ 53*37ad62c2SMarouene Boubakri register unsigned long a7 asm("a7") = (unsigned long)ext; \ 54*37ad62c2SMarouene Boubakri asm volatile ("ecall" \ 55*37ad62c2SMarouene Boubakri : "+r" (a0), "+r" (a1) \ 56*37ad62c2SMarouene Boubakri : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r"(a6), "r"(a7) \ 57*37ad62c2SMarouene Boubakri : "memory"); \ 58*37ad62c2SMarouene Boubakri (struct sbiret){ .error = a0, .value = a1 }; \ 59*37ad62c2SMarouene Boubakri }) 60*37ad62c2SMarouene Boubakri 61*37ad62c2SMarouene Boubakri #define sbi_ecall(...) _sbi_ecall(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0) 62*37ad62c2SMarouene Boubakri 63d1c9f59aSYu Chien Peter Lin /* SBI function IDs for Base extension */ 64d1c9f59aSYu Chien Peter Lin enum sbi_ext_base_fid { 65d1c9f59aSYu Chien Peter Lin SBI_EXT_BASE_GET_SPEC_VERSION = 0, 66d1c9f59aSYu Chien Peter Lin SBI_EXT_BASE_GET_IMP_ID, 67d1c9f59aSYu Chien Peter Lin SBI_EXT_BASE_GET_IMP_VERSION, 68d1c9f59aSYu Chien Peter Lin SBI_EXT_BASE_PROBE_EXT, 69d1c9f59aSYu Chien Peter Lin SBI_EXT_BASE_GET_MVENDORID, 70d1c9f59aSYu Chien Peter Lin SBI_EXT_BASE_GET_MARCHID, 71d1c9f59aSYu Chien Peter Lin SBI_EXT_BASE_GET_MIMPID, 72d1c9f59aSYu Chien Peter Lin }; 73d1c9f59aSYu Chien Peter Lin 74286e0fd9SYu Chien Peter Lin /* SBI function IDs for HSM extension */ 75286e0fd9SYu Chien Peter Lin enum sbi_ext_hsm_fid { 76286e0fd9SYu Chien Peter Lin SBI_EXT_HSM_HART_START = 0, 77286e0fd9SYu Chien Peter Lin SBI_EXT_HSM_HART_STOP, 78286e0fd9SYu Chien Peter Lin SBI_EXT_HSM_HART_GET_STATUS, 79286e0fd9SYu Chien Peter Lin SBI_EXT_HSM_HART_SUSPEND, 80286e0fd9SYu Chien Peter Lin }; 81286e0fd9SYu Chien Peter Lin 82d1c9f59aSYu Chien Peter Lin /* SBI function IDs for Debug Console extension */ 83d1c9f59aSYu Chien Peter Lin enum sbi_ext_dbcn_fid { 84d1c9f59aSYu Chien Peter Lin SBI_EXT_DBCN_CONSOLE_WRITE = 0, 85d1c9f59aSYu Chien Peter Lin SBI_EXT_DBCN_CONSOLE_READ = 1, 86d1c9f59aSYu Chien Peter Lin SBI_EXT_DBCN_CONSOLE_WRITE_BYTE = 2, 87d1c9f59aSYu Chien Peter Lin }; 88d1c9f59aSYu Chien Peter Lin 8972fc7d74SYu-Chien Peter Lin enum sbi_hsm_hart_state { 9072fc7d74SYu-Chien Peter Lin SBI_HSM_STATE_STARTED = 0, 9172fc7d74SYu-Chien Peter Lin SBI_HSM_STATE_STOPPED, 9272fc7d74SYu-Chien Peter Lin SBI_HSM_STATE_START_PENDING, 9372fc7d74SYu-Chien Peter Lin SBI_HSM_STATE_STOP_PENDING, 9472fc7d74SYu-Chien Peter Lin SBI_HSM_STATE_SUSPENDED, 9572fc7d74SYu-Chien Peter Lin SBI_HSM_STATE_SUSPEND_PENDING, 9672fc7d74SYu-Chien Peter Lin SBI_HSM_STATE_RESUME_PENDING, 9772fc7d74SYu-Chien Peter Lin }; 9872fc7d74SYu-Chien Peter Lin 993cdf0b24SMarouene Boubakri #include <compiler.h> 1003cdf0b24SMarouene Boubakri #include <encoding.h> 1013cdf0b24SMarouene Boubakri #include <stdint.h> 1023cdf0b24SMarouene Boubakri #include <sys/cdefs.h> 1033cdf0b24SMarouene Boubakri #include <types_ext.h> 1043cdf0b24SMarouene Boubakri #include <util.h> 1053cdf0b24SMarouene Boubakri 106d1c9f59aSYu Chien Peter Lin int sbi_probe_extension(int extid); 1073cdf0b24SMarouene Boubakri void sbi_console_putchar(int ch); 108d1c9f59aSYu Chien Peter Lin int sbi_dbcn_write_byte(unsigned char ch); 109286e0fd9SYu Chien Peter Lin int sbi_hsm_hart_start(uint32_t hartid, paddr_t start_addr, unsigned long arg); 11072fc7d74SYu-Chien Peter Lin int sbi_hsm_hart_get_status(uint32_t hartid, enum sbi_hsm_hart_state *status); 1113cdf0b24SMarouene Boubakri 1123cdf0b24SMarouene Boubakri #endif /*__ASSEMBLER__*/ 1133cdf0b24SMarouene Boubakri #endif /*defined(CFG_RISCV_SBI)*/ 114d50fee03SEtienne Carriere #endif /*__SBI_H*/ 115