xref: /optee_os/core/arch/riscv/include/sbi.h (revision 37ad62c2965e3922d0cb8d8d468e912412c26fcb)
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