risc-v: implement DBCN based debug console
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Mon, 4 Sep 2023 11:24:04 +0000 (13:24 +0200)
committerLeo Yu-Chi Liang <ycliang@andestech.com>
Tue, 5 Sep 2023 02:53:55 +0000 (10:53 +0800)
Use the DBCN SBI extension to implement a debug console.
Make it the default for S-mode RISC-V.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
drivers/serial/Kconfig
drivers/serial/serial_sbi.c

index a1e0899..8c54bc9 100644 (file)
@@ -218,6 +218,7 @@ config DEBUG_UART
 choice
        prompt "Select which UART will provide the debug UART"
        depends on DEBUG_UART
+       default DEBUG_SBI_CONSOLE if RISCV_SMODE
        default DEBUG_UART_NS16550
 
 config DEBUG_UART_ALTERA_JTAGUART
@@ -289,11 +290,13 @@ config DEBUG_EFI_CONSOLE
 
 config DEBUG_SBI_CONSOLE
        bool "SBI"
-       depends on SBI_V01
+       depends on RISCV_SMODE
        help
          Select this to enable a debug console which calls back to SBI to
          output to the console. This can be useful for early debugging of
          U-Boot when running on top of SBI (Supervisor Binary Interface).
+         This implementation of the debug UART is not available while in
+         M-mode (e.g. during SPL).
 
 config DEBUG_UART_S5P
        bool "Samsung S5P"
index b9f35ed..a51a96c 100644 (file)
@@ -3,6 +3,8 @@
 #include <debug_uart.h>
 #include <asm/sbi.h>
 
+#ifdef CONFIG_SBI_V01
+
 static inline void _debug_uart_init(void)
 {
 }
@@ -13,4 +15,22 @@ static inline void _debug_uart_putc(int c)
                sbi_console_putchar(c);
 }
 
+#else
+
+static int sbi_dbcn_available;
+
+static inline void _debug_uart_init(void)
+{
+       if (CONFIG_IS_ENABLED(RISCV_SMODE))
+               sbi_dbcn_available = sbi_probe_extension(SBI_EXT_DBCN);
+}
+
+static inline void _debug_uart_putc(int ch)
+{
+       if (CONFIG_IS_ENABLED(RISCV_SMODE) && sbi_dbcn_available)
+               sbi_dbcn_write_byte(ch);
+}
+
+#endif
+
 DEBUG_UART_FUNCS