blob: 76e87f07c720acced896c5519a0819adec5e0323 [file] [log] [blame]
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +00001Generic SPL framework
2=====================
3
4Overview
5--------
6
7To unify all existing implementations for a secondary program loader (SPL)
8and to allow simply adding of new implementations this generic SPL framework
9has been created. With this framework almost all source files for a board
10can be reused. No code duplication or symlinking is necessary anymore.
11
12
13How it works
14------------
15
Masahiro Yamadac01f87c2014-08-05 15:25:06 +090016The object files for SPL are built separately and placed in the "spl" directory.
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000017The final binaries which are generated are u-boot-spl, u-boot-spl.bin and
18u-boot-spl.map.
19
Masahiro Yamadac01f87c2014-08-05 15:25:06 +090020A config option named CONFIG_SPL_BUILD is enabled by Kconfig for SPL.
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000021Source files can therefore be compiled for SPL with different settings.
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000022
Simon Glassd4113592022-04-30 00:56:45 -060023For example::
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000024
Simon Glassd4113592022-04-30 00:56:45 -060025 ifeq ($(CONFIG_SPL_BUILD),y)
26 obj-y += board_spl.o
27 else
28 obj-y += board.o
29 endif
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000030
Simon Glassd4113592022-04-30 00:56:45 -060031 obj-$(CONFIG_SPL_BUILD) += foo.o
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000032
Simon Glassd4113592022-04-30 00:56:45 -060033 #ifdef CONFIG_SPL_BUILD
34 foo();
35 #endif
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000036
37
Masahiro Yamadac01f87c2014-08-05 15:25:06 +090038The building of SPL images can be enabled by CONFIG_SPL option in Kconfig.
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000039
Peter Meerwaldfd3d28e2012-02-02 12:51:03 +000040Because SPL images normally have a different text base, one has to be
41configured by defining CONFIG_SPL_TEXT_BASE. The linker script has to be
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000042defined with CONFIG_SPL_LDSCRIPT.
43
44To support generic U-Boot libraries and drivers in the SPL binary one can
45optionally define CONFIG_SPL_XXX_SUPPORT. Currently following options
46are supported:
47
48CONFIG_SPL_LIBCOMMON_SUPPORT (common/libcommon.o)
49CONFIG_SPL_LIBDISK_SUPPORT (disk/libdisk.o)
Simon Glass975e7cf2021-07-10 21:14:36 -060050CONFIG_SPL_I2C (drivers/i2c/libi2c.o)
Simon Glass83061db2021-07-10 21:14:30 -060051CONFIG_SPL_GPIO (drivers/gpio/libgpio.o)
Simon Glass103c5f12021-08-08 12:20:09 -060052CONFIG_SPL_MMC (drivers/mmc/libmmc.o)
Simon Glass2a736062021-08-08 12:20:12 -060053CONFIG_SPL_SERIAL (drivers/serial/libserial.o)
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000054CONFIG_SPL_SPI_FLASH_SUPPORT (drivers/mtd/spi/libspi_flash.o)
Simon Glassea2ca7e2021-08-08 12:20:14 -060055CONFIG_SPL_SPI (drivers/spi/libspi.o)
Tien Fong Chee0c3a9ed2019-01-23 14:20:03 +080056CONFIG_SPL_FS_FAT (fs/fat/libfat.o)
Tien Fong Cheef4b40922019-01-23 14:20:05 +080057CONFIG_SPL_FS_EXT4
Daniel Schwierzeck6a11cf42011-07-18 07:48:07 +000058CONFIG_SPL_LIBGENERIC_SUPPORT (lib/libgeneric.o)
Simon Glass933b2f02021-07-10 21:14:24 -060059CONFIG_SPL_POWER (drivers/power/libpower.o)
Miquel Raynala430fa02018-08-16 17:30:07 +020060CONFIG_SPL_NAND_SUPPORT (drivers/mtd/nand/raw/libnand.o)
Simon Glass9ca00682021-07-10 21:14:31 -060061CONFIG_SPL_DRIVERS_MISC (drivers/misc)
Vignesh Raghavendra74326a32019-11-15 17:00:41 +053062CONFIG_SPL_DMA (drivers/dma/libdma.o)
Heiko Schocher18e8ff12011-11-01 20:00:28 +000063CONFIG_SPL_POST_MEM_SUPPORT (post/drivers/memory.o)
Miquel Raynala430fa02018-08-16 17:30:07 +020064CONFIG_SPL_NAND_LOAD (drivers/mtd/nand/raw/nand_spl_load.o)
Christian Riesch32b11272011-12-09 09:47:35 +000065CONFIG_SPL_SPI_LOAD (drivers/mtd/spi/spi_spl_load.o)
Pavel Machekc57b9532012-08-30 22:42:11 +020066CONFIG_SPL_RAM_DEVICE (common/spl/spl.c)
Simon Glass078111b2021-07-10 21:14:28 -060067CONFIG_SPL_WATCHDOG (drivers/watchdog/libwatchdog.o)
Allen Martind22650a2012-04-19 07:58:57 +000068
Simon Glassa36d2512022-04-30 00:56:46 -060069Adding SPL-specific code
70------------------------
71
72To check whether a feature is enabled, use CONFIG_IS_ENABLED()::
73
74 if (CONFIG_IS_ENABLED(CLK))
75 ...
76
77This checks CONFIG_CLK for the main build, CONFIG_SPL_CLK for the SPL build,
78CONFIG_TPL_CLK for the TPL build, etc.
79
Heinrich Schuchardtf9453272023-07-28 18:44:34 +020080U-Boot Boot Phases
81------------------
Simon Glassa36d2512022-04-30 00:56:46 -060082
Heinrich Schuchardtf9453272023-07-28 18:44:34 +020083U-Boot goes through the following boot phases where TPL, VPL, SPL are optional.
84While many boards use SPL, less use TPL.
Simon Glassa36d2512022-04-30 00:56:46 -060085
86TPL
Simon Glassf86ca5a2022-04-30 00:56:52 -060087 Very early init, as tiny as possible. This loads SPL (or VPL if enabled).
88
89VPL
90 Optional verification step, which can select one of several SPL binaries,
91 if A/B verified boot is enabled. Implementation of the VPL logic is
92 work-in-progress. For now it just boots into SPL.
Simon Glassa36d2512022-04-30 00:56:46 -060093
94SPL
95 Secondary program loader. Sets up SDRAM and loads U-Boot proper. It may also
96 load other firmware components.
97
98U-Boot
99 U-Boot proper, containing the command line and boot logic.
100
Heinrich Schuchardtf9453272023-07-28 18:44:34 +0200101Further usages of U-Boot SPL comprise:
102
103* Launching BL31 of ARM Trusted Firmware which invokes main U-Boot as BL33
104* launching EDK II
105* launching Linux kernel
106* launching RISC-V OpenSBI which invokes main U-Boot
Simon Glassa36d2512022-04-30 00:56:46 -0600107
108Checking the boot phase
109-----------------------
110
111Use `spl_phase()` to find the current U-Boot phase, e.g. `PHASE_SPL`. You can
112also find the previous and next phase and get the phase name.
113
114
Patrick Delaunay54e12232019-05-21 19:19:13 +0200115Device tree
116-----------
117The U-Boot device tree is filtered by the fdtgrep tools during the build
118process to generate a much smaller device tree used in SPL (spl/u-boot-spl.dtb)
119with:
Simon Glassd4113592022-04-30 00:56:45 -0600120
Patrick Delaunay54e12232019-05-21 19:19:13 +0200121- the mandatory nodes (/alias, /chosen, /config)
122- the nodes with one pre-relocation property:
Simon Glassea4299a2023-02-13 08:56:36 -0700123 'bootph-all' or 'bootph-pre-ram'
Patrick Delaunay54e12232019-05-21 19:19:13 +0200124
Thomas Hebb32f2ca22019-11-13 18:18:03 -0800125fdtgrep is also used to remove:
Simon Glassd4113592022-04-30 00:56:45 -0600126
Patrick Delaunay54e12232019-05-21 19:19:13 +0200127- the properties defined in CONFIG_OF_SPL_REMOVE_PROPS
128- all the pre-relocation properties
Simon Glassea4299a2023-02-13 08:56:36 -0700129 ('bootph-all', 'bootph-pre-ram' (SPL), 'bootph-pre-sram' (TPL) and
130 'bootph-verify' (TPL))
Patrick Delaunay54e12232019-05-21 19:19:13 +0200131
132All the nodes remaining in the SPL devicetree are bound
Patrick Delaunay42551f42020-03-02 10:12:41 +0100133(see doc/driver-model/design.rst).
Tom Rinif8e754d2012-08-15 07:23:20 +0000134
Simon Glassea4299a2023-02-13 08:56:36 -0700135NOTE: U-Boot migrated to a new schema for the u-boot,dm-* tags in 2023. Please
136update to use the new bootph-* tags as described in the
137doc/device-tree-bindings/bootph.yaml binding file.
138
Tom Rinif8e754d2012-08-15 07:23:20 +0000139Debugging
140---------
141
142When building SPL with DEBUG set you may also need to set CONFIG_PANIC_HANG
143as in most cases do_reset is not defined within SPL.
Tom Rinic3567d82012-08-15 07:23:21 +0000144
145
146Estimating stack usage
147----------------------
148
149With gcc 4.6 (and later) and the use of GNU cflow it is possible to estimate
150stack usage at various points in run sequence of SPL. The -fstack-usage option
151to gcc will produce '.su' files (such as arch/arm/cpu/armv7/syslib.su) that
152will give stack usage information and cflow can construct program flow.
153
Simon Glassd4113592022-04-30 00:56:45 -0600154Must have gcc 4.6 or later, which supports -fstack-usage:
Tom Rinic3567d82012-08-15 07:23:21 +0000155
Simon Glassd4113592022-04-30 00:56:45 -0600156#. Build normally
157#. Perform the following shell command to generate a list of C files used in
158 SPL:
159#. `find spl -name '*.su' | sed -e 's:^spl/::' -e 's:[.]su$:.c:' > used-spl.list`
160#. Execute cflow:
161 `$ cflow --main=board_init_r $(cat used-spl.list) 2>&1 | $PAGER`
Tom Rinic3567d82012-08-15 07:23:21 +0000162
163cflow will spit out a number of warnings as it does not parse
164the config files and picks functions based on #ifdef. Parsing the '.i'
165files instead introduces another set of headaches. These warnings are
166not usually important to understanding the flow, however.