1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
|
.. SPDX-License-Identifier: GPL-2.0-or-later
Booting from TPL/SPL
====================
The main U-Boot binary may be too large to be loaded directly by the Boot ROM.
This was the original driver for splitting up U-Boot into multiple boot stages.
U-Boot typically goes through the following boot phases where TPL, VPL, and SPL
are optional. While many boards use SPL only few use TPL.
TPL
Tertiary Program Loader. Very early init, as tiny as possible. This loads SPL
(or VPL if enabled).
VPL
Verifying Program Loader. Optional verification step, which can select one of
several SPL binaries, if A/B verified boot is enabled. Implementation of the
VPL logic is work-in-progress. For now it just boots into SPL.
SPL
Secondary Program Loader. Sets up SDRAM and loads U-Boot proper. It may also
load other firmware components.
U-Boot
U-Boot proper. This is the only stage containing command. It also implements
logic to load an operating system, e.g. via UEFI.
.. note::
The naming convention on the PowerPC architecture deviates from the other
archtitectures. Here the boot sequence is SPL->TPL->U-Boot.
Further usages for U-Boot SPL comprise:
* launching BL31 of ARM Trusted Firmware which invokes U-Boot as BL33
* launching EDK II
* launching Linux, e.g. :doc:`Falcon Mode <../develop/falcon>`
* launching RISC-V OpenSBI which invokes main U-Boot
Target binaries
---------------
Binaries loaded by SPL/TPL can be:
* raw binaries where the entry address equals the start address. This is the
only binary format supported by TPL.
* :doc:`FIT <fit/index>` images
* legacy U-Boot images
Configuration
~~~~~~~~~~~~~
Raw images are only supported in SPL if CONFIG_SPL_RAW_IMAGE_SUPPORT=y.
CONFIG_SPL_FIT=y and CONFIG_SPL_LOAD_FIT=y are needed to load FIT images.
CONFIG_SPL_LEGACY_IMAGE_FORMAT=y is needed to load legacy U-Boot images.
CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK=y enables checking the CRC32 of legacy U-Boot
images.
Image load methods
------------------
The image boot methods available for a board must be defined in two places:
The board code implements a function board_boot_order() enumerating up to
five boot methods and the sequence in which they are tried. (The maximum
number of boot methods is currently hard coded as variable spl_boot_list[]).
If there is only one boot method function, spl_boot_device() may be implemented
instead.
The configuration controls which of these boot methods are actually available.
Loading from block devices
~~~~~~~~~~~~~~~~~~~~~~~~~~
MMC1, MMC2, MMC2_2
These methods read an image from SD card or eMMC. The first digit after
'MMC' indicates the device number. Required configuration settings include:
* CONFIG_SPL_MMC=y or CONFIG_TPL_MMC=y
To use a PCI connected MMC controller you need to additionally specify:
* CONFIG_SPL_PCI=y
* CONFIG_SPL_PCI_PNP=y
* CONFIG_MMC=y
* CONFIG_MMC_PCI=y
* CONFIG_MMC_SDHCI=y
To load from a file system use:
* CONFIG_SPL_FS_FAT=y or CONFIG_SPL_FS_EXT=y
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
NVMe
This methods load the image from an NVMe drive.
Required configuration settings include:
* CONFIG_SPL_PCI=y
* CONFIG_SPL_PCI_PNP=y
* CONFIG_SPL_NVME=y
* CONFIG_SPL_NVME_PCI=y
* CONFIG_SPL_NVME_BOOT_DEVICE (number of the NVMe device)
* CONFIG_SYS_NVME_BOOT_PARTITION (partition to read from)
To load from a file system use:
* CONFIG_SPL_FS_FAT=y or CONFIG_SPL_FS_EXT=y
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
SATA
This method reads an image from a SATA drive.
Required configuration settings include:
* CONFIG_SPL_SATA=y or CONFIG_TPL_SATA=y
To use a PCIe connecte SATA controller you additionally need:
* CONFIG_SPL_PCI=y
* CONFIG_SPL_SATA=y
* CONFIG_SPL_AHCI_PCI=y
* CONFIG_SPL_PCI_PNP=y
To load from a file system use:
* CONFIG_SPL_FS_FAT=y
* CONFIG_SYS_SATA_FAT_BOOT_PARTITION=<partition number>
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
USB
The USB method loads an image from a USB block device.
Required configuration settings include:
* CONFIG_SPL_USB_HOST=y
* CONFIG_SPL_USB_STORAGE=y
To use a PCI connected USB 3.0 controller you additionally need:
* CONFIG_SPL_FS_FAT=y
* CONFIG_SPL_PCI=y
* CONFIG_SPL_PCI_PNP=y
* CONFIG_USB=y
* CONFIG_USB_XHCI_HCD=y
* CONFIG_USB_XHCI_PCI=y
To load from a file system use:
* CONFIG_SPL_FS_FAT=y or CONFIG_SPL_FS_EXT=y
* CONFIG_SYS_USB_FAT_BOOT_PARTITION=<partition number>
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME="<filepath>"
Loading from raw flash devices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NAND
This method loads the image from NAND flash. To read from raw NAND the
following configuration settings are required:
* CONFIG_SPL_NAND_SUPPORT=y or CONFIG_TPL_NAND_SUPPORT=y
If CONFIG_SPL_NAND_RAW_ONLY=y only raw images can be loaded.
For using UBI (Unsorted Block Images) volumes to read from NAND the
following configuration settings are required:
* CONFIG_SPL_UBI=y or CONFIG_TPL_UBI=y
The UBI volume to read can either be specified
* by name using CONFIG_SPL_UBI_LOAD_BY_VOLNAME or
* by number using CONFIG_SPL_UBI_LOAD_MONITOR_ID.
NOR
This method loads the image from NOR flash.
Required configuration settings include:
* CONFIG_SPL_NOR_SUPPORT=y or CONFIG_TPL_NOR_SUPPORT=y
OneNAND
This methods loads the image from a OneNAND device. To read from raw OneNAND
the following configuration settings are required:
* CONFIG_SPL_ONENAND_SUPPORT=y or CONFIG_TPL_ONENAND_SUPPORT=y
For using the Ubi file system to read from NAND the following configuration
settings are required:
* CONFIG_SPL_UBI=y or CONFIG_TPL_UBI=y
SPI
This method loads an image form SPI NOR flash.
Required configuration settings include:
* CONFIG_SPL_DM_SPI=y
* CONFIG_SPL_SPI_FLASH=y
* CONFIG_SPI_LOAD=y or CONFIG_TPL_SPI_LOAD=y
Sunxi SPI
This method which is specific to Allwinner SoCs loads an image form SPI NOR
flash. Required configuration settings include:
* CONFIG_SPL_SPI_SUNXI=y
Loading from other devices
~~~~~~~~~~~~~~~~~~~~~~~~~~
BOOTROM
The binary is loaded by the boot ROM.
Required configuration settings include:
* CONFIG_SPL_BOOTROM_SUPPORT=y or CONFIG_TPL_BOOTROM_SUPPORT=y
DFU
:doc:`Device Firmware Upgrade <dfu>` is used to load the binary into RAM.
Required configuration settings include:
* CONFIG_DFU=y
* CONFIG_SPL_RAM_SUPPORT=y or CONFIG TPL_RAM_SUPPORT=y
Ethernet
This method loads an image over Ethernet. The BOOTP protocol is used to find
a TFTP server and binary name. The binary is downloaded via the TFTP
protocol. Required configuration settings include:
* CONFIG_SPL_NET=y or CONFIG_TPL_NET=y
* CONFIG_SPL_ETH_DEVICE=y or CONFIG_DM_USB_GADGET=y
FEL
This method does not actually load an image for U-Boot.
FEL is a routine contained in the boot ROM of Allwinner SoCs which serves
for the initial programming or recovery via USB
RAM
This method uses an image preloaded into RAM.
Required configuration settings include:
* CONFIG_SPL_RAM_SUPPORT=y or CONFIG_TPL_RAM_SUPPORT=y
* CONFIG_RAM_DEVICE=y
Sandbox file
On the sandbox this method loads an image from the host file system.
Sandbox image
On the sandbox this method loads an image from the host file system.
Semihosting
When running in an ARM or RISC-V virtual machine the semihosting method can
be used to load an image from the host file system.
Required configuration settings include:
* CONFIG_SPL_SEMIHOSTING=y
* CONFIG_SPL_SEMIHOSTING_FALLBACK=y
* CONFIG_SPL_FS_LOAD_PAYLOAD_NAME=<path to file>
UART
This method loads an image via the Y-Modem protocol from the UART.
Required configuration settings include:
* CONFIG_SPL_YMODEM_SUPPORT=y or CONFIG_TPL_YMODEM_SUPPORT=y
USB SDP
This method loads the image using the Serial Download Protocol as
implemented by the boot ROM of the i.MX family of SoCs.
Required configuration settings include:
* CONFIG_SPL_SERIAL=y
* CONFIG_SPL_USB_SDP_SUPPORT=y or CONFIG_TPL_USB_SDP_SUPPORT
VBE Simple
This method is used by the VPL stage to extract the next stage image from
the loaded image.
Required configuration settings include:
* CONFIG_VPL=y
* CONFIG_SPL_BOOTMETH_VBE_SIMPLE_FW=y or CONFIG_TPL_BOOTMETH_VBE_SIMPLE_FW=y
XIP
This method executes an image in place.
Required configuration settings include:
* CONFIG_SPL_XIP_SUPPORT
|