summaryrefslogtreecommitdiff
path: root/include/initcall.h
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2019-02-10 08:04:53 -0500
committerTom Rini <trini@konsulko.com>2019-02-10 08:04:53 -0500
commit2e8560797fc69a34c330a875da4f5d2992452f1e (patch)
treefadec67e667ef3d72d62cef98aa3b3b19b2dd4a5 /include/initcall.h
parent97276a91db8e98f081a40ddf9dc8f81d4032a756 (diff)
parent4a1fa524e95a1c81674d8a368035b522fd4a99d6 (diff)
Merge branch '2019-02-08-master-imports'
- bcm6345 watchdog, bcm63158/bcm963158 initial support. - Various TI platform resyncs and improvements. - FDT support in Android-format images. - stm32mp1 improvements.
Diffstat (limited to 'include/initcall.h')
-rw-r--r--include/initcall.h35
1 files changed, 34 insertions, 1 deletions
diff --git a/include/initcall.h b/include/initcall.h
index 01f3f2833f1..3ac01aa2cd2 100644
--- a/include/initcall.h
+++ b/include/initcall.h
@@ -8,6 +8,39 @@
typedef int (*init_fnc_t)(void);
-int initcall_run_list(const init_fnc_t init_sequence[]);
+#include <common.h>
+#include <initcall.h>
+#include <efi.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static inline int initcall_run_list(const init_fnc_t init_sequence[])
+{
+ const init_fnc_t *init_fnc_ptr;
+
+ for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
+ unsigned long reloc_ofs = 0;
+ int ret;
+
+ if (gd->flags & GD_FLG_RELOC)
+ reloc_ofs = gd->reloc_off;
+#ifdef CONFIG_EFI_APP
+ reloc_ofs = (unsigned long)image_base;
+#endif
+ debug("initcall: %p", (char *)*init_fnc_ptr - reloc_ofs);
+ if (gd->flags & GD_FLG_RELOC)
+ debug(" (relocated to %p)\n", (char *)*init_fnc_ptr);
+ else
+ debug("\n");
+ ret = (*init_fnc_ptr)();
+ if (ret) {
+ printf("initcall sequence %p failed at call %p (err=%d)\n",
+ init_sequence,
+ (char *)*init_fnc_ptr - reloc_ofs, ret);
+ return -1;
+ }
+ }
+ return 0;
+}
#endif