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