AM6254 Embedded Platform: Optimization Scheme for Shortening U-boot Boot Time

Introduction to the U-Boot boot process

U-Boot Boot Process Stage 1

Main process Partial Hardware Initialization -> Load Full U-Boot into RAM -> Jump to Stage 2 Entry for Execution.

Files Used Mainly in Stage 1 (Non-Open Source Scenario):

  • start.S (Hardware Initialization, watchdog, interrupts, clock configurations)
  • lowlevel_init.S (RAM (DDR) initialization, U-Boot code loading, stack setup, BSS clearing, jump to U-Boot Stage 2

U-Boot Boot Process Stage 2

Stage 2 involves further hardware initialization by U-Boot, configuring command line parameters and environment variables, and transitioning to the kernel.

The main documents used are:

  • board.c file: Typically, our own files are located in the board/forlinx/ directory.
  • main.c file: Located in the common directory

Main function

Some of the more important initialisation functions are as follows:

1.''setup_mon_len'' function: Set the ''gd'' structure's ''mon_len'' member variable, representing the length of the entire code;

2.''initf_malloc'' function: Sets the ''gd '' structure's member variables related to ''malloc'';

3.''board_early_init_f''function;

4.To initialize the IO configuration of the serial port, defined in the board/freescale/mx6ull_toto/mx6ull_toto.cfile;

5.''timer_init'' function: Initialize the kernel timer to provide clock ticks for U-Boot, defined in the ''arch/arm/imxcommon/timer.c''file;

6.''get_clocks'' function: Retrieve the clock for the SD card peripheral (sdhc_clk), defined in the arch/arm/imxcommon/speed.c file;

7.''init_baud_rate'' function: Initialize the baud rate, defined in the ''common/board_f.c'' file.

8.''serial_init'' function: Initialize serial communication settings, defined in the''drivers/serial/serial.c''file;

9.''console_init_f'' function: Initialize the console, defined in the ''common/console.c'' file;

10.''display_options'' function: Print U-Boot version information and compilation details, defined in the lib/display_options.c file;

11.''print_cpuinfo'' function: To display CPU information and the main clock frequency, defined in the arch/arm/imx-common/cpu.c file;

12.''show_board_info'' function: Print development board information, defined in the common/board _ info.c file;

13.''init_func_i2c'' function: To initialize I2C;

14.''announce_dram_init'' function: This function is simple, it outputs the string "DRAM:";

15.''dram_init'' function: Doesn't actually initialize DDR but rather sets the value of gd->ram_size.

AM6254 Embedded Platform: Optimization Scheme for Shortening U-boot Boot Time

Current U-boot startup print information

U-Boot SPL 2021.01-gd1345267-dirty (Jul 08 2023 - 08:00:49 +0800)
SYSFW ABI: 3.1 (firmware rev 0x0015 '21.5.1--w2022.07-am62x (Terrifi')
am625_init: board_init_f done(counter=1)
SPL initial stack usage: 13768 bytes
i2c_write: error waiting for data ACK (status=0x116)
i2c_write: error waiting for data ACK (status=0x116)
Auth Success!
normal mode
am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9 bootindex = 0
Trying to boot from MMC1
am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9 bootindex = 0
Loading Environment from MMC... MMC: block number 0x3500 exceeds max(0x2000)
*** Warning - !read failed, using default environment
am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9 bootindex = 0
am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9 bootindex = 0
init_env from device 9 not supported!
Starting ATF on ARM64 core...
NOTICE:  BL31: v2.5(release):v0.6-6-gd489c56b
NOTICE:  BL31: Built : 15:08:18, Jun 26 2023
U-Boot SPL 2021.01-gd1345267-dirty (Jul 08 2023 - 08:00:56 +0800)
SYSFW ABI: 3.1 (firmware rev 0x0015 '21.5.1--w2022.07-am62x (Terrifi')
am625_init: board_init_f done
am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9 bootindex = 0
Trying to boot from MMC1
am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9 bootindex = 0
U-Boot 2021.01-gd1345267-dirty (Jul 08 2023 - 08:00:56 +0800)
SoC: AM62X SR1.0
Model: Forlinx OK62xx-C board
DRAM: 2 GiB
MMC: mmc@fa10000: 0, mmc@fa00000: 1
Loading Environment from MMC... OK
In: serial@2800000
Out: serial@2800000
Err: serial@2800000
52334 bytes read in 5 ms (10 MiB/s)
Saving Environment to MMC... Writing to MMC(0)... OK
Net: eth0: ethernet@8000000
Autoboot in 1 seconds
switch to partitions #0, OK
mmc0(part 0) is current device
SD/MMC found on device 0
Failed to load 'boot.scr'
Failed to load 'uEnv.txt'
MMC: no card present
20208128 bytes read in 111 ms (173.6 MiB/s)
52334 bytes read in 5 ms (10 MiB/s)
4595 bytes read in 5 ms (897.5 KiB/s)
## Flattened Device Tree blob at 88000000
Booting using the fdt blob at 0x88000000
Loading Device Tree to 000000008fef0000, end 000000008fffffff ... OK

U-boot shortens 2 seconds of boot time by disabling USB and Ethernet via defconfig.Modify the autoboot.c file to hardcode bootdelay=0, reducing it by 1 second.

diff --git a/common/autoboot.c b/common/autoboot.c
index e628baff..685779b6 100644
--- a/common/autoboot.c
+++ b/common/autoboot.c
@@ -328,10 +328,11 @@ const char *bootdelay_process(void)
int bootdelay;
bootcount_inc();
-
+/*
s = env_get("bootdelay");
bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;
-
+*/
+bootdelay = 0;
if (IS_ENABLED(CONFIG_OF_CONTROL))
bootdelay = fdtdec_get_config_int(gd->fdt_blob, "bootdelay",
bootdelay);

Comment out the function that reads uEnv.txt file.

Remove useless printed information.

Cropped Log

16:33:00:290 U-Boot SPL 2021.01-gd1345267-dirty (Jul 25 2023 - 16:14:18
+0800)
16:33:00:303 SYSFW ABI: 3.1 (firmware rev 0x0015 '21.5.1--w2022.07-am62x
(Terrifi')
16:33:00:351 am625_init: board_init_f done(counter=1)
16:33:00:351 SPL initial stack usage: 13768 bytes
16:33:01:527 i2c_write: error waiting for data ACK (status=0x116)
16:33:01:527 i2c_write: error waiting for data ACK (status=0x116)
16:33:01:527 Auth Success!
16:33:01:544 normal mode
16:33:01:544 am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9
bootindex = 0
16:33:01:544 Trying to boot from MMC1
16:33:01:729 Loading Environment from MMC... MMC: block number 0x3500 exceeds
max(0x2000)
16:33:01:749 *** Warning - !read failed, using default environment
16:33:01:749
16:33:01:776 am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9
bootindex = 0
16:33:01:795 am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9
bootindex = 0
16:33:01:795 init_env from device 9 not supported!
16:33:01:795 Starting ATF on ARM64 core...
16:33:01:795
16:33:01:812 NOTICE: BL31: v2.5(release):v0.6-6-gd489c56b
16:33:01:812 NOTICE: BL31: Built : 15:08:18, Jun 26 2023
16:33:02:990
16:33:02:997 U-Boot SPL 2021.01-gd1345267-dirty (Jul 25 2023 - 16:14:43
+0800)
16:33:02:997 SYSFW ABI: 3.1 (firmware rev 0x0015 '21.5.1--w2022.07-am62x
(Terrifi')
16:33:02:997 am625_init: board_init_f done
16:33:03:022 am625_init: spl_boot_device: devstat = 0x1843 bootmedia = 0x9
bootindex = 0
16:33:03:022 Trying to boot from MMC1
16:33:04:507
16:33:04:507
16:33:04:507 U-Boot 2021.01-gd1345267-dirty (Jul 25 2023 - 16:14:43 +0800)
16:33:04:507
16:33:04:507 SoC: AM62X SR1.0
16:33:04:508 Model: Forlinx OK62xx-C board
16:33:04:530 DRAM: 1 GiB
16:33:04:593 MMC: mmc@fa10000: 0, mmc@fa00000: 1
16:33:04:640 Loading Environment from MMC... OK
16:33:04:640 In: serial@2800000
16:33:04:640 Out: serial@2800000
16:33:04:640 Err: serial@2800000
16:33:04:654 51701 bytes read in 6 ms (8.2 MiB/s)
16:33:04:654 using kernel dtb display control
16:33:04:685 Saving Environment to MMC... Writing to MMC(0)... OK
16:33:04:701 Net: eth0: ethernet@8000000
16:33:04:701 Autoboot in 0 seconds
16:33:04:748 switch to partitions #0, OK
16:33:04:748 mmc0(part 0) is current device
16:33:04:795 SD/MMC found on device 0
16:33:05:104 3229642 bytes read in 141 ms (21.8 MiB/s)
16:33:05:228 20075008 bytes read in 111 ms (172.5 MiB/s)
16:33:05:228 51701 bytes read in 6 ms (8.2 MiB/s)
16:33:05:244 4575 bytes read in 5 ms (893.6 KiB/s)
16:33:05:285 ## Flattened Device Tree blob at 88000000
16:33:05:285 Booting using the fdt blob at 0x88000000
16:33:05:306 Loading Device Tree to 000000008fef0000, end 000000008fffffff
... OK
16:33:05:306
16:33:05:306 Starting kernel ...