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