xref: /optee_os/core/drivers/ffa_console.c (revision 5836737aa5b5987ddaab48ed34436f18e104a6c6)
1d4a87690SSungbae Yoo // SPDX-License-Identifier: BSD-2-Clause
2d4a87690SSungbae Yoo /*
3*5836737aSSungbae Yoo  * Copyright (c) 2024-2025, NVIDIA CORPORATION
4d4a87690SSungbae Yoo  */
5d4a87690SSungbae Yoo 
6d4a87690SSungbae Yoo #include <compiler.h>
7d4a87690SSungbae Yoo #include <console.h>
8d4a87690SSungbae Yoo #include <drivers/ffa_console.h>
9d4a87690SSungbae Yoo #include <drivers/serial.h>
10*5836737aSSungbae Yoo #include <kernel/dt_driver.h>
11d4a87690SSungbae Yoo #include <kernel/thread_arch.h>
12d4a87690SSungbae Yoo 
13d4a87690SSungbae Yoo #define FFA_CONSOLE_LOG_32		(0x8400008A)
14d4a87690SSungbae Yoo 
15d4a87690SSungbae Yoo static void ffa_console_putc(struct serial_chip *chip __unused, int ch)
16d4a87690SSungbae Yoo {
17d4a87690SSungbae Yoo 	thread_hvc(FFA_CONSOLE_LOG_32, 1, ch, 0);
18d4a87690SSungbae Yoo }
19d4a87690SSungbae Yoo 
20d4a87690SSungbae Yoo static const struct serial_ops ffa_console_ops = {
21d4a87690SSungbae Yoo 	.putc = ffa_console_putc,
22d4a87690SSungbae Yoo };
23d4a87690SSungbae Yoo DECLARE_KEEP_PAGER(ffa_console_ops);
24d4a87690SSungbae Yoo 
25d4a87690SSungbae Yoo static struct serial_chip ffa_console = {
26d4a87690SSungbae Yoo 	.ops = &ffa_console_ops
27d4a87690SSungbae Yoo };
28d4a87690SSungbae Yoo 
29d4a87690SSungbae Yoo void ffa_console_init(void)
30d4a87690SSungbae Yoo {
31d4a87690SSungbae Yoo 	register_serial_console(&ffa_console);
32d4a87690SSungbae Yoo }
33*5836737aSSungbae Yoo 
34*5836737aSSungbae Yoo #ifdef CFG_DT
35*5836737aSSungbae Yoo 
36*5836737aSSungbae Yoo static struct serial_chip *ffa_console_dev_alloc(void)
37*5836737aSSungbae Yoo {
38*5836737aSSungbae Yoo 	return &ffa_console;
39*5836737aSSungbae Yoo }
40*5836737aSSungbae Yoo 
41*5836737aSSungbae Yoo static int ffa_console_dev_init(struct serial_chip *chip __unused,
42*5836737aSSungbae Yoo 				const void *fdt __unused, int offs __unused,
43*5836737aSSungbae Yoo 				const char *params __unused)
44*5836737aSSungbae Yoo {
45*5836737aSSungbae Yoo 	return 0;
46*5836737aSSungbae Yoo }
47*5836737aSSungbae Yoo 
48*5836737aSSungbae Yoo static void ffa_console_dev_free(struct serial_chip *chip __unused)
49*5836737aSSungbae Yoo {
50*5836737aSSungbae Yoo }
51*5836737aSSungbae Yoo 
52*5836737aSSungbae Yoo static const struct serial_driver ffa_console_driver = {
53*5836737aSSungbae Yoo 	.dev_alloc = ffa_console_dev_alloc,
54*5836737aSSungbae Yoo 	.dev_init = ffa_console_dev_init,
55*5836737aSSungbae Yoo 	.dev_free = ffa_console_dev_free,
56*5836737aSSungbae Yoo };
57*5836737aSSungbae Yoo 
58*5836737aSSungbae Yoo static const struct dt_device_match ffa_console_match_table[] = {
59*5836737aSSungbae Yoo 	{ .compatible = "arm,ffa-console" },
60*5836737aSSungbae Yoo 	{ }
61*5836737aSSungbae Yoo };
62*5836737aSSungbae Yoo 
63*5836737aSSungbae Yoo DEFINE_DT_DRIVER(ffa_console_dt_driver) = {
64*5836737aSSungbae Yoo 	.name = "ffa-console",
65*5836737aSSungbae Yoo 	.type = DT_DRIVER_UART,
66*5836737aSSungbae Yoo 	.match_table = ffa_console_match_table,
67*5836737aSSungbae Yoo 	.driver = &ffa_console_driver,
68*5836737aSSungbae Yoo };
69*5836737aSSungbae Yoo 
70*5836737aSSungbae Yoo #endif /* CFG_DT */
71