summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/utils/fdt/fdt_helper.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c
index 9a945af4..b7f7e075 100644
--- a/lib/utils/fdt/fdt_helper.c
+++ b/lib/utils/fdt/fdt_helper.c
@@ -411,6 +411,18 @@ static int fdt_parse_isa_one_hart(const char *isa, unsigned long *extensions)
return 0;
}
+static void fdt_parse_isa_extensions_one_hart(const char *isa,
+ unsigned long *extensions,
+ int len)
+{
+ size_t i;
+
+ for (i = 0; i < SBI_HART_EXT_MAX; i++) {
+ if (fdt_stringlist_contains(isa, len, sbi_hart_ext[i].name))
+ __set_bit(sbi_hart_ext[i].id, extensions);
+ }
+}
+
static int fdt_parse_isa_all_harts(void *fdt)
{
u32 hartid;
@@ -434,10 +446,6 @@ static int fdt_parse_isa_all_harts(void *fdt)
if (!fdt_node_is_enabled(fdt, cpu_offset))
continue;
- val = fdt_getprop(fdt, cpu_offset, "riscv,isa", &len);
- if (!val || len <= 0)
- return SBI_ENOENT;
-
scratch = sbi_hartid_to_scratch(hartid);
if (!scratch)
return SBI_ENOENT;
@@ -445,6 +453,17 @@ static int fdt_parse_isa_all_harts(void *fdt)
hart_exts = sbi_scratch_offset_ptr(scratch,
fdt_isa_bitmap_offset);
+ val = fdt_getprop(fdt, cpu_offset, "riscv,isa-extensions", &len);
+ if (val && len > 0) {
+ fdt_parse_isa_extensions_one_hart((const char *)val,
+ hart_exts, len);
+ continue;
+ }
+
+ val = fdt_getprop(fdt, cpu_offset, "riscv,isa", &len);
+ if (!val || len <= 0)
+ return SBI_ENOENT;
+
err = fdt_parse_isa_one_hart((const char *)val, hart_exts);
if (err)
return err;