[PATCH] lib: utils/irqchip: Match against more specific compatible strings first
Alex Studer
alex at studer.dev
Thu Feb 13 22:27:38 PST 2025
The T-HEAD C90x PLIC has some special quirks, such as the S-mode
delegation bit. OpenSBI currently handles this by checking the compatible
string in the device tree.
However, this matching is done in the order of the fdt_match array. So if
a device tree contains both strings, for example:
compatible = "thead,c900-plic", "riscv,plic0";
Then OpenSBI will match against the generic "riscv,plic0" string, since
that appears first in the fdt_match array. This means it will fail to set
the S-mode delegation bit, and Linux will fail to boot. In some cases, it
is not possible to change the compatible string to just the T-HEAD PLIC,
as older versions of Linux only recognize the RISC-V compatible string.
This patch fixes that by moving the RISC-V string to the end, ensuring
that the more specific options get matched first.
Signed-off-by: Alex Studer <alex at studer.dev>
---
lib/utils/irqchip/fdt_irqchip_plic.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/lib/utils/irqchip/fdt_irqchip_plic.c b/lib/utils/irqchip/fdt_irqchip_plic.c
index 494358d..59898d2 100644
--- a/lib/utils/irqchip/fdt_irqchip_plic.c
+++ b/lib/utils/irqchip/fdt_irqchip_plic.c
@@ -98,10 +98,16 @@ fail_free_data:
static const struct fdt_match irqchip_plic_match[] = {
{ .compatible = "andestech,nceplic100" },
- { .compatible = "riscv,plic0" },
{ .compatible = "sifive,plic-1.0.0" },
{ .compatible = "thead,c900-plic",
.data = (void *)(PLIC_FLAG_THEAD_DELEGATION | PLIC_FLAG_ENABLE_PM) },
+
+ /*
+ * We keep the generic RISC-V PLIC at the end.
+ * This ensures we match against more specific options first.
+ * (This is important if the PLIC has quirks, like the T-HEAD PLIC.)
+ */
+ { .compatible = "riscv,plic0" },
{ /* sentinel */ }
};
--
2.48.1
More information about the opensbi
mailing list