
Hi Jerome,
Thanks for this!
On 06/01/2025 15:40, Jerome Forissier wrote:
Change board_init_f(), board_init_f_r() and board_init_r() to make static calls instead of iterating over the init_sequence_f, init_sequence_f_r and init_sequence_r arrays, respectively. This makes the code a simpler (and even more so when initcall_run_list() is later removed) and it reduces the binary size as well. Tested with xilinx_zynqmp_kria_defconfig; bloat-o-meter results:
- With LTO
add/remove: 106/196 grow/shrink: 10/28 up/down: 31548/-33829 (-2281) Total: Before=1070471, After=1068190, chg -0.21%
- Without LTO
add/remove: 0/54 grow/shrink: 3/0 up/down: 2322/-2832 (-510) Total: Before=1121723, After=1121213, chg -0.05%
Execution time does not change in a noticeable way.
Signed-off-by: Jerome Forissier jerome.forissier@linaro.org
Reviewed-by: Caleb Connolly caleb.connolly@linaro.org
common/board_f.c | 218 ++++++++++++++++++++------------------- common/board_r.c | 251 +++++++++++++++++++++++---------------------- include/initcall.h | 27 +++++ 3 files changed, 266 insertions(+), 230 deletions(-)
diff --git a/common/board_f.c b/common/board_f.c index 54c48d42ee9..cf88e97b9e2 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -38,6 +38,7 @@ #include <spl.h> #include <status_led.h> #include <sysreset.h> +#include <time.h> #include <timer.h> #include <trace.h> #include <upl.h> @@ -870,81 +871,86 @@ static int initf_upl(void) return 0; }
-static const init_fnc_t init_sequence_f[] = {
- setup_mon_len,
-#ifdef CONFIG_OF_CONTROL
- fdtdec_setup,
+static void initcall_run_f(void) +{
- /*
* Please do not add logic to this function (variables, if (), etc.).
* For simplicity it should remain an ordered list of function calls.
*/
- INITCALL(setup_mon_len);
+#if CONFIG_IS_ENABLED(OF_CONTROL)
- INITCALL(fdtdec_setup);
#endif -#ifdef CONFIG_TRACE_EARLY
- trace_early_init,
+#if CONFIG_IS_ENABLED(TRACE_EARLY)
- INITCALL(trace_early_init);
#endif
- initf_malloc,
- initf_upl,
- log_init,
- initf_bootstage, /* uses its own timer, so does not need DM */
- event_init,
- bloblist_maybe_init,
- setup_spl_handoff,
-#if defined(CONFIG_CONSOLE_RECORD_INIT_F)
- console_record_init,
- INITCALL(initf_malloc);
- INITCALL(initf_upl);
- INITCALL(log_init);
- INITCALL(initf_bootstage); /* uses its own timer, so does not need DM */
- INITCALL(event_init);
- INITCALL(bloblist_maybe_init);
- INITCALL(setup_spl_handoff);
+#if CONFIG_IS_ENABLED(CONSOLE_RECORD_INIT_F)
- INITCALL(console_record_init);
#endif
- INITCALL_EVENT(EVT_FSP_INIT_F),
- arch_cpu_init, /* basic arch cpu dependent setup */
- mach_cpu_init, /* SoC/machine dependent CPU setup */
- initf_dm,
-#if defined(CONFIG_BOARD_EARLY_INIT_F)
- board_early_init_f,
- INITCALL_EVT(EVT_FSP_INIT_F);
- INITCALL(arch_cpu_init); /* basic arch cpu dependent setup */
- INITCALL(mach_cpu_init); /* SoC/machine dependent CPU setup */
- INITCALL(initf_dm);
+#if CONFIG_IS_ENABLED(BOARD_EARLY_INIT_F)
- INITCALL(board_early_init_f);
#endif #if defined(CONFIG_PPC) || defined(CONFIG_SYS_FSL_CLK) || defined(CONFIG_M68K) /* get CPU and bus clocks according to the environment variable */
- get_clocks, /* get CPU and bus clocks (etc.) */
- INITCALL(get_clocks); /* get CPU and bus clocks (etc.) */
#endif #if !defined(CONFIG_M68K) || (defined(CONFIG_M68K) && !defined(CONFIG_MCFTMR))
- timer_init, /* initialize timer */
- INITCALL(timer_init); /* initialize timer */
#endif -#if defined(CONFIG_BOARD_POSTCLK_INIT)
- board_postclk_init,
+#if CONFIG_IS_ENABLED(BOARD_POSTCLK_INIT)
- INITCALL(board_postclk_init);
#endif
- env_init, /* initialize environment */
- init_baud_rate, /* initialze baudrate settings */
- serial_init, /* serial communications setup */
- console_init_f, /* stage 1 init of console */
- display_options, /* say that we are here */
- display_text_info, /* show debugging info if required */
- checkcpu,
-#if defined(CONFIG_SYSRESET)
- print_resetinfo,
- INITCALL(env_init); /* initialize environment */
- INITCALL(init_baud_rate); /* initialze baudrate settings */
- INITCALL(serial_init); /* serial communications setup */
- INITCALL(console_init_f); /* stage 1 init of console */
- INITCALL(display_options); /* say that we are here */
- INITCALL(display_text_info); /* show debugging info if required */
- INITCALL(checkcpu);
+#if CONFIG_IS_ENABLED(SYSRESET)
- INITCALL(print_resetinfo);
#endif -#if defined(CONFIG_DISPLAY_CPUINFO)
- print_cpuinfo, /* display cpu info (and speed) */
- /* display cpu info (and speed) */
+#if CONFIG_IS_ENABLED(DISPLAY_CPUINFO)
- INITCALL(print_cpuinfo);
#endif -#if defined(CONFIG_DTB_RESELECT)
- embedded_dtb_select,
+#if CONFIG_IS_ENABLED(DTB_RESELECT)
- INITCALL(embedded_dtb_select);
#endif -#if defined(CONFIG_DISPLAY_BOARDINFO)
- show_board_info,
+#if CONFIG_IS_ENABLED(DISPLAY_BOARDINFO)
- INITCALL(show_board_info);
#endif
- INIT_FUNC_WATCHDOG_INIT
- INITCALL_EVENT(EVT_MISC_INIT_F),
- INIT_FUNC_WATCHDOG_RESET
- WATCHDOG_INIT();
- INITCALL_EVT(EVT_MISC_INIT_F);
- WATCHDOG_RESET();
#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY)
- init_func_i2c,
- INITCALL(init_func_i2c);
#endif
- announce_dram_init,
- dram_init, /* configure available RAM banks */
-#ifdef CONFIG_POST
- post_init_f,
- INITCALL(announce_dram_init);
- INITCALL(dram_init); /* configure available RAM banks */
+#if CONFIG_IS_ENABLED(POST)
- INITCALL(post_init_f);
#endif
- INIT_FUNC_WATCHDOG_RESET
- WATCHDOG_RESET();
#if defined(CFG_SYS_DRAM_TEST)
- testdram,
- INITCALL(testdram);
#endif /* CFG_SYS_DRAM_TEST */
- INIT_FUNC_WATCHDOG_RESET
-#ifdef CONFIG_POST
- init_post,
- WATCHDOG_RESET();
+#if CONFIG_IS_ENABLED(POST)
- INITCALL(init_post);
#endif
- INIT_FUNC_WATCHDOG_RESET
- WATCHDOG_RESET(); /*
- Now that we have DRAM mapped and working, we can
- relocate the code and continue running from DRAM.
@@ -957,48 +963,50 @@ static const init_fnc_t init_sequence_f[] = { * - monitor code * - board info struct */
- setup_dest_addr,
- INITCALL(setup_dest_addr);
#if defined(CONFIG_OF_BOARD_FIXUP) && !defined(CONFIG_OF_INITIAL_DTB_READONLY)
- fix_fdt,
- INITCALL(fix_fdt);
#endif #ifdef CFG_PRAM
- reserve_pram,
- INITCALL(reserve_pram);
#endif
- reserve_round_4k,
- setup_relocaddr_from_bloblist,
- arch_reserve_mmu,
- reserve_video,
- reserve_trace,
- reserve_uboot,
- reserve_malloc,
- reserve_board,
- reserve_global_data,
- reserve_fdt,
-#if defined(CONFIG_OF_BOARD_FIXUP) && defined(CONFIG_OF_INITIAL_DTB_READONLY)
- reloc_fdt,
- fix_fdt,
- INITCALL(reserve_round_4k);
- INITCALL(setup_relocaddr_from_bloblist);
- INITCALL(arch_reserve_mmu);
- INITCALL(reserve_video);
- INITCALL(reserve_trace);
- INITCALL(reserve_uboot);
- INITCALL(reserve_malloc);
- INITCALL(reserve_board);
- INITCALL(reserve_global_data);
- INITCALL(reserve_fdt);
+#if CONFIG_IS_ENABLED(OF_BOARD_FIXUP) && \
- CONFIG_IS_ENABLED(INITIAL_DTB_READONLY)
- INITCALL(reloc_fdt);
- INITCALL(fix_fdt);
#endif
- reserve_bootstage,
- reserve_bloblist,
- reserve_arch,
- reserve_stacks,
- dram_init_banksize,
- show_dram_config,
- INIT_FUNC_WATCHDOG_RESET
- setup_bdinfo,
- display_new_sp,
- INIT_FUNC_WATCHDOG_RESET
-#if !defined(CONFIG_OF_BOARD_FIXUP) || !defined(CONFIG_OF_INITIAL_DTB_READONLY)
- reloc_fdt,
- INITCALL(reserve_bootstage);
- INITCALL(reserve_bloblist);
- INITCALL(reserve_arch);
- INITCALL(reserve_stacks);
- INITCALL(dram_init_banksize);
- INITCALL(show_dram_config);
- WATCHDOG_RESET();
- INITCALL(setup_bdinfo);
- INITCALL(display_new_sp);
- WATCHDOG_RESET();
+#if !CONFIG_IS_ENABLED(OF_BOARD_FIXUP) || \
- !CONFIG_IS_ENABLED(INITIAL_DTB_READONLY)
- INITCALL(reloc_fdt);
#endif
- reloc_bootstage,
- reloc_bloblist,
- setup_reloc,
-#if defined(CONFIG_X86) || defined(CONFIG_ARC)
- copy_uboot_to_ram,
- do_elf_reloc_fixups,
- INITCALL(reloc_bootstage);
- INITCALL(reloc_bloblist);
- INITCALL(setup_reloc);
+#if CONFIG_IS_ENABLED(X86) || CONFIG_IS_ENABLED(ARC)
- INITCALL(copy_uboot_to_ram);
- INITCALL(do_elf_reloc_fixups);
#endif
- clear_bss,
- INITCALL(clear_bss); /*
- Deregister all cyclic functions before relocation, so that
- gd->cyclic_list does not contain any references to pre-relocation
@@ -1008,12 +1016,11 @@ static const init_fnc_t init_sequence_f[] = { * This should happen as late as possible so that the window where a * watchdog device is not serviced is as small as possible. */
- cyclic_unregister_all,
-#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
- jump_to_copy,
- INITCALL(cyclic_unregister_all);
+#if !CONFIG_IS_ENABLED(ARM) && !CONFIG_IS_ENABLED(SANDBOX)
- INITCALL(jump_to_copy);
#endif
- NULL,
-}; +}
void board_init_f(ulong boot_flags) { @@ -1023,8 +1030,7 @@ void board_init_f(ulong boot_flags) gd->flags &= ~GD_FLG_HAVE_CONSOLE; gd->boardf = &boardf;
- if (initcall_run_list(init_sequence_f))
hang();
- initcall_run_f();
#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX) && \ !defined(CONFIG_EFI_APP) && !CONFIG_IS_ENABLED(X86_64) && \ @@ -1038,8 +1044,8 @@ void board_init_f(ulong boot_flags) /*
- For now this code is only used on x86.
- init_sequence_f_r is the list of init functions which are run when
- U-Boot is executing from Flash with a semi-limited 'C' environment.
- Run init functions which are run when U-Boot is executing from Flash with a
- semi-limited 'C' environment.
- The following limitations must be considered when implementing an
- '_f_r' function:
- 'static' variables are read-only
@@ -1052,18 +1058,16 @@ void board_init_f(ulong boot_flags)
- NOTE: At present only x86 uses this route, but it is intended that
- all archs will move to this when generic relocation is implemented.
*/ -static const init_fnc_t init_sequence_f_r[] = { -#if !CONFIG_IS_ENABLED(X86_64)
- init_cache_f_r,
+static void initcall_run_f_r(void) +{ +#if CONFIG_IS_ENABLED(X86_64)
- INITCALL(init_cache_f_r);
#endif
- NULL,
-}; +}
void board_init_f_r(void) {
- if (initcall_run_list(init_sequence_f_r))
hang();
initcall_run_f_r();
/*
- The pre-relocation drivers may be using memory that has now gone
diff --git a/common/board_r.c b/common/board_r.c index f63c6aed4d5..74ebbdc7de9 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -582,21 +582,24 @@ static int run_main_loop(void) }
/*
- Over time we hope to remove these functions with code fragments and
- stub functions, and instead call the relevant function directly.
- We also hope to remove most of the driver-related init and do it if/when
- the driver is later used.
- Over time we hope to remove most of the driver-related init and do it
*/
- if/when the driver is later used.
- TODO: perhaps reset the watchdog in the initcall function after each call?
-static init_fnc_t init_sequence_r[] = {
- initr_trace,
- initr_reloc,
- event_init,
+static void initcall_run_r(void) +{
- /*
* Please do not add logic to this function (variables, if (), etc.).
* For simplicity it should remain an ordered list of function calls.
*/
- INITCALL(initr_trace);
- INITCALL(initr_reloc);
- INITCALL(event_init); /* TODO: could x86/PPC have this also perhaps? */
-#if defined(CONFIG_ARM) || defined(CONFIG_RISCV)
- initr_caches,
+#if CONFIG_IS_ENABLED(ARM) || CONFIG_IS_ENABLED(RISCV)
- INITCALL(initr_caches); /* Note: For Freescale LS2 SoCs, new MMU table is created in DDR.
A temporary mapping of IFC high region is since removed,
so environmental variables in NOR flash is not available
@@ -604,29 +607,30 @@ static init_fnc_t init_sequence_r[] = { * region. */ #endif
- initr_reloc_global_data,
-#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
- initr_unlock_ram_in_cache,
- INITCALL(initr_reloc_global_data);
+#if CONFIG_IS_ENABLED(SYS_INIT_RAM_LOCK) && CONFIG_IS_ENABLED(E500)
- INITCALL(initr_unlock_ram_in_cache);
#endif
- initr_barrier,
- initr_malloc,
- log_init,
- initr_bootstage, /* Needs malloc() but has its own timer */
-#if defined(CONFIG_CONSOLE_RECORD)
- console_record_init,
- INITCALL(initr_barrier);
- INITCALL(initr_malloc);
- INITCALL(log_init);
- INITCALL(initr_bootstage); /* Needs malloc() but has its own timer */
+#if CONFIG_IS_ENABLED(CONSOLE_RECORD)
- INITCALL(console_record_init);
#endif -#ifdef CONFIG_SYS_NONCACHED_MEMORY
- noncached_init,
+#if CONFIG_IS_ENABLED(SYS_NONCACHED_MEMORY)
- INITCALL(noncached_init);
#endif
- initr_of_live,
-#ifdef CONFIG_DM
- initr_dm,
- INITCALL(initr_of_live);
+#if CONFIG_IS_ENABLED(DM)
- INITCALL(initr_dm);
#endif -#ifdef CONFIG_ADDR_MAP
- init_addr_map,
+#if CONFIG_IS_ENABLED(ADDR_MAP)
- INITCALL(init_addr_map);
#endif -#if defined(CONFIG_ARM) || defined(CONFIG_RISCV) || defined(CONFIG_SANDBOX)
- board_init, /* Setup chipselects */
+#if CONFIG_IS_ENABLED(ARM) || CONFIG_IS_ENABLED(RISCV) || \
- CONFIG_IS_ENABLED(SANDBOX)
- INITCALL(board_init); /* Setup chipselects */
#endif /* * TODO: printing of the clock inforamtion of the board is now @@ -634,142 +638,144 @@ static init_fnc_t init_sequence_r[] = { * davinci SOC's is added. Remove this check once all the board * implement this. */ -#ifdef CONFIG_CLOCKS
- set_cpu_clk_info, /* Setup clock information */
+#if CONFIG_IS_ENABLED(CLOCKS)
- INITCALL(set_cpu_clk_info);
#endif
- initr_lmb,
-#ifdef CONFIG_EFI_LOADER
- efi_memory_init,
- INITCALL(initr_lmb);
+#if CONFIG_IS_ENABLED(EFI_LOADER)
- INITCALL(efi_memory_init);
#endif -#ifdef CONFIG_BINMAN_FDT
- initr_binman,
+#if CONFIG_IS_ENABLED(BINMAN_FDT)
- INITCALL(initr_binman);
#endif -#ifdef CONFIG_FSP_VERSION2
- arch_fsp_init_r,
+#if CONFIG_IS_ENABLED(FSP_VERSION2)
- INITCALL(arch_fsp_init_r);
#endif
- initr_dm_devices,
- stdio_init_tables,
- serial_initialize,
- initr_announce,
- dm_announce,
- INITCALL(initr_dm_devices);
- INITCALL(stdio_init_tables);
- INITCALL(serial_initialize);
- INITCALL(initr_announce);
- INITCALL(dm_announce);
#if CONFIG_IS_ENABLED(WDT)
- initr_watchdog,
- INITCALL(initr_watchdog);
#endif
- INIT_FUNC_WATCHDOG_RESET
- arch_initr_trap,
-#if defined(CONFIG_BOARD_EARLY_INIT_R)
- board_early_init_r,
- WATCHDOG_RESET();
- INITCALL(arch_initr_trap);
+#if CONFIG_IS_ENABLED(BOARD_EARLY_INIT_R)
- INITCALL(board_early_init_r);
#endif
- INIT_FUNC_WATCHDOG_RESET
-#ifdef CONFIG_POST
- post_output_backlog,
- WATCHDOG_RESET();
+#if CONFIG_IS_ENABLED(POST)
- INITCALL(post_output_backlog);
#endif
- INIT_FUNC_WATCHDOG_RESET
-#if defined(CONFIG_PCI_INIT_R) && defined(CONFIG_SYS_EARLY_PCI_INIT)
- WATCHDOG_RESET();
+#if CONFIG_IS_ENABLED(PCI_INIT_R) && CONFIG_IS_ENABLED(SYS_EARLY_PCI_INIT) /* * Do early PCI configuration _before_ the flash gets initialised, * because PCU resources are crucial for flash access on some boards. */
- pci_init,
- INITCALL(pci_init);
#endif -#ifdef CONFIG_ARCH_EARLY_INIT_R
- arch_early_init_r,
+#if CONFIG_IS_ENABLED(ARCH_EARLY_INIT_R)
- INITCALL(arch_early_init_r);
#endif
- power_init_board,
-#ifdef CONFIG_MTD_NOR_FLASH
- initr_flash,
- INITCALL(power_init_board);
+#if CONFIG_IS_ENABLED(MTD_NOR_FLASH)
- INITCALL(initr_flash);
#endif
- INIT_FUNC_WATCHDOG_RESET
-#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
- WATCHDOG_RESET();
+#if CONFIG_IS_ENABLED(PPC) || CONFIG_IS_ENABLED(M68K) || CONFIG_IS_ENABLED(X86) /* initialize higher level parts of CPU like time base and timers */
- cpu_init_r,
- INITCALL(cpu_init_r);
#endif -#ifdef CONFIG_EFI_LOADER
- efi_init_early,
+#if CONFIG_IS_ENABLED(EFI_LOADER)
- INITCALL(efi_init_early);
#endif -#ifdef CONFIG_CMD_NAND
- initr_nand,
+#if CONFIG_IS_ENABLED(CMD_NAND)
- INITCALL(initr_nand);
#endif -#ifdef CONFIG_CMD_ONENAND
- initr_onenand,
+#if CONFIG_IS_ENABLED(CMD_ONENAND)
- INITCALL(initr_onenand);
#endif -#ifdef CONFIG_MMC
- initr_mmc,
+#if CONFIG_IS_ENABLED(MMC)
- INITCALL(initr_mmc);
#endif -#ifdef CONFIG_XEN
- xen_init,
+#if CONFIG_IS_ENABLED(XEN)
- INITCALL(xen_init);
#endif -#ifdef CONFIG_PVBLOCK
- initr_pvblock,
+#if CONFIG_IS_ENABLED(PVBLOCK)
- INITCALL(initr_pvblock);
#endif
- initr_env,
-#ifdef CONFIG_SYS_MALLOC_BOOTPARAMS
- initr_malloc_bootparams,
- INITCALL(initr_env);
+#if CONFIG_IS_ENABLED(SYS_MALLOC_BOOTPARAMS)
- INITCALL(initr_malloc_bootparams);
#endif
- INIT_FUNC_WATCHDOG_RESET
- cpu_secondary_init_r,
-#if defined(CONFIG_ID_EEPROM)
- mac_read_from_eeprom,
- WATCHDOG_RESET();
- INITCALL(cpu_secondary_init_r);
+#if CONFIG_IS_ENABLED(ID_EEPROM)
- INITCALL(mac_read_from_eeprom);
#endif
- INITCALL_EVENT(EVT_SETTINGS_R),
- INIT_FUNC_WATCHDOG_RESET
-#if defined(CONFIG_PCI_INIT_R) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
- INITCALL_EVT(EVT_SETTINGS_R);
- WATCHDOG_RESET();
+#if CONFIG_IS_ENABLED(PCI_INIT_R) && CONFIG_IS_ENABLED(SYS_EARLY_PCI_INIT) /* * Do pci configuration */
- pci_init,
- INITCALL(pci_init);
#endif
- stdio_add_devices,
- jumptable_init,
-#ifdef CONFIG_API
- api_init,
- INITCALL(stdio_add_devices);
- INITCALL(jumptable_init);
+#if CONFIG_IS_ENABLED(API)
- INITCALL(api_init);
#endif
- console_init_r, /* fully init console as a device */
-#ifdef CONFIG_DISPLAY_BOARDINFO_LATE
- console_announce_r,
- show_board_info,
- INITCALL(console_init_r); /* fully init console as a device */
+#if CONFIG_IS_ENABLED(DISPLAY_BOARDINFO_LATE)
- INITCALL(console_announce_r);
- INITCALL(show_board_info);
#endif -#ifdef CONFIG_ARCH_MISC_INIT
- arch_misc_init, /* miscellaneous arch-dependent init */
- /* miscellaneous arch-dependent init */
+#if CONFIG_IS_ENABLED(ARCH_MISC_INIT)
- INITCALL(arch_misc_init);
#endif -#ifdef CONFIG_MISC_INIT_R
- misc_init_r, /* miscellaneous platform-dependent init */
- /* miscellaneous platform-dependent init */
+#if CONFIG_IS_ENABLED(MISC_INIT_R)
- INITCALL(misc_init_r);
#endif
- INIT_FUNC_WATCHDOG_RESET
-#ifdef CONFIG_CMD_KGDB
- kgdb_init,
- WATCHDOG_RESET();
+#if CONFIG_IS_ENABLED(CMD_KGDB)
- INITCALL(kgdb_init);
#endif
- interrupt_init,
- INITCALL(interrupt_init);
#if defined(CONFIG_MICROBLAZE) || defined(CONFIG_M68K)
- timer_init, /* initialize timer */
- INITCALL(timer_init); /* initialize timer */
#endif
- initr_status_led,
- initr_boot_led_blink,
- INITCALL(initr_status_led);
- INITCALL(initr_boot_led_blink); /* PPC has a udelay(20) here dating from 2002. Why? */
-#ifdef CONFIG_BOARD_LATE_INIT
- board_late_init,
+#if CONFIG_IS_ENABLED(BOARD_LATE_INIT)
- INITCALL(board_late_init);
#endif -#ifdef CONFIG_BITBANGMII
- bb_miiphy_init,
+#if CONFIG_IS_ENABLED(BITBANGMII)
- INITCALL(bb_miiphy_init);
#endif -#ifdef CONFIG_PCI_ENDPOINT
- pci_ep_init,
+#if CONFIG_IS_ENABLED(PCI_ENDPOINT)
- INITCALL(pci_ep_init);
#endif -#if defined(CONFIG_CMD_NET)
- INIT_FUNC_WATCHDOG_RESET
- initr_net,
+#if CONFIG_IS_ENABLED(CMD_NET)
- WATCHDOG_RESET();
- INITCALL(initr_net);
#endif -#ifdef CONFIG_POST
- initr_post,
+#if CONFIG_IS_ENABLED(POST)
- INITCALL(initr_post);
#endif
- INIT_FUNC_WATCHDOG_RESET
- INITCALL_EVENT(EVT_LAST_STAGE_INIT),
- WATCHDOG_RESET();
- INITCALL_EVT(EVT_LAST_STAGE_INIT);
#if defined(CFG_PRAM)
- initr_mem,
- INITCALL(initr_mem);
#endif
- initr_boot_led_on,
- run_main_loop,
-};
- INITCALL(initr_boot_led_on);
- INITCALL(run_main_loop);
+}
void board_init_r(gd_t *new_gd, ulong dest_addr) { @@ -796,8 +802,7 @@ void board_init_r(gd_t *new_gd, ulong dest_addr) #endif gd->flags &= ~GD_FLG_LOG_READY;
- if (initcall_run_list(init_sequence_r))
hang();
initcall_run_r();
/* NOTREACHED - run_main_loop() does not return */ hang();
diff --git a/include/initcall.h b/include/initcall.h index 62d3bb67f08..8e22526dd9e 100644 --- a/include/initcall.h +++ b/include/initcall.h @@ -8,6 +8,7 @@
#include <asm/types.h> #include <event.h> +#include <hang.h>
_Static_assert(EVT_COUNT < 256, "Can only support 256 event types with 8 bits");
@@ -35,4 +36,30 @@ typedef int (*init_fnc_t)(void); */ int initcall_run_list(const init_fnc_t init_sequence[]);
+#define INITCALL(_call) \
- do { \
if (_call()) { \
printf("%s(): initcall %s() failed\n", __func__, \
#_call); \
hang(); \
} \
- } while (0)
+#define INITCALL_EVT(_evt) \
- do { \
if (event_notify_null(_evt)) { \
printf("%s(): event %d/%s failed\n", __func__, _evt, \
event_type_name(_evt)) ; \
hang(); \
} \
- } while (0)
+#if defined(CONFIG_WATCHDOG) || defined(CONFIG_HW_WATCHDOG) +#define WATCHDOG_INIT() INITCALL(init_func_watchdog_init) +#define WATCHDOG_RESET() INITCALL(init_func_watchdog_reset) +#else +#define WATCHDOG_INIT() +#define WATCHDOG_RESET() +#endif
#endif