[RFC PATCH] bootstage: stash boot records to reserved mem before kernel handoff

Tom Rini trini at konsulko.com
Fri Aug 22 16:47:59 CEST 2025


On Fri, Aug 22, 2025 at 09:35:23AM +0530, vishnu singh wrote:

> From: Vishnu Singh <v-singh1 at ti.com>
> 
> U-Boot now stashes its bootstage buffer into a reserved memory region
> whenever CONFIG_BOOTSTAGE_STASH is enabled, just before exiting to the
> kernel. This allows a post boot parser to read a unified timeline
> (SPL→U-Boot→Kernel→MCU/DSP) directly from DDR, enabling standardized
> and repeatable boot-time profiling across releases and SoCs.
> 
> Change summary:
>  Call bootstage_stash_default() in announce_and_cleanup()
>   when CONFIG_BOOTSTAGE_STASH is set.
> 
> Reference boot-time parser utility:
>  https://github.com/v-singh1/boot-time-parse
> 
> Sample boot time report:
>     +--------------------------------------------------------------------+
>                      am62xx-evm Boot Time Report
>     +--------------------------------------------------------------------+
>     Device Power On         : 0 ms
>     SPL Time                : 843 ms
>     U-Boot Time             : 2173 ms
>     Kernel handoff time     : 462 ms
>     Kernel Time             : 2522 ms
>     Total Boot Time         : 6000 ms
>     +--------------------------------------------------------------------+
> 
>     +--------------------------------------------------------------------+
>                      Bootloader and Kernel Boot Records
>     +--------------------------------------------------------------------+
>     BOOTSTAGE_AWAKE                =      0 ms (+  0 ms)
>     BOOTSTAGE_START_UBOOT_F        =    843 ms (+  0 ms)
>     BOOTSTAGE_ACCUM_DM_F           =    843 ms (+  0 ms)
>     BOOTSTAGE_START_UBOOT_R        =   1951 ms (+1108 ms)
>     BOOTSTAGE_ACCUM_DM_R           =   1951 ms (+  0 ms)
>     BOOTSTAGE_NET_ETH_START        =   2032 ms (+ 81 ms)
>     BOOTSTAGE_NET_ETH_INIT         =   2053 ms (+ 21 ms)
>     BOOTSTAGE_MAIN_LOOP            =   2055 ms (+  2 ms)
>     BOOTSTAGE_START_MCU            =   2661 ms (+606 ms)
>     BOOTSTAGE_BOOTM_START          =   2959 ms (+298 ms)
>     BOOTSTAGE_RUN_OS               =   3016 ms (+ 57 ms)
>     BOOTSTAGE_BOOTM_HANDOFF        =   3016 ms (+  0 ms)
>     BOOTSTAGE_KERNEL_START         =   3478 ms (+462 ms)
>     BOOTSTAGE_KERNEL_END           =   6000 ms (+2522 ms)
>     +--------------------------------------------------------------------+
> 
>     +--------------------------------------------------------------------+
>                      MCU Boot Records
>     +--------------------------------------------------------------------+
>     MCU_AWAKE                      =   2661 ms (+  0 ms)
>     BOARD_PERIPHERALS_INIT         =   2661 ms (+  0 ms)
>     MAIN_TASK_CREATE               =   2661 ms (+  0 ms)
>     FIRST_TASK                     =   2662 ms (+  1 ms)
>     DRIVERS_OPEN                   =   2662 ms (+  0 ms)
>     BOARD_DRIVERS_OPEN             =   2662 ms (+  0 ms)
>     IPC_SYNC_FOR_LINUX             =   6636 ms (+3974 ms)
>     IPC_REGISTER_CLIENT            =   6636 ms (+  0 ms)
>     IPC_SUSPEND_TASK               =   6636 ms (+  0 ms)
>     IPC_RECEIVE_TASK               =   6636 ms (+  0 ms)
>     IPC_SYNC_ALL                   =   6787 ms (+151 ms)
>     +--------------------------------------------------------------------+
> 
> Signed-off-by: Vishnu Singh <v-singh1 at ti.com>

In that it looks like x86 already does a similar thing, this is a good
idea and I wonder if some tooling already exists to read it.

> ---
>  arch/arm/lib/bootm.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index 7eb764e1f4e..b01e763ff28 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -57,6 +57,9 @@ static void announce_and_cleanup(int fake)
>  #ifdef CONFIG_BOOTSTAGE_FDT
>  	bootstage_fdt_add_report();
>  #endif
> +	if (IS_ENABLED(CONFIG_BOOTSTAGE_STASH))
> +		bootstage_stash_default();

You don't need to guard the call, the default bootstage_stash_default()
is a return 0 call when CONFIG_BOOTSTAGE_STASH isn't set.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20250822/6d71a191/attachment.sig>


More information about the U-Boot mailing list