[PATCH 0/2] risc-v: implement DBCN based debug console

Currently we only offer an SBI based debug UART for SBI v0.1. With OpenSBI 1.3 the Debug Console Extension (DBCN) has become available. This allows us to implement a debug UART in a device independent manor.
Heinrich Schuchardt (2): risc-v: implement DBCN write byte risc-v: implement DBCN based debug console
arch/riscv/include/asm/sbi.h | 1 + arch/riscv/lib/sbi.c | 16 ++++++++++++++++ drivers/serial/Kconfig | 3 ++- drivers/serial/serial_sbi.c | 19 +++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-)

The DBCN extension provides a Console Write Byte call. Implement function sbi_dbcn_write_byte to invoke it.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com --- arch/riscv/include/asm/sbi.h | 1 + arch/riscv/lib/sbi.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+)
diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 009a26885c..bf4c9af622 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -170,5 +170,6 @@ int sbi_get_mvendorid(long *mvendorid); int sbi_get_marchid(long *marchid); int sbi_get_mimpid(long *mimpid); void sbi_srst_reset(unsigned long type, unsigned long reason); +int sbi_dbcn_write_byte(unsigned char ch);
#endif diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c index 8724e3a460..55a3bc3b5c 100644 --- a/arch/riscv/lib/sbi.c +++ b/arch/riscv/lib/sbi.c @@ -204,6 +204,22 @@ void sbi_srst_reset(unsigned long type, unsigned long reason) 0, 0, 0, 0); }
+/** + * sbi_dbcn_write_byte() - write byte to debug console + * + * @ch: byte to be written + * Return: SBI error code (SBI_SUCCESS = 0 on success) + */ +int sbi_dbcn_write_byte(unsigned char ch) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_DBCN, + SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, + ch, 0, 0, 0, 0, 0); + return ret.error; +} + #ifdef CONFIG_SBI_V01
/**

On Sat, Aug 19, 2023 at 03:12:49PM +0200, Heinrich Schuchardt wrote:
The DBCN extension provides a Console Write Byte call. Implement function sbi_dbcn_write_byte to invoke it.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com
arch/riscv/include/asm/sbi.h | 1 + arch/riscv/lib/sbi.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+)
Reviewed-by: Leo Yu-Chi Liang ycliang@andestech.com

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 --- drivers/serial/Kconfig | 3 ++- drivers/serial/serial_sbi.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index a1e089962a..8421c5c047 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -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,7 +290,7 @@ 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 diff --git a/drivers/serial/serial_sbi.c b/drivers/serial/serial_sbi.c index b9f35ed36e..093c7309d3 100644 --- a/drivers/serial/serial_sbi.c +++ b/drivers/serial/serial_sbi.c @@ -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,21 @@ 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) +{ + sbi_dbcn_available = sbi_probe_extension(SBI_EXT_DBCN); +} + +static inline void _debug_uart_putc(int ch) +{ + if (sbi_dbcn_available) + sbi_dbcn_write_byte(ch); +} + +#endif + DEBUG_UART_FUNCS

On Sat, Aug 19, 2023 at 03:12:50PM +0200, Heinrich Schuchardt wrote:
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
drivers/serial/Kconfig | 3 ++- drivers/serial/serial_sbi.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-)
Reviewed-by: Leo Yu-Chi Liang ycliang@andestech.com

Hi,
-----Original Message----- From: U-Boot u-boot-bounces@lists.denx.de On Behalf Of Heinrich Schuchardt Sent: Saturday, August 19, 2023 10:13 PM To: Rick Chen rick@andestech.com; Leo ycliang@andestech.com Cc: Bin Meng bmeng.cn@gmail.com; Anup Patel apatel@ventanamicro.com; u-boot@lists.denx.de; Heinrich Schuchardt heinrich.schuchardt@canonical.com Subject: [PATCH 2/2] risc-v: implement DBCN based debug console
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
drivers/serial/Kconfig | 3 ++- drivers/serial/serial_sbi.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index a1e089962a..8421c5c047 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -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,7 +290,7 @@ 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
diff --git a/drivers/serial/serial_sbi.c b/drivers/serial/serial_sbi.c index b9f35ed36e..093c7309d3 100644 --- a/drivers/serial/serial_sbi.c +++ b/drivers/serial/serial_sbi.c @@ -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,21 @@ 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) {
- sbi_dbcn_available = sbi_probe_extension(SBI_EXT_DBCN);
+}
+static inline void _debug_uart_putc(int ch) {
- if (sbi_dbcn_available)
sbi_dbcn_write_byte(ch);
+}
+#endif
DEBUG_UART_FUNCS
2.40.1
I've got below error when I tried to build it with VisionFive2 board configuration(starfive_visionfive2_defconfig). To test this patch, I enabled CONFIG_DEBUG_SBI_CONSOLE. Seems like spl also includes the driver when DEBUG_SBI_CONSOLE is enabled. Do I need to do any more configurations to test this?
LD spl/u-boot-spl riscv64-unknown-linux-gnu-ld.bfd: drivers/serial/serial_sbi.o: in function `_debug_uart_putc': /data/risc-v/vf2/mainline/u-boot/drivers/serial/serial_sbi.c:30: undefined reference to `sbi_dbcn_write_byte' riscv64-unknown-linux-gnu-ld.bfd: /data/risc-v/vf2/mainline/u-boot/drivers/serial/serial_sbi.c:30: undefined reference to `sbi_dbcn_write_byte' riscv64-unknown-linux-gnu-ld.bfd: drivers/serial/serial_sbi.o: in function `_debug_uart_init': /data/risc-v/vf2/mainline/u-boot/drivers/serial/serial_sbi.c:24: undefined reference to `sbi_probe_extension' make[2]: *** [/data/risc-v/vf2/mainline/u-boot/scripts/Makefile.spl:527: spl/u-boot-spl] Error 1
Best Regards, Chanho Park

On 9/4/23 11:30, Chanho Park wrote:
Hi,
-----Original Message----- From: U-Boot u-boot-bounces@lists.denx.de On Behalf Of Heinrich Schuchardt Sent: Saturday, August 19, 2023 10:13 PM To: Rick Chen rick@andestech.com; Leo ycliang@andestech.com Cc: Bin Meng bmeng.cn@gmail.com; Anup Patel apatel@ventanamicro.com; u-boot@lists.denx.de; Heinrich Schuchardt heinrich.schuchardt@canonical.com Subject: [PATCH 2/2] risc-v: implement DBCN based debug console
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
drivers/serial/Kconfig | 3 ++- drivers/serial/serial_sbi.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index a1e089962a..8421c5c047 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -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,7 +290,7 @@ 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
diff --git a/drivers/serial/serial_sbi.c b/drivers/serial/serial_sbi.c index b9f35ed36e..093c7309d3 100644 --- a/drivers/serial/serial_sbi.c +++ b/drivers/serial/serial_sbi.c @@ -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,21 @@ 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) {
- sbi_dbcn_available = sbi_probe_extension(SBI_EXT_DBCN);
+}
+static inline void _debug_uart_putc(int ch) {
- if (sbi_dbcn_available)
sbi_dbcn_write_byte(ch);
+}
+#endif
- DEBUG_UART_FUNCS
-- 2.40.1
I've got below error when I tried to build it with VisionFive2 board configuration(starfive_visionfive2_defconfig). To test this patch, I enabled CONFIG_DEBUG_SBI_CONSOLE. Seems like spl also includes the driver when DEBUG_SBI_CONSOLE is enabled. Do I need to do any more configurations to test this?
LD spl/u-boot-spl riscv64-unknown-linux-gnu-ld.bfd: drivers/serial/serial_sbi.o: in function `_debug_uart_putc': /data/risc-v/vf2/mainline/u-boot/drivers/serial/serial_sbi.c:30: undefined reference to `sbi_dbcn_write_byte' riscv64-unknown-linux-gnu-ld.bfd: /data/risc-v/vf2/mainline/u-boot/drivers/serial/serial_sbi.c:30: undefined reference to `sbi_dbcn_write_byte' riscv64-unknown-linux-gnu-ld.bfd: drivers/serial/serial_sbi.o: in function `_debug_uart_init': /data/risc-v/vf2/mainline/u-boot/drivers/serial/serial_sbi.c:24: undefined reference to `sbi_probe_extension' make[2]: *** [/data/risc-v/vf2/mainline/u-boot/scripts/Makefile.spl:527: spl/u-boot-spl] Error 1
Best Regards, Chanho Park
Hello Chanho,
thanks for reporting the issue. SBI is not available in M-mode. We need a check in the driver like
if (!CONFIG_IS_ENABLED(RISCV_MMODE))
I will send a new version of the series.
Best regards
Heinrich
participants (3)
-
Chanho Park
-
Heinrich Schuchardt
-
Leo Liang