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