aboutsummaryrefslogtreecommitdiff
path: root/lib/utils
diff options
context:
space:
mode:
authorAnup Patel <apatel@ventanamicro.com>2024-08-06 10:40:46 +0530
committerAnup Patel <anup@brainfault.org>2024-12-06 09:26:38 +0530
commit9d760b810e184479c65c2537594beaf4657f02ed (patch)
tree941ff1c2496bd86326b2f4cb9fb361fc7bc043f7 /lib/utils
parentfdd72635368beb5f9c85533b92abb31adee20406 (diff)
downloadopensbi-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.c33
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);
}