[PATCH] bsps: Improve riscv console FDT parsing

Alan Cudmore alan.cudmore at gmail.com
Thu Sep 29 16:11:59 UTC 2022


This fixes a problem with parsing the FDT compatible property by
replacing the RISCV_CONSOLE_IS_COMPATIBLE macro with calls to
the fdt_stringlist_contains function. The macro only works when
the compatible FDT entry is a single string and not a list of
strings. The new call will compare each item in the string list.

Close #4728.
---
 bsps/riscv/riscv/console/console-config.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/bsps/riscv/riscv/console/console-config.c b/bsps/riscv/riscv/console/console-config.c
index d962a5a418..7908c2f325 100644
--- a/bsps/riscv/riscv/console/console-config.c
+++ b/bsps/riscv/riscv/console/console-config.c
@@ -139,10 +139,6 @@ static void riscv_console_set_reg_32(uintptr_t addr, uint8_t i, uint8_t val)
 }
 #endif
 
-#define RISCV_CONSOLE_IS_COMPATIBLE(actual, actual_len, desired) \
-  (actual_len == sizeof(desired) \
-     && memcmp(actual, desired, sizeof(desired) - 1) == 0)
-
 static void riscv_console_probe(void)
 {
   const void *fdt;
@@ -170,7 +166,7 @@ static void riscv_console_probe(void)
     }
 
 #if RISCV_ENABLE_HTIF_SUPPORT != 0
-    if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ucb,htif0")) {
+    if (fdt_stringlist_contains(compat, compat_len, "ucb,htif0")) {
       htif_console_context_init(&htif_console_instance.base, node);
 
       riscv_console.context = &htif_console_instance.base;
@@ -181,8 +177,8 @@ static void riscv_console_probe(void)
 
 #if RISCV_CONSOLE_MAX_NS16550_DEVICES > 0
     if (
-      (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16550a")
-          || RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16750"))
+        (fdt_stringlist_contains(compat, compat_len, "ns16550a")
+        || fdt_stringlist_contains(compat, compat_len, "ns16750"))
         && ns16550_devices < RISCV_CONSOLE_MAX_NS16550_DEVICES
     ) {
       ns16550_context *ctx;
@@ -203,7 +199,7 @@ static void riscv_console_probe(void)
         ctx->set_reg = riscv_console_set_reg_8;
       }
 
-      if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16750")) {
+      if (fdt_stringlist_contains(compat, compat_len, "ns16750")) {
         ctx->has_precision_clock_synthesizer = true;
       }
 
@@ -243,7 +239,7 @@ static void riscv_console_probe(void)
 #endif
 
 #if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0
-    if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "sifive,uart0")) {
+    if (fdt_stringlist_contains(compat, compat_len, "sifive,uart0")) {
       fe310_uart_context *ctx;
 
       ctx = &fe310_uart_instance;
-- 
2.34.1



More information about the devel mailing list