* [PATCH v3 1/5] common: board: Simplify array with function pointers with CONFIG_IS_ENABLED
2025-01-03 11:13 [PATCH v3 0/5] Static initcalls Jerome Forissier
@ 2025-01-03 11:13 ` Jerome Forissier
2025-01-03 11:13 ` [PATCH v3 2/5] board_init_f(): use static calls Jerome Forissier
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Jerome Forissier @ 2025-01-03 11:13 UTC (permalink / raw)
To: u-boot
Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek,
Jerome Forissier, Jonas Karlman, Devarsh Thakkar, Evgeny Bachinin,
Christian Marangi, Sughosh Ganu
From: Michal Simek <michal.simek@amd.com>
Convert all simple cases where current ifdef is used with using
CONFIG_IS_ENABLED.
The change doesn't have impact on code size and it is only cleaning up
description.
Checkpatch is reporting issue:
space required after that ',' (ctx:VxB)
When space is there another warning is coming up:
space prohibited before that close parenthesis ')'
but there is no way how to fix it that's why leave it like it is.
Signed-off-by: Michal Simek <michal.simek@amd.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
[jf: s/Simply/Simplify/ in subject]
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
---
common/board_f.c | 49 +++++-------------
common/board_r.c | 128 ++++++++++++-----------------------------------
2 files changed, 46 insertions(+), 131 deletions(-)
diff --git a/common/board_f.c b/common/board_f.c
index 54c48d42ee9..a4d8850cb7d 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -872,12 +872,8 @@ static int initf_upl(void)
static const init_fnc_t init_sequence_f[] = {
setup_mon_len,
-#ifdef CONFIG_OF_CONTROL
- fdtdec_setup,
-#endif
-#ifdef CONFIG_TRACE_EARLY
- trace_early_init,
-#endif
+ CONFIG_IS_ENABLED(OF_CONTROL, (fdtdec_setup,))
+ CONFIG_IS_ENABLED(TRACE_EARLY, (trace_early_init,))
initf_malloc,
initf_upl,
log_init,
@@ -885,16 +881,12 @@ static const init_fnc_t init_sequence_f[] = {
event_init,
bloblist_maybe_init,
setup_spl_handoff,
-#if defined(CONFIG_CONSOLE_RECORD_INIT_F)
- console_record_init,
-#endif
+ CONFIG_IS_ENABLED(CONSOLE_RECORD_INIT_F, (console_record_init,))
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,
-#endif
+ CONFIG_IS_ENABLED(BOARD_EARLY_INIT_F, (board_early_init_f,))
#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.) */
@@ -902,9 +894,7 @@ static const init_fnc_t init_sequence_f[] = {
#if !defined(CONFIG_M68K) || (defined(CONFIG_M68K) && !defined(CONFIG_MCFTMR))
timer_init, /* initialize timer */
#endif
-#if defined(CONFIG_BOARD_POSTCLK_INIT)
- board_postclk_init,
-#endif
+ CONFIG_IS_ENABLED(BOARD_POSTCLK_INIT, (board_postclk_init,))
env_init, /* initialize environment */
init_baud_rate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
@@ -912,38 +902,25 @@ static const init_fnc_t init_sequence_f[] = {
display_options, /* say that we are here */
display_text_info, /* show debugging info if required */
checkcpu,
-#if defined(CONFIG_SYSRESET)
- print_resetinfo,
-#endif
-#if defined(CONFIG_DISPLAY_CPUINFO)
- print_cpuinfo, /* display cpu info (and speed) */
-#endif
-#if defined(CONFIG_DTB_RESELECT)
- embedded_dtb_select,
-#endif
-#if defined(CONFIG_DISPLAY_BOARDINFO)
- show_board_info,
-#endif
+ CONFIG_IS_ENABLED(SYSRESET, (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
-#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY)
- init_func_i2c,
-#endif
+ CONFIG_IS_ENABLED(SYS_I2C_LEGACY, (init_func_i2c,))
announce_dram_init,
dram_init, /* configure available RAM banks */
-#ifdef CONFIG_POST
- post_init_f,
-#endif
+ CONFIG_IS_ENABLED(POST, (post_init_f,))
INIT_FUNC_WATCHDOG_RESET
#if defined(CFG_SYS_DRAM_TEST)
testdram,
#endif /* CFG_SYS_DRAM_TEST */
INIT_FUNC_WATCHDOG_RESET
-#ifdef CONFIG_POST
- init_post,
-#endif
+ CONFIG_IS_ENABLED(POST, (init_post,))
INIT_FUNC_WATCHDOG_RESET
/*
* Now that we have DRAM mapped and working, we can
diff --git a/common/board_r.c b/common/board_r.c
index f63c6aed4d5..c65c0b2ed1e 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -612,19 +612,11 @@ static init_fnc_t init_sequence_r[] = {
initr_malloc,
log_init,
initr_bootstage, /* Needs malloc() but has its own timer */
-#if defined(CONFIG_CONSOLE_RECORD)
- console_record_init,
-#endif
-#ifdef CONFIG_SYS_NONCACHED_MEMORY
- noncached_init,
-#endif
+ CONFIG_IS_ENABLED(CONSOLE_RECORD, (console_record_init,))
+ CONFIG_IS_ENABLED(SYS_NONCACHED_MEMORY, (noncached_init,))
initr_of_live,
-#ifdef CONFIG_DM
- initr_dm,
-#endif
-#ifdef CONFIG_ADDR_MAP
- init_addr_map,
-#endif
+ CONFIG_IS_ENABLED(DM, (initr_dm,))
+ CONFIG_IS_ENABLED(ADDR_MAP, (init_addr_map,))
#if defined(CONFIG_ARM) || defined(CONFIG_RISCV) || defined(CONFIG_SANDBOX)
board_init, /* Setup chipselects */
#endif
@@ -634,36 +626,22 @@ 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 */
-#endif
+ CONFIG_IS_ENABLED(CLOCKS, (set_cpu_clk_info,)) /* Setup clock information */
initr_lmb,
-#ifdef CONFIG_EFI_LOADER
- efi_memory_init,
-#endif
-#ifdef CONFIG_BINMAN_FDT
- initr_binman,
-#endif
-#ifdef CONFIG_FSP_VERSION2
- arch_fsp_init_r,
-#endif
+ CONFIG_IS_ENABLED(EFI_LOADER, (efi_memory_init,))
+ CONFIG_IS_ENABLED(BINMAN_FDT, (initr_binman,))
+ CONFIG_IS_ENABLED(FSP_VERSION2, (arch_fsp_init_r,))
initr_dm_devices,
stdio_init_tables,
serial_initialize,
initr_announce,
dm_announce,
-#if CONFIG_IS_ENABLED(WDT)
- initr_watchdog,
-#endif
+ CONFIG_IS_ENABLED(WDT, (initr_watchdog,))
INIT_FUNC_WATCHDOG_RESET
arch_initr_trap,
-#if defined(CONFIG_BOARD_EARLY_INIT_R)
- board_early_init_r,
-#endif
+ CONFIG_IS_ENABLED(BOARD_EARLY_INIT_R, (board_early_init_r,))
INIT_FUNC_WATCHDOG_RESET
-#ifdef CONFIG_POST
- post_output_backlog,
-#endif
+ CONFIG_IS_ENABLED(POST, (post_output_backlog,))
INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_PCI_INIT_R) && defined(CONFIG_SYS_EARLY_PCI_INIT)
/*
@@ -672,45 +650,25 @@ static init_fnc_t init_sequence_r[] = {
*/
pci_init,
#endif
-#ifdef CONFIG_ARCH_EARLY_INIT_R
- arch_early_init_r,
-#endif
+ CONFIG_IS_ENABLED(ARCH_EARLY_INIT_R, (arch_early_init_r,))
power_init_board,
-#ifdef CONFIG_MTD_NOR_FLASH
- initr_flash,
-#endif
+ CONFIG_IS_ENABLED(MTD_NOR_FLASH, (initr_flash,))
INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
/* initialize higher level parts of CPU like time base and timers */
cpu_init_r,
#endif
-#ifdef CONFIG_EFI_LOADER
- efi_init_early,
-#endif
-#ifdef CONFIG_CMD_NAND
- initr_nand,
-#endif
-#ifdef CONFIG_CMD_ONENAND
- initr_onenand,
-#endif
-#ifdef CONFIG_MMC
- initr_mmc,
-#endif
-#ifdef CONFIG_XEN
- xen_init,
-#endif
-#ifdef CONFIG_PVBLOCK
- initr_pvblock,
-#endif
+ CONFIG_IS_ENABLED(EFI_LOADER, (efi_init_early,))
+ CONFIG_IS_ENABLED(CMD_NAND, (initr_nand,))
+ CONFIG_IS_ENABLED(CMD_ONENAND, (initr_onenand,))
+ CONFIG_IS_ENABLED(MMC, (initr_mmc,))
+ CONFIG_IS_ENABLED(XEN, (xen_init,))
+ CONFIG_IS_ENABLED(PVBLOCK, (initr_pvblock,))
initr_env,
-#ifdef CONFIG_SYS_MALLOC_BOOTPARAMS
- initr_malloc_bootparams,
-#endif
+ CONFIG_IS_ENABLED(SYS_MALLOC_BOOTPARAMS, (initr_malloc_bootparams,))
INIT_FUNC_WATCHDOG_RESET
cpu_secondary_init_r,
-#if defined(CONFIG_ID_EEPROM)
- mac_read_from_eeprom,
-#endif
+ CONFIG_IS_ENABLED(ID_EEPROM, (mac_read_from_eeprom,))
INITCALL_EVENT(EVT_SETTINGS_R),
INIT_FUNC_WATCHDOG_RESET
#if defined(CONFIG_PCI_INIT_R) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
@@ -721,24 +679,15 @@ static init_fnc_t init_sequence_r[] = {
#endif
stdio_add_devices,
jumptable_init,
-#ifdef CONFIG_API
- api_init,
-#endif
+ CONFIG_IS_ENABLED(API, (api_init,))
console_init_r, /* fully init console as a device */
-#ifdef CONFIG_DISPLAY_BOARDINFO_LATE
- console_announce_r,
- show_board_info,
-#endif
-#ifdef CONFIG_ARCH_MISC_INIT
- arch_misc_init, /* miscellaneous arch-dependent init */
-#endif
-#ifdef CONFIG_MISC_INIT_R
- misc_init_r, /* miscellaneous platform-dependent init */
-#endif
+ CONFIG_IS_ENABLED(DISPLAY_BOARDINFO_LATE, (console_announce_r, show_board_info,))
+ /* miscellaneous arch-dependent init */
+ CONFIG_IS_ENABLED(ARCH_MISC_INIT, (arch_misc_init,))
+ /* miscellaneous platform-dependent init */
+ CONFIG_IS_ENABLED(MISC_INIT_R, (misc_init_r,))
INIT_FUNC_WATCHDOG_RESET
-#ifdef CONFIG_CMD_KGDB
- kgdb_init,
-#endif
+ CONFIG_IS_ENABLED(CMD_KGDB, (kgdb_init,))
interrupt_init,
#if defined(CONFIG_MICROBLAZE) || defined(CONFIG_M68K)
timer_init, /* initialize timer */
@@ -746,22 +695,11 @@ static init_fnc_t init_sequence_r[] = {
initr_status_led,
initr_boot_led_blink,
/* PPC has a udelay(20) here dating from 2002. Why? */
-#ifdef CONFIG_BOARD_LATE_INIT
- board_late_init,
-#endif
-#ifdef CONFIG_BITBANGMII
- bb_miiphy_init,
-#endif
-#ifdef CONFIG_PCI_ENDPOINT
- pci_ep_init,
-#endif
-#if defined(CONFIG_CMD_NET)
- INIT_FUNC_WATCHDOG_RESET
- initr_net,
-#endif
-#ifdef CONFIG_POST
- initr_post,
-#endif
+ CONFIG_IS_ENABLED(BOARD_LATE_INIT, (board_late_init,))
+ CONFIG_IS_ENABLED(BITBANGMII, (bb_miiphy_init,))
+ CONFIG_IS_ENABLED(PCI_ENDPOINT, (pci_ep_init,))
+ CONFIG_IS_ENABLED(CMD_NET, (INIT_FUNC_WATCHDOG_RESET initr_net,))
+ CONFIG_IS_ENABLED(POST, (initr_post,))
INIT_FUNC_WATCHDOG_RESET
INITCALL_EVENT(EVT_LAST_STAGE_INIT),
#if defined(CFG_PRAM)
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v3 2/5] board_init_f(): use static calls
2025-01-03 11:13 [PATCH v3 0/5] Static initcalls Jerome Forissier
2025-01-03 11:13 ` [PATCH v3 1/5] common: board: Simplify array with function pointers with CONFIG_IS_ENABLED Jerome Forissier
@ 2025-01-03 11:13 ` Jerome Forissier
2025-01-03 11:13 ` [PATCH v3 3/5] board_init_f_r(): " Jerome Forissier
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Jerome Forissier @ 2025-01-03 11:13 UTC (permalink / raw)
To: u-boot
Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek,
Jerome Forissier, Jonas Karlman, Devarsh Thakkar
Make static calls instead of iterating over the init_sequence_f arrays.
Tested on a KV260 board (xilinx_zynqmp_kria_defconfig).
- With LTO enabled, the code size reported by bloat-o-meter is 1037
bytes less (-0.10%)
- With LTO disabled, the code is 193 bytes smaller (-0.02%)
- Execution time does not change in a noticeable way
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
common/board_f.c | 169 +++++++++++++++++++++++----------------------
include/initcall.h | 27 ++++++++
2 files changed, 114 insertions(+), 82 deletions(-)
diff --git a/common/board_f.c b/common/board_f.c
index a4d8850cb7d..c2446ba344d 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,58 +871,64 @@ static int initf_upl(void)
return 0;
}
-static const init_fnc_t init_sequence_f[] = {
- setup_mon_len,
- CONFIG_IS_ENABLED(OF_CONTROL, (fdtdec_setup,))
- CONFIG_IS_ENABLED(TRACE_EARLY, (trace_early_init,))
- 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,
- CONFIG_IS_ENABLED(CONSOLE_RECORD_INIT_F, (console_record_init,))
- INITCALL_EVENT(EVT_FSP_INIT_F),
- arch_cpu_init, /* basic arch cpu dependent setup */
- mach_cpu_init, /* SoC/machine dependent CPU setup */
- initf_dm,
- CONFIG_IS_ENABLED(BOARD_EARLY_INIT_F, (board_early_init_f,))
+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);
+ CONFIG_IS_ENABLED(OF_CONTROL, (INITCALL(fdtdec_setup)));
+ CONFIG_IS_ENABLED(TRACE_EARLY, (INITCALL(trace_early_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);
+ CONFIG_IS_ENABLED(CONSOLE_RECORD_INIT_F,
+ (INITCALL(console_record_init);))
+ 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);
+ CONFIG_IS_ENABLED(BOARD_EARLY_INIT_F, (INITCALL(board_early_init_f);))
#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
- CONFIG_IS_ENABLED(BOARD_POSTCLK_INIT, (board_postclk_init,))
- 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,
- CONFIG_IS_ENABLED(SYSRESET, (print_resetinfo,))
+ CONFIG_IS_ENABLED(BOARD_POSTCLK_INIT,
+ (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_RESET();
#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 +941,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 +992,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 +1006,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..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] 8+ messages in thread* [PATCH v3 3/5] board_init_f_r(): use static calls
2025-01-03 11:13 [PATCH v3 0/5] Static initcalls Jerome Forissier
2025-01-03 11:13 ` [PATCH v3 1/5] common: board: Simplify array with function pointers with CONFIG_IS_ENABLED Jerome Forissier
2025-01-03 11:13 ` [PATCH v3 2/5] board_init_f(): use static calls Jerome Forissier
@ 2025-01-03 11:13 ` Jerome Forissier
2025-01-03 11:13 ` [PATCH v3 4/5] board_init_r(): " Jerome Forissier
2025-01-03 11:13 ` [PATCH v3 5/5] initcall: remove initcall_run_list() Jerome Forissier
4 siblings, 0 replies; 8+ messages in thread
From: Jerome Forissier @ 2025-01-03 11:13 UTC (permalink / raw)
To: u-boot
Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek,
Jerome Forissier, Jonas Karlman, Devarsh Thakkar
Replace the init_sequence_f_r function array by direct calls.
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
common/board_f.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/common/board_f.c b/common/board_f.c
index c2446ba344d..bd04a6eedcd 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -1020,8 +1020,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
@@ -1034,18 +1034,14 @@ 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,
-#endif
-
- NULL,
-};
+static void initcall_run_f_r(void)
+{
+ CONFIG_IS_ENABLED(X86_64, (INITCALL(init_cache_f_r);))
+}
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
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v3 4/5] board_init_r(): use static calls
2025-01-03 11:13 [PATCH v3 0/5] Static initcalls Jerome Forissier
` (2 preceding siblings ...)
2025-01-03 11:13 ` [PATCH v3 3/5] board_init_f_r(): " Jerome Forissier
@ 2025-01-03 11:13 ` Jerome Forissier
2025-01-04 1:54 ` Caleb Connolly
2025-01-03 11:13 ` [PATCH v3 5/5] initcall: remove initcall_run_list() Jerome Forissier
4 siblings, 1 reply; 8+ messages in thread
From: Jerome Forissier @ 2025-01-03 11:13 UTC (permalink / raw)
To: u-boot
Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek,
Jerome Forissier, Marek Vasut, Nobuhiro Iwamatsu, Evgeny Bachinin,
Christian Marangi, Sughosh Ganu, Caleb Connolly
Replace the init_sequence_r function array by direct calls.
bloat-o-meter stats before/after on u-boot.bin for configuration
xilinx_zynqmp_kria_defconfig are the following:
- With LTO:
add/remove: 87/128 grow/shrink: 8/23 up/down: 19743/-20923 (-1180)
Total: Before=1067882, After=1066702, chg -0.11%
- Without LTO:
add/remove: 0/23 grow/shrink: 2/0 up/down: 795/-1112 (-317)
Total: Before=1119494, After=1119177, chg -0.03%
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
arch/sh/lib/board.c | 9 +-
common/board_r.c | 175 ++++++++++++++++++------------------
test/py/tests/test_trace.py | 8 +-
3 files changed, 96 insertions(+), 96 deletions(-)
diff --git a/arch/sh/lib/board.c b/arch/sh/lib/board.c
index 53b1c147c2e..2daf54e7c33 100644
--- a/arch/sh/lib/board.c
+++ b/arch/sh/lib/board.c
@@ -19,18 +19,13 @@ int dram_init(void)
void relocate_code(ulong start_addr_sp, gd_t *new_gd, ulong relocaddr)
{
- void (*reloc_board_init_r)(gd_t *gd, ulong dest) = board_init_r;
-
- if (new_gd->reloc_off) {
+ if (new_gd->reloc_off)
memcpy((void *)new_gd->relocaddr,
(void *)(new_gd->relocaddr - new_gd->reloc_off),
new_gd->mon_len);
- reloc_board_init_r += new_gd->reloc_off;
- }
-
__asm__ __volatile__("mov.l %0, r15\n" : : "m" (new_gd->start_addr_sp));
while (1)
- reloc_board_init_r(new_gd, 0x0);
+ board_init_r(new_gd, 0x0);
}
diff --git a/common/board_r.c b/common/board_r.c
index c65c0b2ed1e..56016994b11 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,
+ 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,21 +607,21 @@ static init_fnc_t init_sequence_r[] = {
* region.
*/
#endif
- initr_reloc_global_data,
+ INITCALL(initr_reloc_global_data);
#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
- initr_unlock_ram_in_cache,
+ INITCALL(initr_unlock_ram_in_cache);
#endif
- initr_barrier,
- initr_malloc,
- log_init,
- initr_bootstage, /* Needs malloc() but has its own timer */
- CONFIG_IS_ENABLED(CONSOLE_RECORD, (console_record_init,))
- CONFIG_IS_ENABLED(SYS_NONCACHED_MEMORY, (noncached_init,))
- initr_of_live,
- CONFIG_IS_ENABLED(DM, (initr_dm,))
- CONFIG_IS_ENABLED(ADDR_MAP, (init_addr_map,))
+ INITCALL(initr_barrier);
+ INITCALL(initr_malloc);
+ INITCALL(log_init);
+ INITCALL(initr_bootstage); /* Needs malloc() but has its own timer */
+ CONFIG_IS_ENABLED(CONSOLE_RECORD, (INITCALL(console_record_init);))
+ CONFIG_IS_ENABLED(SYS_NONCACHED_MEMORY, (INITCALL(noncached_init);))
+ INITCALL(initr_of_live);
+ CONFIG_IS_ENABLED(DM, (INITCALL(initr_dm);))
+ CONFIG_IS_ENABLED(ADDR_MAP, (INITCALL(init_addr_map);))
#if defined(CONFIG_ARM) || defined(CONFIG_RISCV) || defined(CONFIG_SANDBOX)
- board_init, /* Setup chipselects */
+ INITCALL(board_init); /* Setup chipselects */
#endif
/*
* TODO: printing of the clock inforamtion of the board is now
@@ -626,88 +629,91 @@ static init_fnc_t init_sequence_r[] = {
* davinci SOC's is added. Remove this check once all the board
* implement this.
*/
- CONFIG_IS_ENABLED(CLOCKS, (set_cpu_clk_info,)) /* Setup clock information */
- initr_lmb,
- CONFIG_IS_ENABLED(EFI_LOADER, (efi_memory_init,))
- CONFIG_IS_ENABLED(BINMAN_FDT, (initr_binman,))
- CONFIG_IS_ENABLED(FSP_VERSION2, (arch_fsp_init_r,))
- initr_dm_devices,
- stdio_init_tables,
- serial_initialize,
- initr_announce,
- dm_announce,
- CONFIG_IS_ENABLED(WDT, (initr_watchdog,))
- INIT_FUNC_WATCHDOG_RESET
- arch_initr_trap,
- CONFIG_IS_ENABLED(BOARD_EARLY_INIT_R, (board_early_init_r,))
- INIT_FUNC_WATCHDOG_RESET
- CONFIG_IS_ENABLED(POST, (post_output_backlog,))
- INIT_FUNC_WATCHDOG_RESET
+ CONFIG_IS_ENABLED(CLOCKS, (INITCALL(set_cpu_clk_info);))
+ INITCALL(initr_lmb);
+ CONFIG_IS_ENABLED(EFI_LOADER, (INITCALL(efi_memory_init);))
+ CONFIG_IS_ENABLED(BINMAN_FDT, (INITCALL(initr_binman);))
+ CONFIG_IS_ENABLED(FSP_VERSION2, (INITCALL(arch_fsp_init_r);))
+ INITCALL(initr_dm_devices);
+ INITCALL(stdio_init_tables);
+ INITCALL(serial_initialize);
+ INITCALL(initr_announce);
+ INITCALL(dm_announce);
+ CONFIG_IS_ENABLED(WDT, (INITCALL(initr_watchdog);))
+ WATCHDOG_RESET();
+ INITCALL(arch_initr_trap);
+ CONFIG_IS_ENABLED(BOARD_EARLY_INIT_R, (INITCALL(board_early_init_r);))
+ WATCHDOG_RESET();
+ CONFIG_IS_ENABLED(POST, (INITCALL(post_output_backlog);))
+ WATCHDOG_RESET();
#if defined(CONFIG_PCI_INIT_R) && defined(CONFIG_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
- CONFIG_IS_ENABLED(ARCH_EARLY_INIT_R, (arch_early_init_r,))
- power_init_board,
- CONFIG_IS_ENABLED(MTD_NOR_FLASH, (initr_flash,))
- INIT_FUNC_WATCHDOG_RESET
+ CONFIG_IS_ENABLED(ARCH_EARLY_INIT_R, (INITCALL(arch_early_init_r);))
+ INITCALL(power_init_board);
+ CONFIG_IS_ENABLED(MTD_NOR_FLASH, (INITCALL(initr_flash);))
+ WATCHDOG_RESET();
#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
/* initialize higher level parts of CPU like time base and timers */
- cpu_init_r,
+ INITCALL(cpu_init_r);
#endif
- CONFIG_IS_ENABLED(EFI_LOADER, (efi_init_early,))
- CONFIG_IS_ENABLED(CMD_NAND, (initr_nand,))
- CONFIG_IS_ENABLED(CMD_ONENAND, (initr_onenand,))
- CONFIG_IS_ENABLED(MMC, (initr_mmc,))
- CONFIG_IS_ENABLED(XEN, (xen_init,))
- CONFIG_IS_ENABLED(PVBLOCK, (initr_pvblock,))
- initr_env,
- CONFIG_IS_ENABLED(SYS_MALLOC_BOOTPARAMS, (initr_malloc_bootparams,))
- INIT_FUNC_WATCHDOG_RESET
- cpu_secondary_init_r,
- CONFIG_IS_ENABLED(ID_EEPROM, (mac_read_from_eeprom,))
- INITCALL_EVENT(EVT_SETTINGS_R),
- INIT_FUNC_WATCHDOG_RESET
+ CONFIG_IS_ENABLED(EFI_LOADER, (INITCALL(efi_init_early);))
+ CONFIG_IS_ENABLED(CMD_NAND, (INITCALL(initr_nand);))
+ CONFIG_IS_ENABLED(CMD_ONENAND, (INITCALL(initr_onenand);))
+ CONFIG_IS_ENABLED(MMC, (INITCALL(initr_mmc);))
+ CONFIG_IS_ENABLED(XEN, (INITCALL(xen_init);))
+ CONFIG_IS_ENABLED(PVBLOCK, (INITCALL(initr_pvblock);))
+ INITCALL(initr_env);
+ CONFIG_IS_ENABLED(SYS_MALLOC_BOOTPARAMS,
+ (INITCALL(initr_malloc_bootparams);))
+ WATCHDOG_RESET();
+ INITCALL(cpu_secondary_init_r);
+ CONFIG_IS_ENABLED(ID_EEPROM, (INITCALL(mac_read_from_eeprom);))
+ INITCALL_EVT(EVT_SETTINGS_R);
+ WATCHDOG_RESET();
#if defined(CONFIG_PCI_INIT_R) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
/*
* Do pci configuration
*/
- pci_init,
+ INITCALL(pci_init);
#endif
- stdio_add_devices,
- jumptable_init,
- CONFIG_IS_ENABLED(API, (api_init,))
- console_init_r, /* fully init console as a device */
- CONFIG_IS_ENABLED(DISPLAY_BOARDINFO_LATE, (console_announce_r, show_board_info,))
+ INITCALL(stdio_add_devices);
+ INITCALL(jumptable_init);
+ CONFIG_IS_ENABLED(API, (INITCALL(api_init);))
+ INITCALL(console_init_r); /* fully init console as a device */
+ CONFIG_IS_ENABLED(DISPLAY_BOARDINFO_LATE,
+ (INITCALL(console_announce_r);
+ INITCALL(show_board_info);))
/* miscellaneous arch-dependent init */
- CONFIG_IS_ENABLED(ARCH_MISC_INIT, (arch_misc_init,))
+ CONFIG_IS_ENABLED(ARCH_MISC_INIT, (INITCALL(arch_misc_init);))
/* miscellaneous platform-dependent init */
- CONFIG_IS_ENABLED(MISC_INIT_R, (misc_init_r,))
- INIT_FUNC_WATCHDOG_RESET
- CONFIG_IS_ENABLED(CMD_KGDB, (kgdb_init,))
- interrupt_init,
+ CONFIG_IS_ENABLED(MISC_INIT_R, (INITCALL(misc_init_r);))
+ WATCHDOG_RESET();
+ CONFIG_IS_ENABLED(CMD_KGDB, (INITCALL(kgdb_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? */
- CONFIG_IS_ENABLED(BOARD_LATE_INIT, (board_late_init,))
- CONFIG_IS_ENABLED(BITBANGMII, (bb_miiphy_init,))
- CONFIG_IS_ENABLED(PCI_ENDPOINT, (pci_ep_init,))
- CONFIG_IS_ENABLED(CMD_NET, (INIT_FUNC_WATCHDOG_RESET initr_net,))
- CONFIG_IS_ENABLED(POST, (initr_post,))
- INIT_FUNC_WATCHDOG_RESET
- INITCALL_EVENT(EVT_LAST_STAGE_INIT),
+ CONFIG_IS_ENABLED(BOARD_LATE_INIT, (INITCALL(board_late_init);))
+ CONFIG_IS_ENABLED(BITBANGMII, (INITCALL(bb_miiphy_init);))
+ CONFIG_IS_ENABLED(PCI_ENDPOINT, (INITCALL(pci_ep_init);))
+ CONFIG_IS_ENABLED(CMD_NET, (WATCHDOG_RESET(); INITCALL(initr_net);))
+ CONFIG_IS_ENABLED(POST, (INITCALL(initr_post);))
+ 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)
{
@@ -734,8 +740,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/test/py/tests/test_trace.py b/test/py/tests/test_trace.py
index 44239da5280..1b072df73b6 100644
--- a/test/py/tests/test_trace.py
+++ b/test/py/tests/test_trace.py
@@ -201,7 +201,7 @@ def check_funcgraph(cons, fname, proftool, map_fname, trace_dat):
# Then look for this:
# u-boot-1 0..... 282.101375: funcgraph_exit: 0.006 us | }
# Then check for this:
- # u-boot-1 0..... 282.101375: funcgraph_entry: 0.000 us | calc_reloc_ofs();
+ # u-boot-1 0..... 282.101375: funcgraph_entry: 0.000 us | event_init();
expected_indent = None
found_start = False
@@ -224,8 +224,8 @@ def check_funcgraph(cons, fname, proftool, map_fname, trace_dat):
found_end = True
# The next function after initf_bootstage() exits should be
- # initcall_is_event()
- assert upto == 'calc_reloc_ofs()'
+ # event_init()
+ assert upto == 'event_init()'
# Now look for initf_dm() and dm_timer_init() so we can check the bootstage
# time
@@ -274,7 +274,7 @@ def check_flamegraph(cons, fname, proftool, map_fname, trace_fg):
# We expect dm_timer_init() to be called twice: once before relocation and
# once after
look1 = 'initf_dm;dm_timer_init 1'
- look2 = 'board_init_r;initcall_run_list;initr_dm_devices;dm_timer_init 1'
+ look2 = 'board_init_r;initcall_run_r;initr_dm_devices;dm_timer_init 1'
found = 0
with open(trace_fg, 'r') as fd:
for line in fd:
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v3 4/5] board_init_r(): use static calls
2025-01-03 11:13 ` [PATCH v3 4/5] board_init_r(): " Jerome Forissier
@ 2025-01-04 1:54 ` Caleb Connolly
2025-01-04 19:40 ` Simon Glass
0 siblings, 1 reply; 8+ messages in thread
From: Caleb Connolly @ 2025-01-04 1:54 UTC (permalink / raw)
To: Jerome Forissier, u-boot
Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek,
Marek Vasut, Nobuhiro Iwamatsu, Evgeny Bachinin,
Christian Marangi, Sughosh Ganu
Hi Jerome,
On 03/01/2025 12:13, Jerome Forissier wrote:
> Replace the init_sequence_r function array by direct calls.
> bloat-o-meter stats before/after on u-boot.bin for configuration
> xilinx_zynqmp_kria_defconfig are the following:
>
> - With LTO:
> add/remove: 87/128 grow/shrink: 8/23 up/down: 19743/-20923 (-1180)
> Total: Before=1067882, After=1066702, chg -0.11%
>
> - Without LTO:
> add/remove: 0/23 grow/shrink: 2/0 up/down: 795/-1112 (-317)
> Total: Before=1119494, After=1119177, chg -0.03%
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
[...]
> + INITCALL(stdio_add_devices);
> + INITCALL(jumptable_init);
> + CONFIG_IS_ENABLED(API, (INITCALL(api_init);))
> + INITCALL(console_init_r); /* fully init console as a device */
> + CONFIG_IS_ENABLED(DISPLAY_BOARDINFO_LATE,
> + (INITCALL(console_announce_r);
> + INITCALL(show_board_info);))
Not that the array was extremely readable, but I think this is
significantly worse. Particularly as my IDE will no longer grey-out
sections for config options which are disabled.
I would honestly rather still see pre-processor #if's here, or at least
something better than this semicolon-in-macro stuff.
Kind regards,
> /* miscellaneous arch-dependent init */
> - CONFIG_IS_ENABLED(ARCH_MISC_INIT, (arch_misc_init,))
> + CONFIG_IS_ENABLED(ARCH_MISC_INIT, (INITCALL(arch_misc_init);))
> /* miscellaneous platform-dependent init */
> - CONFIG_IS_ENABLED(MISC_INIT_R, (misc_init_r,))
> - INIT_FUNC_WATCHDOG_RESET
> - CONFIG_IS_ENABLED(CMD_KGDB, (kgdb_init,))
> - interrupt_init,
> + CONFIG_IS_ENABLED(MISC_INIT_R, (INITCALL(misc_init_r);))
> + WATCHDOG_RESET();
> + CONFIG_IS_ENABLED(CMD_KGDB, (INITCALL(kgdb_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? */
> - CONFIG_IS_ENABLED(BOARD_LATE_INIT, (board_late_init,))
> - CONFIG_IS_ENABLED(BITBANGMII, (bb_miiphy_init,))
> - CONFIG_IS_ENABLED(PCI_ENDPOINT, (pci_ep_init,))
> - CONFIG_IS_ENABLED(CMD_NET, (INIT_FUNC_WATCHDOG_RESET initr_net,))
> - CONFIG_IS_ENABLED(POST, (initr_post,))
> - INIT_FUNC_WATCHDOG_RESET
> - INITCALL_EVENT(EVT_LAST_STAGE_INIT),
> + CONFIG_IS_ENABLED(BOARD_LATE_INIT, (INITCALL(board_late_init);))
> + CONFIG_IS_ENABLED(BITBANGMII, (INITCALL(bb_miiphy_init);))
> + CONFIG_IS_ENABLED(PCI_ENDPOINT, (INITCALL(pci_ep_init);))
> + CONFIG_IS_ENABLED(CMD_NET, (WATCHDOG_RESET(); INITCALL(initr_net);))
> + CONFIG_IS_ENABLED(POST, (INITCALL(initr_post);))
> + 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)
> {
> @@ -734,8 +740,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/test/py/tests/test_trace.py b/test/py/tests/test_trace.py
> index 44239da5280..1b072df73b6 100644
> --- a/test/py/tests/test_trace.py
> +++ b/test/py/tests/test_trace.py
> @@ -201,7 +201,7 @@ def check_funcgraph(cons, fname, proftool, map_fname, trace_dat):
> # Then look for this:
> # u-boot-1 0..... 282.101375: funcgraph_exit: 0.006 us | }
> # Then check for this:
> - # u-boot-1 0..... 282.101375: funcgraph_entry: 0.000 us | calc_reloc_ofs();
> + # u-boot-1 0..... 282.101375: funcgraph_entry: 0.000 us | event_init();
>
> expected_indent = None
> found_start = False
> @@ -224,8 +224,8 @@ def check_funcgraph(cons, fname, proftool, map_fname, trace_dat):
> found_end = True
>
> # The next function after initf_bootstage() exits should be
> - # initcall_is_event()
> - assert upto == 'calc_reloc_ofs()'
> + # event_init()
> + assert upto == 'event_init()'
>
> # Now look for initf_dm() and dm_timer_init() so we can check the bootstage
> # time
> @@ -274,7 +274,7 @@ def check_flamegraph(cons, fname, proftool, map_fname, trace_fg):
> # We expect dm_timer_init() to be called twice: once before relocation and
> # once after
> look1 = 'initf_dm;dm_timer_init 1'
> - look2 = 'board_init_r;initcall_run_list;initr_dm_devices;dm_timer_init 1'
> + look2 = 'board_init_r;initcall_run_r;initr_dm_devices;dm_timer_init 1'
> found = 0
> with open(trace_fg, 'r') as fd:
> for line in fd:
--
// Caleb (they/them)
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH v3 4/5] board_init_r(): use static calls
2025-01-04 1:54 ` Caleb Connolly
@ 2025-01-04 19:40 ` Simon Glass
0 siblings, 0 replies; 8+ messages in thread
From: Simon Glass @ 2025-01-04 19:40 UTC (permalink / raw)
To: Caleb Connolly
Cc: Jerome Forissier, u-boot, Ilias Apalodimas, Tom Rini,
Michal Simek, Marek Vasut, Nobuhiro Iwamatsu, Evgeny Bachinin,
Christian Marangi, Sughosh Ganu
Hi Caleb,
On Sat, 4 Jan 2025 at 14:54, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Hi Jerome,
>
> On 03/01/2025 12:13, Jerome Forissier wrote:
> > Replace the init_sequence_r function array by direct calls.
> > bloat-o-meter stats before/after on u-boot.bin for configuration
> > xilinx_zynqmp_kria_defconfig are the following:
> >
> > - With LTO:
> > add/remove: 87/128 grow/shrink: 8/23 up/down: 19743/-20923 (-1180)
> > Total: Before=1067882, After=1066702, chg -0.11%
> >
> > - Without LTO:
> > add/remove: 0/23 grow/shrink: 2/0 up/down: 795/-1112 (-317)
> > Total: Before=1119494, After=1119177, chg -0.03%
> >
> > Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> > ---
>
> [...]
>
> > + INITCALL(stdio_add_devices);
> > + INITCALL(jumptable_init);
> > + CONFIG_IS_ENABLED(API, (INITCALL(api_init);))
> > + INITCALL(console_init_r); /* fully init console as a device */
> > + CONFIG_IS_ENABLED(DISPLAY_BOARDINFO_LATE,
> > + (INITCALL(console_announce_r);
> > + INITCALL(show_board_info);))
>
> Not that the array was extremely readable, but I think this is
> significantly worse. Particularly as my IDE will no longer grey-out
> sections for config options which are disabled.
>
> I would honestly rather still see pre-processor #if's here, or at least
> something better than this semicolon-in-macro stuff.
Hmmm I think you have a point.
I was actually thinking about having something like
INIT_CALL_CONFIG(DISPLAY_BOARD_INFO_LATE, console_announce_r)
i.e. a macro to combine the two things and the semicolon. But I
decided it is really no better than this patch so didn't mention it.
So another option would be to keep the #ifs as you say, with
everything else about this patch left alone. I have the same issue
with the IDE (I suspect some clever integration could be written to
fix it). But I have changed my mind and think #ifs are better, in this
case.
Regards,
Simon
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3 5/5] initcall: remove initcall_run_list()
2025-01-03 11:13 [PATCH v3 0/5] Static initcalls Jerome Forissier
` (3 preceding siblings ...)
2025-01-03 11:13 ` [PATCH v3 4/5] board_init_r(): " Jerome Forissier
@ 2025-01-03 11:13 ` Jerome Forissier
4 siblings, 0 replies; 8+ messages in thread
From: Jerome Forissier @ 2025-01-03 11:13 UTC (permalink / raw)
To: u-boot
Cc: Ilias Apalodimas, Tom Rini, Simon Glass, Michal Simek,
Jerome Forissier, Raymond Mao, Sughosh Ganu, 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] 8+ messages in thread