Opened on 09/29/22 at 01:31:01
Closed on 10/14/22 at 13:04:07
#4728 closed defect (fixed)
RISC-V console device tree parsing fails with a list of properties
Reported by: | Alan Cudmore | Owned by: | Alan Cudmore <alan.cudmore@…> |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | bsps | Version: | 6 |
Severity: | normal | Keywords: | riscv, fdt, console |
Cc: | Blocked By: | ||
Blocking: |
Description
The riscv console configuration code uses a macro:
#define RISCV_CONSOLE_IS_COMPATIBLE(actual, actual_len, desired) \
(actual_len == sizeof(desired) \
&& memcmp(actual, desired, sizeof(desired) - 1) == 0)
And is used to find a compatible console device in the device tree like this:
if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ucb,htif0")) {
htif_console_context_init(&htif_console_instance.base, node);
An example device tree entry:
compatible = "ns16550a";
works with the macro, but when the device tree entry has multiple items like:
compatible = "canaan,k210-uarths", "sifive,uart0";
the macro cannot parse the entry because the list is being treated like a single string. The compat_len variable ends up having the length of the entire list, causing the comparison to fail.
If the macro is replaced with a call to fdt_stringlist_contains like:
if (fdt_stringlist_contains(compat, compat_len, "ucb,htif0")) {
htif_console_context_init(&htif_console_instance.base, node);
The substring can be found in the compatible list.
This works with my use case where there are multiple items in the compatible list.
Unless there is a reason why the macro is used, I can submit a patch that replaces the macros with fdt_stringlist_contains calls.
Note: I am not sure how to test all cases of this code, I can test the generic riscv-v/qemu based BSP, and the BSP I am working on, but I do not have access to a FE310/Arty system
Change History (1)
comment:1 Changed on 10/14/22 at 13:04:07 by Alan Cudmore <alan.cudmore@…>
Owner: | set to Alan Cudmore <alan.cudmore@…> |
---|---|
Resolution: | → fixed |
Status: | new → closed |
In 1d2fab8/rtems: