2018-05-06 21:58:06 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
2012-01-14 15:24:44 +00:00
|
|
|
/*
|
|
|
|
* This file implements recording of each stage of the boot process. It is
|
|
|
|
* intended to implement timing of each stage, reporting this information
|
|
|
|
* to the user and passing it to the OS for logging / further analysis.
|
2017-05-22 11:05:23 +00:00
|
|
|
* Note that it requires timer_get_boot_us() to be defined by the board
|
2012-01-14 15:24:44 +00:00
|
|
|
*
|
|
|
|
* Copyright (c) 2011 The Chromium OS Authors.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _BOOTSTAGE_H
|
|
|
|
#define _BOOTSTAGE_H
|
|
|
|
|
2021-05-03 20:48:58 +00:00
|
|
|
#include <linux/kconfig.h>
|
|
|
|
|
2012-09-28 08:56:35 +00:00
|
|
|
/* Flags for each bootstage record */
|
|
|
|
enum bootstage_flags {
|
|
|
|
BOOTSTAGEF_ERROR = 1 << 0, /* Error record */
|
|
|
|
BOOTSTAGEF_ALLOC = 1 << 1, /* Allocate an id */
|
|
|
|
};
|
|
|
|
|
2013-05-16 13:53:19 +00:00
|
|
|
/* bootstate sub-IDs used for kernel and ramdisk ranges */
|
|
|
|
enum {
|
|
|
|
BOOTSTAGE_SUB_FORMAT,
|
|
|
|
BOOTSTAGE_SUB_FORMAT_OK,
|
|
|
|
BOOTSTAGE_SUB_NO_UNIT_NAME,
|
|
|
|
BOOTSTAGE_SUB_UNIT_NAME,
|
|
|
|
BOOTSTAGE_SUB_SUBNODE,
|
|
|
|
|
|
|
|
BOOTSTAGE_SUB_CHECK,
|
|
|
|
BOOTSTAGE_SUB_HASH = 5,
|
|
|
|
BOOTSTAGE_SUB_CHECK_ARCH = 5,
|
|
|
|
BOOTSTAGE_SUB_CHECK_ALL,
|
|
|
|
BOOTSTAGE_SUB_GET_DATA,
|
|
|
|
BOOTSTAGE_SUB_CHECK_ALL_OK = 7,
|
|
|
|
BOOTSTAGE_SUB_GET_DATA_OK,
|
|
|
|
BOOTSTAGE_SUB_LOAD,
|
|
|
|
};
|
|
|
|
|
2012-01-14 15:24:44 +00:00
|
|
|
/*
|
|
|
|
* A list of boot stages that we know about. Each of these indicates the
|
|
|
|
* state that we are at, and the action that we are about to perform. For
|
|
|
|
* errors, we issue an error for an item when it fails. Therefore the
|
|
|
|
* normal sequence is:
|
|
|
|
*
|
|
|
|
* progress action1
|
|
|
|
* progress action2
|
|
|
|
* progress action3
|
|
|
|
*
|
|
|
|
* and an error condition where action 3 failed would be:
|
|
|
|
*
|
|
|
|
* progress action1
|
|
|
|
* progress action2
|
|
|
|
* progress action3
|
|
|
|
* error on action3
|
|
|
|
*/
|
|
|
|
enum bootstage_id {
|
2012-01-14 15:24:47 +00:00
|
|
|
BOOTSTAGE_ID_START = 0,
|
|
|
|
BOOTSTAGE_ID_CHECK_MAGIC, /* Checking image magic */
|
|
|
|
BOOTSTAGE_ID_CHECK_HEADER, /* Checking image header */
|
|
|
|
BOOTSTAGE_ID_CHECK_CHECKSUM, /* Checking image checksum */
|
|
|
|
BOOTSTAGE_ID_CHECK_ARCH, /* Checking architecture */
|
|
|
|
|
|
|
|
BOOTSTAGE_ID_CHECK_IMAGETYPE = 5,/* Checking image type */
|
|
|
|
BOOTSTAGE_ID_DECOMP_IMAGE, /* Decompressing image */
|
|
|
|
BOOTSTAGE_ID_KERNEL_LOADED, /* Kernel has been loaded */
|
|
|
|
BOOTSTAGE_ID_DECOMP_UNIMPL = 7, /* Odd decompression algorithm */
|
|
|
|
BOOTSTAGE_ID_CHECK_BOOT_OS, /* Calling OS-specific boot function */
|
|
|
|
BOOTSTAGE_ID_BOOT_OS_RETURNED, /* Tried to boot OS, but it returned */
|
|
|
|
BOOTSTAGE_ID_CHECK_RAMDISK = 9, /* Checking ram disk */
|
|
|
|
|
2011-12-10 11:07:57 +00:00
|
|
|
BOOTSTAGE_ID_RD_MAGIC, /* Checking ram disk magic */
|
|
|
|
BOOTSTAGE_ID_RD_HDR_CHECKSUM, /* Checking ram disk heder checksum */
|
|
|
|
BOOTSTAGE_ID_RD_CHECKSUM, /* Checking ram disk checksum */
|
|
|
|
BOOTSTAGE_ID_COPY_RAMDISK = 12, /* Copying ram disk into place */
|
|
|
|
BOOTSTAGE_ID_RAMDISK, /* Checking for valid ramdisk */
|
|
|
|
BOOTSTAGE_ID_NO_RAMDISK, /* No ram disk found (not an error) */
|
|
|
|
|
2012-01-14 15:24:44 +00:00
|
|
|
BOOTSTAGE_ID_RUN_OS = 15, /* Exiting U-Boot, entering OS */
|
2011-12-10 11:07:58 +00:00
|
|
|
|
|
|
|
BOOTSTAGE_ID_NEED_RESET = 30,
|
|
|
|
BOOTSTAGE_ID_POST_FAIL, /* Post failure */
|
|
|
|
BOOTSTAGE_ID_POST_FAIL_R, /* Post failure reported after reloc */
|
|
|
|
|
|
|
|
/*
|
2015-02-02 13:25:08 +00:00
|
|
|
* This set is reported only by x86, and the meaning is different. In
|
2011-12-10 11:07:58 +00:00
|
|
|
* this case we are reporting completion of a particular stage.
|
2015-02-02 13:25:08 +00:00
|
|
|
* This should probably change in the x86 code (which doesn't report
|
2011-12-10 11:07:58 +00:00
|
|
|
* errors in any case), but discussion this can perhaps wait until we
|
|
|
|
* have a generic board implementation.
|
|
|
|
*/
|
|
|
|
BOOTSTAGE_ID_BOARD_INIT_R, /* We have relocated */
|
|
|
|
BOOTSTAGE_ID_BOARD_GLOBAL_DATA, /* Global data is set up */
|
|
|
|
|
|
|
|
BOOTSTAGE_ID_BOARD_INIT_SEQ, /* We completed the init sequence */
|
|
|
|
BOOTSTAGE_ID_BOARD_FLASH, /* We have configured flash banks */
|
|
|
|
BOOTSTAGE_ID_BOARD_FLASH_37, /* In case you didn't hear... */
|
|
|
|
BOOTSTAGE_ID_BOARD_ENV, /* Environment is relocated & ready */
|
|
|
|
BOOTSTAGE_ID_BOARD_PCI, /* PCI is up */
|
|
|
|
|
|
|
|
BOOTSTAGE_ID_BOARD_INTERRUPTS, /* Exceptions / interrupts ready */
|
|
|
|
BOOTSTAGE_ID_BOARD_DONE, /* Board init done, off to main loop */
|
|
|
|
/* ^^^ here ends the x86 sequence */
|
|
|
|
|
2011-12-10 11:07:59 +00:00
|
|
|
/* Boot stages related to loading a kernel from an IDE device */
|
|
|
|
BOOTSTAGE_ID_IDE_START = 41,
|
|
|
|
BOOTSTAGE_ID_IDE_ADDR,
|
|
|
|
BOOTSTAGE_ID_IDE_BOOT_DEVICE,
|
|
|
|
BOOTSTAGE_ID_IDE_TYPE,
|
|
|
|
|
|
|
|
BOOTSTAGE_ID_IDE_PART,
|
|
|
|
BOOTSTAGE_ID_IDE_PART_INFO,
|
|
|
|
BOOTSTAGE_ID_IDE_PART_TYPE,
|
|
|
|
BOOTSTAGE_ID_IDE_PART_READ,
|
|
|
|
BOOTSTAGE_ID_IDE_FORMAT,
|
|
|
|
|
|
|
|
BOOTSTAGE_ID_IDE_CHECKSUM, /* 50 */
|
|
|
|
BOOTSTAGE_ID_IDE_READ,
|
2011-12-10 11:08:00 +00:00
|
|
|
|
|
|
|
/* Boot stages related to loading a kernel from an NAND device */
|
|
|
|
BOOTSTAGE_ID_NAND_PART,
|
|
|
|
BOOTSTAGE_ID_NAND_SUFFIX,
|
|
|
|
BOOTSTAGE_ID_NAND_BOOT_DEVICE,
|
|
|
|
BOOTSTAGE_ID_NAND_HDR_READ = 55,
|
|
|
|
BOOTSTAGE_ID_NAND_AVAILABLE = 55,
|
|
|
|
BOOTSTAGE_ID_NAND_TYPE = 57,
|
|
|
|
BOOTSTAGE_ID_NAND_READ,
|
|
|
|
|
2012-01-14 15:24:52 +00:00
|
|
|
/* Boot stages related to loading a kernel from an network device */
|
|
|
|
BOOTSTAGE_ID_NET_CHECKSUM = 60,
|
|
|
|
BOOTSTAGE_ID_NET_ETH_START = 64,
|
|
|
|
BOOTSTAGE_ID_NET_ETH_INIT,
|
|
|
|
|
|
|
|
BOOTSTAGE_ID_NET_START = 80,
|
|
|
|
BOOTSTAGE_ID_NET_NETLOOP_OK,
|
|
|
|
BOOTSTAGE_ID_NET_LOADED,
|
|
|
|
BOOTSTAGE_ID_NET_DONE_ERR,
|
|
|
|
BOOTSTAGE_ID_NET_DONE,
|
|
|
|
|
2013-05-16 13:53:19 +00:00
|
|
|
BOOTSTAGE_ID_FIT_FDT_START = 90,
|
2011-12-10 11:08:02 +00:00
|
|
|
/*
|
|
|
|
* Boot stages related to loading a FIT image. Some of these are a
|
|
|
|
* bit wonky.
|
|
|
|
*/
|
2013-05-16 13:53:19 +00:00
|
|
|
BOOTSTAGE_ID_FIT_KERNEL_START = 100,
|
2013-05-16 13:53:27 +00:00
|
|
|
|
|
|
|
BOOTSTAGE_ID_FIT_CONFIG = 110,
|
2011-12-10 11:08:02 +00:00
|
|
|
BOOTSTAGE_ID_FIT_TYPE,
|
2013-05-16 13:53:27 +00:00
|
|
|
BOOTSTAGE_ID_FIT_KERNEL_INFO,
|
2011-12-10 11:08:02 +00:00
|
|
|
|
|
|
|
BOOTSTAGE_ID_FIT_COMPRESSION,
|
|
|
|
BOOTSTAGE_ID_FIT_OS,
|
|
|
|
BOOTSTAGE_ID_FIT_LOADADDR,
|
|
|
|
BOOTSTAGE_ID_OVERWRITTEN,
|
|
|
|
|
2013-05-16 13:53:19 +00:00
|
|
|
/* Next 10 IDs used by BOOTSTAGE_SUB_... */
|
|
|
|
BOOTSTAGE_ID_FIT_RD_START = 120, /* Ramdisk stages */
|
2011-12-10 11:08:02 +00:00
|
|
|
|
2014-10-20 03:11:24 +00:00
|
|
|
/* Next 10 IDs used by BOOTSTAGE_SUB_... */
|
|
|
|
BOOTSTAGE_ID_FIT_SETUP_START = 130, /* x86 setup stages */
|
|
|
|
|
2011-12-10 11:08:00 +00:00
|
|
|
BOOTSTAGE_ID_IDE_FIT_READ = 140,
|
|
|
|
BOOTSTAGE_ID_IDE_FIT_READ_OK,
|
|
|
|
|
|
|
|
BOOTSTAGE_ID_NAND_FIT_READ = 150,
|
|
|
|
BOOTSTAGE_ID_NAND_FIT_READ_OK,
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
|
2015-05-21 13:52:48 +00:00
|
|
|
BOOTSTAGE_ID_FIT_LOADABLE_START = 160, /* for Loadable Images */
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
/*
|
|
|
|
* These boot stages are new, higher level, and not directly related
|
|
|
|
* to the old boot progress numbers. They are useful for recording
|
|
|
|
* rough boot timing information.
|
|
|
|
*/
|
|
|
|
BOOTSTAGE_ID_AWAKE,
|
bootstage: Mark the start/end of TPL and SPL separately
At present bootstage in TPL and SPL use the same ID so it is not possible
to see the timing of each. Separate out the IDs and use the correct one
depending on which phase we are at.
Example output:
Timer summary in microseconds (14 records):
Mark Elapsed Stage
0 0 reset
224,787 224,787 TPL
282,248 57,461 end TPL
341,067 58,819 SPL
925,436 584,369 end SPL
931,710 6,274 board_init_f
1,035,482 103,772 board_init_r
1,387,852 352,370 main_loop
1,387,911 59 id=175
Accumulated time:
196 dm_r
8,300 dm_spl
14,139 dm_f
229,121 fsp-m
262,992 fsp-s
Signed-off-by: Simon Glass <sjg@chromium.org>
2019-10-21 23:26:51 +00:00
|
|
|
BOOTSTAGE_ID_START_TPL,
|
|
|
|
BOOTSTAGE_ID_END_TPL,
|
2012-09-28 08:56:40 +00:00
|
|
|
BOOTSTAGE_ID_START_SPL,
|
2017-05-22 11:05:35 +00:00
|
|
|
BOOTSTAGE_ID_END_SPL,
|
2022-04-30 06:56:52 +00:00
|
|
|
BOOTSTAGE_ID_START_VPL,
|
|
|
|
BOOTSTAGE_ID_END_VPL,
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
BOOTSTAGE_ID_START_UBOOT_F,
|
|
|
|
BOOTSTAGE_ID_START_UBOOT_R,
|
|
|
|
BOOTSTAGE_ID_USB_START,
|
|
|
|
BOOTSTAGE_ID_ETH_START,
|
|
|
|
BOOTSTAGE_ID_BOOTP_START,
|
|
|
|
BOOTSTAGE_ID_BOOTP_STOP,
|
|
|
|
BOOTSTAGE_ID_BOOTM_START,
|
|
|
|
BOOTSTAGE_ID_BOOTM_HANDOFF,
|
|
|
|
BOOTSTAGE_ID_MAIN_LOOP,
|
2019-04-12 10:37:03 +00:00
|
|
|
BOOTSTAGE_ID_ENTER_CLI_LOOP,
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
BOOTSTAGE_KERNELREAD_START,
|
|
|
|
BOOTSTAGE_KERNELREAD_STOP,
|
2012-09-28 08:56:40 +00:00
|
|
|
BOOTSTAGE_ID_BOARD_INIT,
|
|
|
|
BOOTSTAGE_ID_BOARD_INIT_DONE,
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
|
|
|
|
BOOTSTAGE_ID_CPU_AWAKE,
|
|
|
|
BOOTSTAGE_ID_MAIN_CPU_AWAKE,
|
|
|
|
BOOTSTAGE_ID_MAIN_CPU_READY,
|
|
|
|
|
2012-09-28 08:56:40 +00:00
|
|
|
BOOTSTAGE_ID_ACCUM_LCD,
|
2015-01-28 05:13:44 +00:00
|
|
|
BOOTSTAGE_ID_ACCUM_SCSI,
|
2015-05-04 17:30:56 +00:00
|
|
|
BOOTSTAGE_ID_ACCUM_SPI,
|
|
|
|
BOOTSTAGE_ID_ACCUM_DECOMP,
|
2017-05-22 11:05:36 +00:00
|
|
|
BOOTSTAGE_ID_ACCUM_OF_LIVE,
|
2016-05-17 12:03:50 +00:00
|
|
|
BOOTSTAGE_ID_FPGA_INIT,
|
2020-05-10 17:39:59 +00:00
|
|
|
BOOTSTAGE_ID_ACCUM_DM_SPL,
|
|
|
|
BOOTSTAGE_ID_ACCUM_DM_F,
|
|
|
|
BOOTSTAGE_ID_ACCUM_DM_R,
|
|
|
|
BOOTSTAGE_ID_ACCUM_FSP_M,
|
|
|
|
BOOTSTAGE_ID_ACCUM_FSP_S,
|
2019-12-07 04:42:18 +00:00
|
|
|
BOOTSTAGE_ID_ACCUM_MMAP_SPI,
|
2012-09-28 08:56:40 +00:00
|
|
|
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
/* a few spare for the user, from here */
|
|
|
|
BOOTSTAGE_ID_USER,
|
|
|
|
BOOTSTAGE_ID_ALLOC,
|
2012-01-14 15:24:44 +00:00
|
|
|
};
|
|
|
|
|
2012-04-05 12:05:17 +00:00
|
|
|
/*
|
|
|
|
* Return the time since boot in microseconds, This is needed for bootstage
|
|
|
|
* and should be defined in CPU- or board-specific code. If undefined then
|
2017-05-22 11:05:23 +00:00
|
|
|
* you will get a link error.
|
2012-04-05 12:05:17 +00:00
|
|
|
*/
|
|
|
|
ulong timer_get_boot_us(void);
|
|
|
|
|
2021-10-23 01:06:03 +00:00
|
|
|
#if defined(USE_HOSTCC) || !CONFIG_IS_ENABLED(SHOW_BOOT_PROGRESS)
|
2016-06-07 06:31:20 +00:00
|
|
|
#define show_boot_progress(val) do {} while (0)
|
|
|
|
#else
|
2017-05-22 11:05:26 +00:00
|
|
|
/**
|
2012-01-14 15:24:44 +00:00
|
|
|
* Board code can implement show_boot_progress() if needed.
|
|
|
|
*
|
|
|
|
* @param val Progress state (enum bootstage_id), or -id if an error
|
|
|
|
* has occurred.
|
|
|
|
*/
|
|
|
|
void show_boot_progress(int val);
|
2012-09-18 00:22:50 +00:00
|
|
|
#endif
|
2012-02-13 13:51:18 +00:00
|
|
|
|
2017-05-22 11:05:35 +00:00
|
|
|
#if !defined(USE_HOSTCC)
|
|
|
|
#if CONFIG_IS_ENABLED(BOOTSTAGE)
|
|
|
|
#define ENABLE_BOOTSTAGE
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef ENABLE_BOOTSTAGE
|
|
|
|
|
2012-02-13 13:51:18 +00:00
|
|
|
/* This is the full bootstage implementation */
|
|
|
|
|
2013-04-17 16:13:41 +00:00
|
|
|
/**
|
|
|
|
* Relocate existing bootstage records
|
|
|
|
*
|
|
|
|
* Call this after relocation has happened and after malloc has been initted.
|
|
|
|
* We need to copy any pointers in bootstage records that were added pre-
|
2017-05-22 11:05:26 +00:00
|
|
|
* relocation, since memory can be overwritten later.
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: Always returns 0, to indicate success
|
2013-04-17 16:13:41 +00:00
|
|
|
*/
|
|
|
|
int bootstage_relocate(void);
|
|
|
|
|
2012-09-28 08:56:35 +00:00
|
|
|
/**
|
|
|
|
* Add a new bootstage record
|
|
|
|
*
|
|
|
|
* @param id Bootstage ID to use (ignored if flags & BOOTSTAGEF_ALLOC)
|
|
|
|
* @param name Name of record, or NULL for none
|
|
|
|
* @param flags Flags (BOOTSTAGEF_...)
|
|
|
|
* @param mark Time to record in this record, in microseconds
|
|
|
|
*/
|
|
|
|
ulong bootstage_add_record(enum bootstage_id id, const char *name,
|
|
|
|
int flags, ulong mark);
|
|
|
|
|
2017-05-22 11:05:26 +00:00
|
|
|
/**
|
2012-02-13 13:51:18 +00:00
|
|
|
* Mark a time stamp for the current boot stage.
|
|
|
|
*/
|
bootstage: Show func name for bootstage_mark/error
bootstage_mark() and bootstate_error() are not recording any name and in
report it is showing as id=<value>. That's not useful and it is better to
show function name which calls it.
That's why use macros with passing __func__ as recorded name for bootstage.
Origin report looks like this:
ZynqMP> bootstage report
Timer summary in microseconds (10 records):
Mark Elapsed Stage
0 0 reset
2,482,383 2,482,383 board_init_f
4,278,821 1,796,438 board_init_r
4,825,331 546,510 id=64
4,858,409 33,078 id=65
4,862,382 3,973 main_loop
4,921,713 59,331 usb_start
9,345,345 4,423,632 id=175
When this patch is applied.
ZynqMP> bootstage report
Timer summary in microseconds (31 records):
Mark Elapsed Stage
0 0 reset
2,465,624 2,465,624 board_init_f
4,278,628 1,813,004 board_init_r
4,825,139 546,511 eth_common_init
4,858,228 33,089 eth_initialize
4,862,201 3,973 main_loop
4,921,530 59,329 usb_start
8,885,334 3,963,804 cli_loop
Signed-off-by: Michal Simek <michal.simek@amd.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
2022-08-12 08:54:51 +00:00
|
|
|
#define bootstage_mark(id) bootstage_mark_name(id, __func__)
|
|
|
|
#define bootstage_error(id) bootstage_error_name(id, __func__)
|
2012-02-13 13:51:18 +00:00
|
|
|
|
bootstage: Show func name for bootstage_mark/error
bootstage_mark() and bootstate_error() are not recording any name and in
report it is showing as id=<value>. That's not useful and it is better to
show function name which calls it.
That's why use macros with passing __func__ as recorded name for bootstage.
Origin report looks like this:
ZynqMP> bootstage report
Timer summary in microseconds (10 records):
Mark Elapsed Stage
0 0 reset
2,482,383 2,482,383 board_init_f
4,278,821 1,796,438 board_init_r
4,825,331 546,510 id=64
4,858,409 33,078 id=65
4,862,382 3,973 main_loop
4,921,713 59,331 usb_start
9,345,345 4,423,632 id=175
When this patch is applied.
ZynqMP> bootstage report
Timer summary in microseconds (31 records):
Mark Elapsed Stage
0 0 reset
2,465,624 2,465,624 board_init_f
4,278,628 1,813,004 board_init_r
4,825,139 546,511 eth_common_init
4,858,228 33,089 eth_initialize
4,862,201 3,973 main_loop
4,921,530 59,329 usb_start
8,885,334 3,963,804 cli_loop
Signed-off-by: Michal Simek <michal.simek@amd.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
2022-08-12 08:54:51 +00:00
|
|
|
/**
|
|
|
|
* bootstage_mark_name - record bootstage with passing id and name
|
|
|
|
* @id: Bootstage id to record this timestamp against
|
|
|
|
* @name: Textual name to display for this id in the report
|
|
|
|
*
|
|
|
|
* Return: recorded time stamp
|
|
|
|
*/
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
ulong bootstage_mark_name(enum bootstage_id id, const char *name);
|
|
|
|
|
bootstage: Show func name for bootstage_mark/error
bootstage_mark() and bootstate_error() are not recording any name and in
report it is showing as id=<value>. That's not useful and it is better to
show function name which calls it.
That's why use macros with passing __func__ as recorded name for bootstage.
Origin report looks like this:
ZynqMP> bootstage report
Timer summary in microseconds (10 records):
Mark Elapsed Stage
0 0 reset
2,482,383 2,482,383 board_init_f
4,278,821 1,796,438 board_init_r
4,825,331 546,510 id=64
4,858,409 33,078 id=65
4,862,382 3,973 main_loop
4,921,713 59,331 usb_start
9,345,345 4,423,632 id=175
When this patch is applied.
ZynqMP> bootstage report
Timer summary in microseconds (31 records):
Mark Elapsed Stage
0 0 reset
2,465,624 2,465,624 board_init_f
4,278,628 1,813,004 board_init_r
4,825,139 546,511 eth_common_init
4,858,228 33,089 eth_initialize
4,862,201 3,973 main_loop
4,921,530 59,329 usb_start
8,885,334 3,963,804 cli_loop
Signed-off-by: Michal Simek <michal.simek@amd.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
2022-08-12 08:54:51 +00:00
|
|
|
/**
|
|
|
|
* bootstage_error_name - record bootstage error with passing id and name
|
|
|
|
* @id: Bootstage id to record this timestamp against
|
|
|
|
* @name: Textual name to display for this id in the report
|
|
|
|
*
|
|
|
|
* Return: recorded time stamp
|
|
|
|
*/
|
|
|
|
ulong bootstage_error_name(enum bootstage_id id, const char *name);
|
|
|
|
|
2013-04-17 16:13:44 +00:00
|
|
|
/**
|
|
|
|
* Mark a time stamp in the given function and line number
|
|
|
|
*
|
|
|
|
* See BOOTSTAGE_MARKER() for a convenient macro.
|
|
|
|
*
|
|
|
|
* @param file Filename to record (NULL if none)
|
|
|
|
* @param func Function name to record
|
|
|
|
* @param linenum Line number to record
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: recorded time stamp
|
2013-04-17 16:13:44 +00:00
|
|
|
*/
|
|
|
|
ulong bootstage_mark_code(const char *file, const char *func,
|
|
|
|
int linenum);
|
|
|
|
|
2012-09-28 08:56:36 +00:00
|
|
|
/**
|
|
|
|
* Mark the start of a bootstage activity. The end will be marked later with
|
|
|
|
* bootstage_accum() and at that point we accumulate the time taken. Calling
|
|
|
|
* this function turns the given id into a accumulator rather than and
|
|
|
|
* absolute mark in time. Accumulators record the total amount of time spent
|
|
|
|
* in an activty during boot.
|
|
|
|
*
|
|
|
|
* @param id Bootstage id to record this timestamp against
|
|
|
|
* @param name Textual name to display for this id in the report (maybe NULL)
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: start timestamp in microseconds
|
2012-09-28 08:56:36 +00:00
|
|
|
*/
|
|
|
|
uint32_t bootstage_start(enum bootstage_id id, const char *name);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Mark the end of a bootstage activity
|
|
|
|
*
|
|
|
|
* After previously marking the start of an activity with bootstage_start(),
|
|
|
|
* call this function to mark the end. You can call these functions in pairs
|
|
|
|
* as many times as you like.
|
|
|
|
*
|
|
|
|
* @param id Bootstage id to record this timestamp against
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: time spent in this iteration of the activity (i.e. the time now
|
2012-09-28 08:56:36 +00:00
|
|
|
* less the start time recorded in the last bootstage_start() call
|
|
|
|
* with this id.
|
|
|
|
*/
|
|
|
|
uint32_t bootstage_accum(enum bootstage_id id);
|
|
|
|
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
/* Print a report about boot time */
|
|
|
|
void bootstage_report(void);
|
|
|
|
|
2012-09-28 08:56:37 +00:00
|
|
|
/**
|
|
|
|
* Add bootstage information to the device tree
|
|
|
|
*
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: 0 if ok, -ve on error
|
2012-09-28 08:56:37 +00:00
|
|
|
*/
|
|
|
|
int bootstage_fdt_add_report(void);
|
|
|
|
|
2017-05-22 11:05:26 +00:00
|
|
|
/**
|
2012-09-28 08:56:38 +00:00
|
|
|
* Stash bootstage data into memory
|
|
|
|
*
|
|
|
|
* @param base Base address of memory buffer
|
|
|
|
* @param size Size of memory buffer
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: 0 if stashed ok, -1 if out of space
|
2012-09-28 08:56:38 +00:00
|
|
|
*/
|
|
|
|
int bootstage_stash(void *base, int size);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Read bootstage data from memory
|
|
|
|
*
|
|
|
|
* Bootstage data is read from memory and placed in the bootstage table
|
|
|
|
* in the user records.
|
|
|
|
*
|
|
|
|
* @param base Base address of memory buffer
|
|
|
|
* @param size Size of memory buffer (-1 if unknown)
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: 0 if unstashed ok, -ENOENT if bootstage info not found, -ENOSPC if
|
2020-07-03 16:37:07 +00:00
|
|
|
* there is not space for read the stashed data, or other error if
|
2017-05-22 11:05:33 +00:00
|
|
|
* something else went wrong
|
2012-09-28 08:56:38 +00:00
|
|
|
*/
|
2017-05-22 11:05:34 +00:00
|
|
|
int bootstage_unstash(const void *base, int size);
|
2012-09-28 08:56:38 +00:00
|
|
|
|
2017-05-22 11:05:30 +00:00
|
|
|
/**
|
|
|
|
* bootstage_get_size() - Get the size of the bootstage data
|
|
|
|
*
|
2022-01-19 17:05:50 +00:00
|
|
|
* Return: size of boostage data in bytes
|
2017-05-22 11:05:30 +00:00
|
|
|
*/
|
|
|
|
int bootstage_get_size(void);
|
|
|
|
|
2017-05-22 11:05:25 +00:00
|
|
|
/**
|
|
|
|
* bootstage_init() - Prepare bootstage for use
|
|
|
|
*
|
|
|
|
* @first: true if this is the first time bootstage is set up. This causes it
|
|
|
|
* to add a 'reset' record with a time of 0.
|
|
|
|
*/
|
|
|
|
int bootstage_init(bool first);
|
|
|
|
|
2012-02-13 13:51:18 +00:00
|
|
|
#else
|
2013-04-17 16:13:40 +00:00
|
|
|
static inline ulong bootstage_add_record(enum bootstage_id id,
|
|
|
|
const char *name, int flags, ulong mark)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-02-13 13:51:18 +00:00
|
|
|
/*
|
|
|
|
* This is a dummy implementation which just calls show_boot_progress(),
|
|
|
|
* and won't even do that unless CONFIG_SHOW_BOOT_PROGRESS is defined
|
|
|
|
*/
|
|
|
|
|
2013-04-17 16:13:41 +00:00
|
|
|
static inline int bootstage_relocate(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-02-13 13:51:18 +00:00
|
|
|
static inline ulong bootstage_mark(enum bootstage_id id)
|
|
|
|
{
|
|
|
|
show_boot_progress(id);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline ulong bootstage_error(enum bootstage_id id)
|
2011-12-10 11:07:55 +00:00
|
|
|
{
|
2012-02-13 13:51:18 +00:00
|
|
|
show_boot_progress(-id);
|
|
|
|
return 0;
|
2011-12-10 11:07:55 +00:00
|
|
|
}
|
2012-01-14 15:24:44 +00:00
|
|
|
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
static inline ulong bootstage_mark_name(enum bootstage_id id, const char *name)
|
|
|
|
{
|
2013-08-05 14:00:36 +00:00
|
|
|
show_boot_progress(id);
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-04-17 16:13:44 +00:00
|
|
|
static inline ulong bootstage_mark_code(const char *file, const char *func,
|
|
|
|
int linenum)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-04-17 16:13:40 +00:00
|
|
|
static inline uint32_t bootstage_start(enum bootstage_id id, const char *name)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint32_t bootstage_accum(enum bootstage_id id)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-28 08:56:38 +00:00
|
|
|
static inline int bootstage_stash(void *base, int size)
|
|
|
|
{
|
|
|
|
return 0; /* Pretend to succeed */
|
|
|
|
}
|
bootstage: Implement core microsecond boot time measurement
This defines the basics of a new boot time measurement feature. This allows
logging of very accurate time measurements as the boot proceeds, by using
an available microsecond counter.
To enable the feature, define CONFIG_BOOTSTAGE in your board config file.
Also available is CONFIG_BOOTSTAGE_REPORT which will cause a report to be
printed just before handing off to the OS.
Most IDs are not named at this stage. For that I would first like to
renumber them all.
Timer summary in microseconds:
Mark Elapsed Stage
0 0 reset
205,000 205,000 board_init_f
6,053,000 5,848,000 bootm_start
6,053,000 0 id=1
6,058,000 5,000 id=101
6,058,000 0 id=100
6,061,000 3,000 id=103
6,064,000 3,000 id=104
6,093,000 29,000 id=107
6,093,000 0 id=106
6,093,000 0 id=105
6,093,000 0 id=108
7,089,000 996,000 id=7
7,089,000 0 id=15
7,089,000 0 id=8
7,097,000 8,000 start_kernel
Signed-off-by: Simon Glass <sjg@chromium.org>
2012-02-13 13:51:19 +00:00
|
|
|
|
2017-05-22 11:05:34 +00:00
|
|
|
static inline int bootstage_unstash(const void *base, int size)
|
2012-09-28 08:56:38 +00:00
|
|
|
{
|
|
|
|
return 0; /* Pretend to succeed */
|
|
|
|
}
|
2017-05-22 11:05:25 +00:00
|
|
|
|
2017-05-22 11:05:30 +00:00
|
|
|
static inline int bootstage_get_size(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-05-22 11:05:25 +00:00
|
|
|
static inline int bootstage_init(bool first)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2017-05-22 11:05:35 +00:00
|
|
|
|
|
|
|
#endif /* ENABLE_BOOTSTAGE */
|
2012-02-13 13:51:18 +00:00
|
|
|
|
2013-04-17 16:13:44 +00:00
|
|
|
/* Helper macro for adding a bootstage to a line of code */
|
|
|
|
#define BOOTSTAGE_MARKER() \
|
|
|
|
bootstage_mark_code(__FILE__, __func__, __LINE__)
|
|
|
|
|
2012-01-14 15:24:44 +00:00
|
|
|
#endif
|