diff options
author | Conor Dooley <conor.dooley@microchip.com> | 2024-07-02 11:59:11 +0100 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2024-07-23 11:12:56 +0530 |
commit | f7a92f6b67bda221e96eb8dfa54e1eb162fa984f (patch) | |
tree | adf07e563cc0377964b67dbdbbf0cd5e39162917 | |
parent | b7e7e660269106f0c56061c770704a5e5504a98c (diff) | |
download | opensbi-f7a92f6b67bda221e96eb8dfa54e1eb162fa984f.zip opensbi-f7a92f6b67bda221e96eb8dfa54e1eb162fa984f.tar.gz opensbi-f7a92f6b67bda221e96eb8dfa54e1eb162fa984f.tar.bz2 |
lib: utils/fdt: Add support for parsing riscv,isa-extensions
A new property has been added, with an extensive rationale at [1], that
can be used in place of "riscv,isa" to indicate what extensions are
supported by a given platform that is a list of strings rather than a
single string. There are some differences between the new property,
"riscv,isa-extensions" and the incumbent "riscv,isa" - chief among them
for the sake of parsing being the list of strings, as opposed to a
string. Another advantage is strictly defined meanings for each string
in a dt-binding, rather than deriving meaning from RVI standards. This
may likely to some divergence over time, but, at least for now, there's
no relevant differences between the two for an M-Mode program.
Add support for the new property in OpenSBI, prioritising it, before
falling back to the, now deprecated, "riscv,isa" property if it is not
present.
Link: https://lore.kernel.org/all/20230702-eats-scorebook-c951f170d29f@spud/ [1]
Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
-rw-r--r-- | lib/utils/fdt/fdt_helper.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c index 9a945af..b7f7e07 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; |