[PATCH v4 1/2] common: board: make static calls

Caleb Connolly caleb.connolly at linaro.org
Mon Jan 6 16:54:37 CET 2025


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 at linaro.org>

Reviewed-by: Caleb Connolly <caleb.connolly at 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

-- 
// Caleb (they/them)



More information about the U-Boot mailing list