
Hi Jerome
[...]
(INITCALL(board_postclk_init);))
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);
CONFIG_IS_ENABLED(SYSRESET, (INITCALL(print_resetinfo);)) /* display cpu info (and speed) */
CONFIG_IS_ENABLED(DISPLAY_CPUINFO, (print_cpuinfo,))
CONFIG_IS_ENABLED(DTB_RESELECT, (embedded_dtb_select,))
CONFIG_IS_ENABLED(DISPLAY_BOARDINFO, (show_board_info,))
INIT_FUNC_WATCHDOG_INIT
INITCALL_EVENT(EVT_MISC_INIT_F),
INIT_FUNC_WATCHDOG_RESET
CONFIG_IS_ENABLED(SYS_I2C_LEGACY, (init_func_i2c,))
announce_dram_init,
dram_init, /* configure available RAM banks */
CONFIG_IS_ENABLED(POST, (post_init_f,))
INIT_FUNC_WATCHDOG_RESET
CONFIG_IS_ENABLED(DISPLAY_CPUINFO, (INITCALL(print_cpuinfo);))
CONFIG_IS_ENABLED(DTB_RESELECT, (INITCALL(embedded_dtb_select);))
CONFIG_IS_ENABLED(DISPLAY_BOARDINFO, (INITCALL(show_board_info);))
WATCHDOG_INIT();
INITCALL_EVT(EVT_MISC_INIT_F);
WATCHDOG_RESET();
CONFIG_IS_ENABLED(SYS_I2C_LEGACY, (INITCALL(init_func_i2c);))
INITCALL(announce_dram_init);
INITCALL(dram_init); /* configure available RAM banks */
CONFIG_IS_ENABLED(POST, (INITCALL(post_init_f);))
WATCHDOG_INIT();
The previous function was calling init, reset, reset for the watchdog. The new code does init, reset, init, reset etc. Is this intentional? Was that a bug of the existing code?
Thanks /Ilias
#if defined(CFG_SYS_DRAM_TEST)
testdram,
INITCALL(testdram);
#endif /* CFG_SYS_DRAM_TEST */
INIT_FUNC_WATCHDOG_RESET
CONFIG_IS_ENABLED(POST, (init_post,))
INIT_FUNC_WATCHDOG_RESET
WATCHDOG_RESET();
CONFIG_IS_ENABLED(POST, (INITCALL(init_post);))
WATCHDOG_RESET(); /* * Now that we have DRAM mapped and working, we can * relocate the code and continue running from DRAM.
@@ -934,48 +937,48 @@ 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,
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 defined(CONFIG_OF_BOARD_FIXUP) && defined(CONFIG_OF_INITIAL_DTB_READONLY)
reloc_fdt,
fix_fdt,
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
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 !defined(CONFIG_OF_BOARD_FIXUP) || !defined(CONFIG_OF_INITIAL_DTB_READONLY)
reloc_fdt,
INITCALL(reloc_fdt);
#endif
reloc_bootstage,
reloc_bloblist,
setup_reloc,
INITCALL(reloc_bootstage);
INITCALL(reloc_bloblist);
INITCALL(setup_reloc);
#if defined(CONFIG_X86) || defined(CONFIG_ARC)
copy_uboot_to_ram,
do_elf_reloc_fixups,
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
@@ -985,12 +988,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,
INITCALL(cyclic_unregister_all);
#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
jump_to_copy,
INITCALL(jump_to_copy);
#endif
NULL,
-}; +}
void board_init_f(ulong boot_flags) { @@ -1000,8 +1002,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) && \ diff --git a/include/initcall.h b/include/initcall.h index 62d3bb67f08..9398a3ec7d5 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()) { \
debug("%s(): calling %s() failed\n", __func__, \
#_call); \
hang(); \
} \
} while (0)
+#define INITCALL_EVT(_evt) \
do { \
if (event_notify_null(_evt)) { \
debug("%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
2.43.0