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 #ifdef CFG_RISCV_SBI_CONSOLE
18 
19 struct sbi_console_data {
20 	struct serial_chip chip;
21 };
22 
23 static struct sbi_console_data console_data __nex_bss;
24 static unsigned int sbi_console_global_lock __nex_bss = SPINLOCK_UNLOCK;
25 
sbi_console_lock_global(void)26 static void sbi_console_lock_global(void)
27 {
28 	cpu_spin_lock(&sbi_console_global_lock);
29 }
30 
sbi_console_unlock_global(void)31 static void sbi_console_unlock_global(void)
32 {
33 	cpu_spin_unlock(&sbi_console_global_lock);
34 }
35 
sbi_console_flush(struct serial_chip * chip __unused)36 static void sbi_console_flush(struct serial_chip *chip __unused)
37 {
38 }
39 
sbi_console_putc(struct serial_chip * chip __unused,int ch)40 static void sbi_console_putc(struct serial_chip *chip __unused,
41 			     int ch)
42 {
43 	sbi_console_lock_global();
44 	sbi_console_putchar(ch);
45 	sbi_console_unlock_global();
46 }
47 
48 static const struct serial_ops sbi_console_ops = {
49 	.flush = sbi_console_flush,
50 	.putc = sbi_console_putc,
51 };
52 
sbi_console_init(struct sbi_console_data * pd)53 static void sbi_console_init(struct sbi_console_data *pd)
54 {
55 	pd->chip.ops = &sbi_console_ops;
56 }
57 
console_init(void)58 void console_init(void)
59 {
60 	sbi_console_init(&console_data);
61 	register_serial_console(&console_data.chip);
62 }
63 
64 #endif /*CFG_RISCV_SBI_CONSOLE*/
65 
66