* [PATCH v4 0/2] Static initcalls
@ 2025-01-06 14:40 Jerome Forissier
2025-01-06 14:40 ` [PATCH v4 1/2] common: board: make static calls Jerome Forissier
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Jerome Forissier @ 2025-01-06 14:40 UTC (permalink / raw)
To: u-boot
Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek,
Jerome Forissier
This series replaces the dynamic initcalls (with function pointers) with
static calls, and gets rid of initcall_run_list(), init_sequence_f,
init_sequence_f_r and init_sequence_r. This makes the code simpler and the
binary slighlty smaller: -2281 bytes/-0.21 % with LTO enabled and -510
bytes/-0.05 % with LTO disabled (xilinx_zynqmp_kria_defconfig).
Execution time doesn't seem to change noticeably. There is no impact on
the SPL.
Changes in v4:
- Fold all changes to board_init_*() into a single patch
- Use '#if CONFIG_IS_ENABLED(FOO) INITCALL(init_foo) #endif' instead of
'CONFIG_IS_ENABLED(FOO, (INITCALL(init_foo);));' (Caleb C., Simon G.).
As a consequence, drop Michal's patch ("common: board: Simplify array
with function pointers with CONFIG_IS_ENABLED").
- Rebase on next
Changes in v3:
- Use printf() rather than debug() to report initcall failures
(Quentin S.)
- initcall_run_f(): replace one erroneous call to WATCHDOG_INIT() with
WATCHDOG_RESET() (Ilias A.)
- Fix relocate_code() in arch/sh/lib/board.c to address CI failures with
r2dplus (https://lists.denx.de/pipermail/u-boot/2025-January/576213.html)
(Tom R.)
- Add comments to initcall_run_f() and initcall_run_r() (Simon G.)
Changes in v2:
- INTICALL() and INITCALL_EVT() now call hang() immediately on error
- Fixed typo: s/intcall_run_f_r/initcall_run_f_r/
*** BLURB HERE ***
Jerome Forissier (2):
common: board: make static calls
initcall: remove initcall_run_list()
common/board_f.c | 218 ++++++++++++++++++++-------------------
common/board_r.c | 251 +++++++++++++++++++++++----------------------
include/initcall.h | 45 ++++----
lib/Makefile | 1 -
lib/initcall.c | 102 ------------------
5 files changed, 263 insertions(+), 354 deletions(-)
delete mode 100644 lib/initcall.c
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v4 1/2] common: board: make static calls 2025-01-06 14:40 [PATCH v4 0/2] Static initcalls Jerome Forissier @ 2025-01-06 14:40 ` Jerome Forissier 2025-01-06 15:54 ` Caleb Connolly 2025-01-06 14:40 ` [PATCH v4 2/2] initcall: remove initcall_run_list() Jerome Forissier 2025-01-17 21:46 ` [PATCH v4 0/2] Static initcalls Tom Rini 2 siblings, 1 reply; 7+ messages in thread From: Jerome Forissier @ 2025-01-06 14:40 UTC (permalink / raw) To: u-boot Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek, Jerome Forissier, Devarsh Thakkar, Jonas Karlman, Evgeny Bachinin, Rasmus Villemoes, Sughosh Ganu, Christian Marangi 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> --- 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 -- 2.43.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 1/2] common: board: make static calls 2025-01-06 14:40 ` [PATCH v4 1/2] common: board: make static calls Jerome Forissier @ 2025-01-06 15:54 ` Caleb Connolly 0 siblings, 0 replies; 7+ messages in thread From: Caleb Connolly @ 2025-01-06 15:54 UTC (permalink / raw) To: Jerome Forissier, u-boot Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek, Devarsh Thakkar, Jonas Karlman, Evgeny Bachinin, Rasmus Villemoes, Sughosh Ganu, Christian Marangi 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 -- // Caleb (they/them) ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v4 2/2] initcall: remove initcall_run_list() 2025-01-06 14:40 [PATCH v4 0/2] Static initcalls Jerome Forissier 2025-01-06 14:40 ` [PATCH v4 1/2] common: board: make static calls Jerome Forissier @ 2025-01-06 14:40 ` Jerome Forissier 2025-01-17 21:46 ` [PATCH v4 0/2] Static initcalls Tom Rini 2 siblings, 0 replies; 7+ messages in thread From: Jerome Forissier @ 2025-01-06 14:40 UTC (permalink / raw) To: u-boot Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek, Jerome Forissier, Raymond Mao, Heinrich Schuchardt, Caleb Connolly, Dan Carpenter Now that all initcalls have been converted to static calls, remove initcall_run_list(). Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> --- include/initcall.h | 24 ----------- lib/Makefile | 1 - lib/initcall.c | 102 --------------------------------------------- 3 files changed, 127 deletions(-) delete mode 100644 lib/initcall.c diff --git a/include/initcall.h b/include/initcall.h index 8e22526dd9e..220a55ad84d 100644 --- a/include/initcall.h +++ b/include/initcall.h @@ -12,30 +12,6 @@ _Static_assert(EVT_COUNT < 256, "Can only support 256 event types with 8 bits"); -/** - * init_fnc_t - Init function - * - * Return: 0 if OK -ve on error - */ -typedef int (*init_fnc_t)(void); - -/* Top bit indicates that the initcall is an event */ -#define INITCALL_IS_EVENT GENMASK(BITS_PER_LONG - 1, 8) -#define INITCALL_EVENT_TYPE GENMASK(7, 0) - -#define INITCALL_EVENT(_type) (void *)((_type) | INITCALL_IS_EVENT) - -/** - * initcall_run_list() - Run through a list of function calls - * - * This calls functions one after the other, stopping at the first error, or - * when NULL is obtained. - * - * @init_sequence: NULL-terminated init sequence to run - * Return: 0 if OK, or -ve error code from the first failure - */ -int initcall_run_list(const init_fnc_t init_sequence[]); - #define INITCALL(_call) \ do { \ if (_call()) { \ diff --git a/lib/Makefile b/lib/Makefile index 5cb3278d2ef..13fb36ce3ad 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -44,7 +44,6 @@ obj-$(CONFIG_GZIP_COMPRESSED) += gzip.o obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += smbios.o obj-$(CONFIG_SMBIOS_PARSER) += smbios-parser.o obj-$(CONFIG_IMAGE_SPARSE) += image-sparse.o -obj-y += initcall.o obj-y += ldiv.o obj-$(CONFIG_XXHASH) += xxhash.o obj-y += net_utils.o diff --git a/lib/initcall.c b/lib/initcall.c deleted file mode 100644 index 2686b9aed5c..00000000000 --- a/lib/initcall.c +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (c) 2013 The Chromium OS Authors. - */ - -#include <efi.h> -#include <initcall.h> -#include <log.h> -#include <relocate.h> -#include <asm/global_data.h> - -DECLARE_GLOBAL_DATA_PTR; - -static ulong calc_reloc_ofs(void) -{ -#ifdef CONFIG_EFI_APP - return (ulong)image_base; -#endif - /* - * Sandbox is relocated by the OS, so symbols always appear at - * the relocated address. - */ - if (IS_ENABLED(CONFIG_SANDBOX) || (gd->flags & GD_FLG_RELOC)) - return gd->reloc_off; - - return 0; -} - -/** - * initcall_is_event() - Get the event number for an initcall - * - * func: Function pointer to check - * Return: Event number, if this is an event, else 0 - */ -static int initcall_is_event(init_fnc_t func) -{ - ulong val = (ulong)func; - - if ((val & INITCALL_IS_EVENT) == INITCALL_IS_EVENT) - return val & INITCALL_EVENT_TYPE; - - return 0; -} - -/* - * To enable debugging. add #define DEBUG at the top of the including file. - * - * To find a symbol, use grep on u-boot.map - */ -int initcall_run_list(const init_fnc_t init_sequence[]) -{ - ulong reloc_ofs; - const init_fnc_t *ptr; - enum event_t type; - init_fnc_t func; - int ret = 0; - - for (ptr = init_sequence; func = *ptr, func; ptr++) { - reloc_ofs = calc_reloc_ofs(); - type = initcall_is_event(func); - - if (type) { - if (!CONFIG_IS_ENABLED(EVENT)) - continue; - debug("initcall: event %d/%s\n", type, - event_type_name(type)); - } else if (reloc_ofs) { - debug("initcall: %p (relocated to %p)\n", - (char *)func - reloc_ofs, (char *)func); - } else { - debug("initcall: %p\n", (char *)func - reloc_ofs); - } - - ret = type ? event_notify_null(type) : func(); - if (ret) - break; - } - - if (ret) { - if (CONFIG_IS_ENABLED(EVENT)) { - char buf[60]; - - /* don't worry about buf size as we are dying here */ - if (type) { - sprintf(buf, "event %d/%s", type, - event_type_name(type)); - } else { - sprintf(buf, "call %p", - (char *)func - reloc_ofs); - } - - printf("initcall failed at %s (err=%dE)\n", buf, ret); - } else { - printf("initcall failed at call %p (err=%d)\n", - (char *)func - reloc_ofs, ret); - } - - return ret; - } - - return 0; -} -- 2.43.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 0/2] Static initcalls 2025-01-06 14:40 [PATCH v4 0/2] Static initcalls Jerome Forissier 2025-01-06 14:40 ` [PATCH v4 1/2] common: board: make static calls Jerome Forissier 2025-01-06 14:40 ` [PATCH v4 2/2] initcall: remove initcall_run_list() Jerome Forissier @ 2025-01-17 21:46 ` Tom Rini 2025-01-21 16:05 ` Jerome Forissier 2 siblings, 1 reply; 7+ messages in thread From: Tom Rini @ 2025-01-17 21:46 UTC (permalink / raw) To: Jerome Forissier; +Cc: u-boot, Ilias Apalodimas, Simon Glass, Michal Simek [-- Attachment #1: Type: text/plain, Size: 629 bytes --] On Mon, Jan 06, 2025 at 03:40:12PM +0100, Jerome Forissier wrote: > This series replaces the dynamic initcalls (with function pointers) with > static calls, and gets rid of initcall_run_list(), init_sequence_f, > init_sequence_f_r and init_sequence_r. This makes the code simpler and the > binary slighlty smaller: -2281 bytes/-0.21 % with LTO enabled and -510 > bytes/-0.05 % with LTO disabled (xilinx_zynqmp_kria_defconfig). > > Execution time doesn't seem to change noticeably. There is no impact on > the SPL. This fails in CI unfortunately: https://source.denx.de/u-boot/u-boot/-/pipelines/24241 -- Tom [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 659 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 0/2] Static initcalls 2025-01-17 21:46 ` [PATCH v4 0/2] Static initcalls Tom Rini @ 2025-01-21 16:05 ` Jerome Forissier 2025-01-21 16:11 ` Tom Rini 0 siblings, 1 reply; 7+ messages in thread From: Jerome Forissier @ 2025-01-21 16:05 UTC (permalink / raw) To: Tom Rini; +Cc: u-boot, Ilias Apalodimas, Simon Glass, Michal Simek On 1/17/25 22:46, Tom Rini wrote: > On Mon, Jan 06, 2025 at 03:40:12PM +0100, Jerome Forissier wrote: > >> This series replaces the dynamic initcalls (with function pointers) with >> static calls, and gets rid of initcall_run_list(), init_sequence_f, >> init_sequence_f_r and init_sequence_r. This makes the code simpler and the >> binary slighlty smaller: -2281 bytes/-0.21 % with LTO enabled and -510 >> bytes/-0.05 % with LTO disabled (xilinx_zynqmp_kria_defconfig). >> >> Execution time doesn't seem to change noticeably. There is no impact on >> the SPL. > > This fails in CI unfortunately: > https://source.denx.de/u-boot/u-boot/-/pipelines/24241 I found the problem. It was a silly mistake :-/ diff --git a/common/board_r.c b/common/board_r.c index 74ebbdc7de9..21a8b97d1bc 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -717,7 +717,7 @@ static void initcall_run_r(void) #endif INITCALL_EVT(EVT_SETTINGS_R); WATCHDOG_RESET(); -#if CONFIG_IS_ENABLED(PCI_INIT_R) && CONFIG_IS_ENABLED(SYS_EARLY_PCI_INIT) +#if CONFIG_IS_ENABLED(PCI_INIT_R) && !CONFIG_IS_ENABLED(SYS_EARLY_PCI_INIT) /* * Do pci configuration */ Shall I sent a v5? Thanks, -- Jerome ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 0/2] Static initcalls 2025-01-21 16:05 ` Jerome Forissier @ 2025-01-21 16:11 ` Tom Rini 0 siblings, 0 replies; 7+ messages in thread From: Tom Rini @ 2025-01-21 16:11 UTC (permalink / raw) To: Jerome Forissier; +Cc: u-boot, Ilias Apalodimas, Simon Glass, Michal Simek [-- Attachment #1: Type: text/plain, Size: 1386 bytes --] On Tue, Jan 21, 2025 at 05:05:58PM +0100, Jerome Forissier wrote: > > > On 1/17/25 22:46, Tom Rini wrote: > > On Mon, Jan 06, 2025 at 03:40:12PM +0100, Jerome Forissier wrote: > > > >> This series replaces the dynamic initcalls (with function pointers) with > >> static calls, and gets rid of initcall_run_list(), init_sequence_f, > >> init_sequence_f_r and init_sequence_r. This makes the code simpler and the > >> binary slighlty smaller: -2281 bytes/-0.21 % with LTO enabled and -510 > >> bytes/-0.05 % with LTO disabled (xilinx_zynqmp_kria_defconfig). > >> > >> Execution time doesn't seem to change noticeably. There is no impact on > >> the SPL. > > > > This fails in CI unfortunately: > > https://source.denx.de/u-boot/u-boot/-/pipelines/24241 > > I found the problem. It was a silly mistake :-/ > > diff --git a/common/board_r.c b/common/board_r.c > index 74ebbdc7de9..21a8b97d1bc 100644 > --- a/common/board_r.c > +++ b/common/board_r.c > @@ -717,7 +717,7 @@ static void initcall_run_r(void) > #endif > INITCALL_EVT(EVT_SETTINGS_R); > WATCHDOG_RESET(); > -#if CONFIG_IS_ENABLED(PCI_INIT_R) && CONFIG_IS_ENABLED(SYS_EARLY_PCI_INIT) > +#if CONFIG_IS_ENABLED(PCI_INIT_R) && !CONFIG_IS_ENABLED(SYS_EARLY_PCI_INIT) > /* > * Do pci configuration > */ > > Shall I sent a v5? Yes please, and push it through CI first ;) -- Tom [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 659 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-01-21 16:11 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-01-06 14:40 [PATCH v4 0/2] Static initcalls Jerome Forissier 2025-01-06 14:40 ` [PATCH v4 1/2] common: board: make static calls Jerome Forissier 2025-01-06 15:54 ` Caleb Connolly 2025-01-06 14:40 ` [PATCH v4 2/2] initcall: remove initcall_run_list() Jerome Forissier 2025-01-17 21:46 ` [PATCH v4 0/2] Static initcalls Tom Rini 2025-01-21 16:05 ` Jerome Forissier 2025-01-21 16:11 ` Tom Rini
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox