1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright 2022 NXP
4  */
5 
6 #include <riscv.h>
7 #include <sbi.h>
8 
9 struct sbiret {
10 	long error;
11 	long value;
12 };
13 
14 #define _sbi_ecall(ext, fid, arg0, arg1, arg2, arg3, arg4, arg5, ...) ({  \
15 	register unsigned long a0 asm("a0") = (unsigned long)arg0; \
16 	register unsigned long a1 asm("a1") = (unsigned long)arg1; \
17 	register unsigned long a2 asm("a2") = (unsigned long)arg2; \
18 	register unsigned long a3 asm("a3") = (unsigned long)arg3; \
19 	register unsigned long a4 asm("a4") = (unsigned long)arg4; \
20 	register unsigned long a5 asm("a5") = (unsigned long)arg5; \
21 	register unsigned long a6 asm("a6") = (unsigned long)fid;  \
22 	register unsigned long a7 asm("a7") = (unsigned long)ext;  \
23 	asm volatile ("ecall" \
24 		: "+r" (a0), "+r" (a1) \
25 		: "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r"(a6), "r"(a7) \
26 		: "memory"); \
27 	(struct sbiret){ .error = a0, .value = a1 }; \
28 })
29 
30 #define sbi_ecall(...) _sbi_ecall(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0)
31 
sbi_console_putchar(int ch)32 void sbi_console_putchar(int ch)
33 {
34 	sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR, (unsigned long)ch);
35 }
36 
sbi_boot_hart(uint32_t hart_id,paddr_t start_addr,unsigned long arg)37 int sbi_boot_hart(uint32_t hart_id, paddr_t start_addr, unsigned long arg)
38 {
39 	struct sbiret ret;
40 
41 	ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_START, hart_id, start_addr, arg);
42 
43 	return ret.error;
44 }
45