xref: /optee_os/core/arch/riscv/kernel/sbi_console.c (revision 4d36f99e02cb402b724f43fb3522fedf5c191128)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright 2022 NXP
4  */
5 
6 #include <assert.h>
7 #include <compiler.h>
8 #include <config.h>
9 #include <console.h>
10 #include <drivers/serial.h>
11 #include <kernel/spinlock.h>
12 #include <riscv.h>
13 #include <sbi.h>
14 #include <trace.h>
15 #include <util.h>
16 
17 struct sbi_console_data {
18 	struct serial_chip chip;
19 };
20 
21 static struct sbi_console_data console_data __nex_bss;
22 static unsigned int sbi_console_global_lock __nex_bss = SPINLOCK_UNLOCK;
23 
24 static void sbi_console_lock_global(void)
25 {
26 	cpu_spin_lock(&sbi_console_global_lock);
27 }
28 
29 static void sbi_console_unlock_global(void)
30 {
31 	cpu_spin_unlock(&sbi_console_global_lock);
32 }
33 
34 static void sbi_console_flush(struct serial_chip *chip __unused)
35 {
36 }
37 
38 static void sbi_console_putc(struct serial_chip *chip __unused,
39 			     int ch)
40 {
41 	sbi_console_lock_global();
42 	sbi_console_putchar(ch);
43 	sbi_console_unlock_global();
44 }
45 
46 static const struct serial_ops sbi_console_ops = {
47 	.flush = sbi_console_flush,
48 	.putc = sbi_console_putc,
49 };
50 
51 static void sbi_console_init(struct sbi_console_data *pd)
52 {
53 	pd->chip.ops = &sbi_console_ops;
54 }
55 
56 void plat_console_init(void)
57 {
58 	sbi_console_init(&console_data);
59 	register_serial_console(&console_data.chip);
60 }
61