xref: /optee_os/core/arch/riscv/kernel/sbi.c (revision 37ad62c2965e3922d0cb8d8d468e912412c26fcb)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright 2022 NXP
4  */
5 
6 #include <riscv.h>
7 #include <sbi.h>
8 
9 /**
10  * sbi_probe_extension() - Check if an SBI extension ID is supported or not.
11  * @extid: The extension ID to be probed.
12  *
13  * Return: 1 or an extension specific nonzero value if yes, 0 otherwise.
14  */
sbi_probe_extension(int extid)15 int sbi_probe_extension(int extid)
16 {
17 	struct sbiret ret = { };
18 
19 	ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, extid);
20 	if (!ret.error)
21 		return ret.value;
22 
23 	return 0;
24 }
25 
26 /**
27  * sbi_console_putchar() - Writes given character to the console device.
28  * @ch: The data to be written to the console.
29  */
sbi_console_putchar(int ch)30 void sbi_console_putchar(int ch)
31 {
32 	sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, ch);
33 }
34 
35 /**
36  * sbi_dbcn_write_byte() - Write byte to debug console
37  * @ch:         Byte to be written
38  *
39  * Return:      SBI error code (SBI_SUCCESS = 0 on success)
40  */
sbi_dbcn_write_byte(unsigned char ch)41 int sbi_dbcn_write_byte(unsigned char ch)
42 {
43 	struct sbiret ret = { };
44 
45 	ret = sbi_ecall(SBI_EXT_DBCN, SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, ch);
46 	return ret.error;
47 }
48 
49 /**
50  * sbi_hsm_hart_start() - Start target hart at OP-TEE entry in S-mode
51  * @hartid:     Target hart ID
52  * @start_addr: Physical address of OP-TEE entry
53  * @arg:        opaque parameter, typically used as the physical
54  *              address of device-tree passed via @arg->a1
55  *
56  * Return:      SBI error code (SBI_SUCCESS = 0 on success)
57  */
sbi_hsm_hart_start(uint32_t hartid,paddr_t start_addr,unsigned long arg)58 int sbi_hsm_hart_start(uint32_t hartid, paddr_t start_addr, unsigned long arg)
59 {
60 	struct sbiret ret = { };
61 
62 	ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_START, hartid, start_addr,
63 			arg);
64 
65 	return ret.error;
66 }
67 
68 /**
69  * sbi_hsm_hart_get_status() - Get the current HSM state of given hart
70  * @hartid:         Target hart ID
71  * @status:         Pointer to store HSM state
72  *
73  * Return:          SBI error code (SBI_SUCCESS = 0 on success)
74  */
sbi_hsm_hart_get_status(uint32_t hartid,enum sbi_hsm_hart_state * status)75 int sbi_hsm_hart_get_status(uint32_t hartid, enum sbi_hsm_hart_state *status)
76 {
77 	struct sbiret ret = { };
78 
79 	ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_GET_STATUS, hartid);
80 
81 	if (ret.error)
82 		return ret.error;
83 
84 	*status = ret.value;
85 	return SBI_SUCCESS;
86 }
87