Skip to content

Instantly share code, notes, and snippets.

@stvhay
Last active February 21, 2023 10:47
Show Gist options
  • Save stvhay/829b5576b9a6149153865a0e34e77b4f to your computer and use it in GitHub Desktop.
Save stvhay/829b5576b9a6149153865a0e34e77b4f to your computer and use it in GitHub Desktop.
A messy analysis of U-boot's default_bootcmd for Rockchip SOCs

U-boot Environment

# Top Level boot command
bootcmd=run distro_bootcmd;boot_android ${devtype} ${devnum};boot_fit;bootrkp;

# Calls distro_bootcmd
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done

# Boot targets
boot_targets=nvme mmc1 mmc0 mtd2 mtd1 mtd0 usb0 pxe dhcp

# Interested in the mmc1 boot target
bootcmd_nvme=pci enum;nvme scan;setenv devnum 0;run nvme_boot;
bootcmd_mmc1=setenv devnum 1; run mmc_boot
bootcmd_mmc0=setenv devnum 0; run mmc_boot
bootcmd_mtd2=setenv devnum 2; run mtd_boot
bootcmd_mtd1=setenv devnum 1; run mtd_boot
bootcmd_mtd0=setenv devnum 0; run mtd_boot
bootcmd_usb0=setenv devnum 0; run usb_boot
bootcmd_pxe=run boot_net_usb_start; run boot_net_pci_enum; dhcp; if pxe get; then pxe boot; fi
bootcmd_dhcp=run boot_net_usb_start; run boot_net_pci_enum; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;

# Calls scan_def_for_boot_part
mmc_boot=if mmc dev ${devnum}; then setenv devtype mmc; run scan_dev_for_boot_part; fi

# Calls scan_dev_for_boot
scan_dev_for_boot_part=
	part list ${devtype} ${devnum} -bootable devplist; 
	env exists devplist || setenv devplist 1;
	for distro_bootpart in ${devplist}; do 
		if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then 
			run scan_dev_for_boot; 
		fi; 
	done

# Interested in extlinux
scan_dev_for_boot=
	echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; 
	for prefix in ${boot_prefixes}; do 
		run scan_dev_for_extlinux;
		run scan_dev_for_scripts; 
	done;

# This runs a boot_extlinux script
scan_dev_for_extlinux=
	if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}extlinux/extlinux.conf; then 
		echo Found ${prefix}extlinux/extlinux.conf; 
		run boot_extlinux; 
		echo SCRIPT FAILED: continuing...;
	fi

# Sysboot is internal to U-boot and should not return if boot is succesful.
boot_extlinux=
	sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}extlinux/extlinux.conf

# Remaining U-boot environment
bootdelay=2
baudrate=115200
autoload=no
arch=arm
cpu=armv8
board=evb_rk3588
board_name=evb_rk3588
vendor=rockchip
soc=rockchip
mtd_boot=if mtd_blk dev ${devnum}; then setenv devtype mtd; run scan_dev_for_boot_part; fi
scriptaddr=0x00500000
pxefile_addr_r=0x00600000
fdtoverlay_addr_r=0x0a000000
fdt_addr_r=0x0a100000
kernel_addr_r=0x00400000
kernel_addr_c=0x05480000
ramdisk_addr_r=0x0a200000
fdtfile=rockchip/rk3588-rock-5b.dtb
partitions=uuid_disk=${uuid_gpt_disk};name=uboot,start=8MB,size=4MB,uuid=${uuid_gpt_loader2};name=trust,size=4M,uuid=${uuid_gpt_atf};name=misc,size=4MB,uuid=${uuid_gpt_misc};name=resource,size=16MB,uuid=${uuid_gpt_resource};name=kernel,size=32M,uuid=${uuid_gpt_kernel};name=boot,size=32M,bootable,uuid=${uuid_gpt_boot};name=recovery,size=32M,uuid=${uuid_gpt_recovery};name=backup,size=112M,uuid=${uuid_gpt_backup};name=cache,size=512M,uuid=${uuid_gpt_cache};name=system,size=2048M,uuid=${uuid_gpt_system};name=metadata,size=16M,uuid=${uuid_gpt_metadata};name=vendor,size=32M,uuid=${uuid_gpt_vendor};name=oem,size=32M,uuid=${uuid_gpt_oem};name=frp,size=512K,uuid=${uuid_gpt_frp};name=security,size=2M,uuid=${uuid_gpt_security};name=userdata,size=-,uuid=${uuid_gpt_userdata};
stdout=serial,vidconsole
stderr=serial,vidconsole
rkimg_bootdev=if nvme dev 0; then setenv devtype nvme; setenv devnum 0; echo Boot from nvme;elif mmc dev 1 && rkimgtest mmc 1; then setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;elif mmc dev 0; then setenv devtype mmc; setenv devnum 0;elif mtd_blk dev 0; then setenv devtype mtd; setenv devnum 0;elif mtd_blk dev 1; then setenv devtype mtd; setenv devnum 1;elif mtd_blk dev 2; then setenv devtype mtd; setenv devnum 2;elif rknand dev 0; then setenv devtype rknand; setenv devnum 0;elif rksfc dev 0; then setenv devtype spinand; setenv devnum 0;elif rksfc dev 1; then setenv devtype spinor; setenv devnum 1;elsesetenv devtype ramdisk; setenv devnum 0;fi;
nvme_boot=if nvme dev ${devnum}; then setenv devtype nvme; run scan_dev_for_boot_part; fi
boot_net_pci_enum=pci enum
boot_net_usb_start=usb start
usb_boot=usb start; if usb dev ${devnum}; then setenv devtype usb; run scan_dev_for_boot_part; fi
boot_scripts=boot.scr.uimg boot.scr
boot_script_dhcp=boot.scr.uimg
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done

U-boot Source

# Function trace to try to find most likely boot command

## In U-boot cmd/pxe.c
do_sysboot
handle_pxe_menu
boot_unattempted_labels (probably)
label_boot
do_bootm (I think)

## In cmd/bootm.c
do_bootm
board_do_bootm (I think)

## In arch/arm/mach-rockchip/board.c (board_do_bootm)
arch/arm/lib/bootm.c (do_bootm)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment