diff options
author | Anup Patel <apatel@ventanamicro.com> | 2024-08-06 10:40:46 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2024-12-06 09:26:38 +0530 |
commit | 9d760b810e184479c65c2537594beaf4657f02ed (patch) | |
tree | 941ff1c2496bd86326b2f4cb9fb361fc7bc043f7 /lib/utils | |
parent | fdd72635368beb5f9c85533b92abb31adee20406 (diff) | |
download | opensbi-9d760b810e184479c65c2537594beaf4657f02ed.zip opensbi-9d760b810e184479c65c2537594beaf4657f02ed.tar.gz opensbi-9d760b810e184479c65c2537594beaf4657f02ed.tar.bz2 |
lib: utils/fdt: Allow dynamic registration of FDT fixup callbacks
It should possible to fixup FDT from any part of OpenSBI so add
fdt_register_general_fixup() which allows dynamic registration of
FDT fixup callbacks.
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Diffstat (limited to 'lib/utils')
-rw-r--r-- | lib/utils/fdt/fdt_fixup.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c index 9e013df..192d6dd 100644 --- a/lib/utils/fdt/fdt_fixup.c +++ b/lib/utils/fdt/fdt_fixup.c @@ -401,8 +401,38 @@ void fdt_config_fixup(void *fdt) fdt_nop_node(fdt, config_offset); } +static SBI_LIST_HEAD(fixup_list); + +int fdt_register_general_fixup(struct fdt_general_fixup *fixup) +{ + struct fdt_general_fixup *f; + + if (!fixup || !fixup->name || !fixup->do_fixup) + return SBI_EINVAL; + + sbi_list_for_each_entry(f, &fixup_list, head) { + if (f == fixup) + return SBI_EALREADY; + } + + SBI_INIT_LIST_HEAD(&fixup->head); + sbi_list_add_tail(&fixup->head, &fixup_list); + + return 0; +} + +void fdt_unregister_general_fixup(struct fdt_general_fixup *fixup) +{ + if (!fixup) + return; + + sbi_list_del(&fixup->head); +} + void fdt_fixups(void *fdt) { + struct fdt_general_fixup *f; + fdt_aplic_fixup(fdt); fdt_imsic_fixup(fdt); @@ -416,4 +446,7 @@ void fdt_fixups(void *fdt) #endif fdt_config_fixup(fdt); + + sbi_list_for_each_entry(f, &fixup_list, head) + f->do_fixup(f, fdt); } |