bsps: Improve riscv console FDT parsing

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.
This commit is contained in:
Alan Cudmore
2022-09-29 12:11:59 -04:00
committed by Joel Sherrill
parent e9a69c5744
commit 1d2fab8a79

View File

@@ -139,10 +139,6 @@ static void riscv_console_set_reg_32(uintptr_t addr, uint8_t i, uint8_t val)
} }
#endif #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) static void riscv_console_probe(void)
{ {
const void *fdt; const void *fdt;
@@ -170,7 +166,7 @@ static void riscv_console_probe(void)
} }
#if RISCV_ENABLE_HTIF_SUPPORT != 0 #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); htif_console_context_init(&htif_console_instance.base, node);
riscv_console.context = &htif_console_instance.base; 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_MAX_NS16550_DEVICES > 0
if ( if (
(RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16550a") (fdt_stringlist_contains(compat, compat_len, "ns16550a")
|| RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16750")) || fdt_stringlist_contains(compat, compat_len, "ns16750"))
&& ns16550_devices < RISCV_CONSOLE_MAX_NS16550_DEVICES && ns16550_devices < RISCV_CONSOLE_MAX_NS16550_DEVICES
) { ) {
ns16550_context *ctx; ns16550_context *ctx;
@@ -203,7 +199,7 @@ static void riscv_console_probe(void)
ctx->set_reg = riscv_console_set_reg_8; 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; ctx->has_precision_clock_synthesizer = true;
} }
@@ -243,7 +239,7 @@ static void riscv_console_probe(void)
#endif #endif
#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 #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; fe310_uart_context *ctx;
ctx = &fe310_uart_instance; ctx = &fe310_uart_instance;