blob: 4bb48e6b7b3079af271acd9d3412386118d91b3e [file] [log] [blame]
Daniel Schwierzeck39ca08e2011-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 Yamada1ed84a32014-08-05 15:25:06 +090016The object files for SPL are built separately and placed in the "spl" directory.
Daniel Schwierzeck39ca08e2011-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 Yamada1ed84a32014-08-05 15:25:06 +090020A config option named CONFIG_SPL_BUILD is enabled by Kconfig for SPL.
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000021Source files can therefore be compiled for SPL with different settings.
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000022
Simon Glass7a42cd72022-04-30 00:56:45 -060023For example::
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000024
Simon Glass7a42cd72022-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 Schwierzeck39ca08e2011-07-18 07:48:07 +000030
Simon Glass7a42cd72022-04-30 00:56:45 -060031 obj-$(CONFIG_SPL_BUILD) += foo.o
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000032
Simon Glass7a42cd72022-04-30 00:56:45 -060033 #ifdef CONFIG_SPL_BUILD
34 foo();
35 #endif
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000036
37
Masahiro Yamada1ed84a32014-08-05 15:25:06 +090038The building of SPL images can be enabled by CONFIG_SPL option in Kconfig.
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000039
Peter Meerwaldac176722012-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 Schwierzeck39ca08e2011-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 Glassbccfc2e2021-07-10 21:14:36 -060050CONFIG_SPL_I2C (drivers/i2c/libi2c.o)
Simon Glass035939e2021-07-10 21:14:30 -060051CONFIG_SPL_GPIO (drivers/gpio/libgpio.o)
Simon Glassb58bfe02021-08-08 12:20:09 -060052CONFIG_SPL_MMC (drivers/mmc/libmmc.o)
Simon Glassf4d60392021-08-08 12:20:12 -060053CONFIG_SPL_SERIAL (drivers/serial/libserial.o)
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000054CONFIG_SPL_SPI_FLASH_SUPPORT (drivers/mtd/spi/libspi_flash.o)
Simon Glassa5820472021-08-08 12:20:14 -060055CONFIG_SPL_SPI (drivers/spi/libspi.o)
Tien Fong Chee6fd0a712019-01-23 14:20:03 +080056CONFIG_SPL_FS_FAT (fs/fat/libfat.o)
Tien Fong Chee6091dd12019-01-23 14:20:05 +080057CONFIG_SPL_FS_EXT4
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000058CONFIG_SPL_LIBGENERIC_SUPPORT (lib/libgeneric.o)
Simon Glasse91ac4c2021-07-10 21:14:24 -060059CONFIG_SPL_POWER (drivers/power/libpower.o)
Miquel Raynal1f1ae152018-08-16 17:30:07 +020060CONFIG_SPL_NAND_SUPPORT (drivers/mtd/nand/raw/libnand.o)
Simon Glass284cb9c2021-07-10 21:14:31 -060061CONFIG_SPL_DRIVERS_MISC (drivers/misc)
Vignesh Raghavendra3d2ba9c2019-11-15 17:00:41 +053062CONFIG_SPL_DMA (drivers/dma/libdma.o)
Heiko Schocher415be992011-11-01 20:00:28 +000063CONFIG_SPL_POST_MEM_SUPPORT (post/drivers/memory.o)
Miquel Raynal1f1ae152018-08-16 17:30:07 +020064CONFIG_SPL_NAND_LOAD (drivers/mtd/nand/raw/nand_spl_load.o)
Christian Riesch23f16a82011-12-09 09:47:35 +000065CONFIG_SPL_SPI_LOAD (drivers/mtd/spi/spi_spl_load.o)
Pavel Machekde997252012-08-30 22:42:11 +020066CONFIG_SPL_RAM_DEVICE (common/spl/spl.c)
Simon Glass1ba1d4e2021-07-10 21:14:28 -060067CONFIG_SPL_WATCHDOG (drivers/watchdog/libwatchdog.o)
Devarsh Thakkar85297f32023-12-05 21:25:22 +053068CONFIG_SPL_SYSCON (drivers/core/syscon-uclass.o)
69CONFIG_SPL_GZIP (lib/gzip.o)
70CONFIG_SPL_VIDEO (drivers/video/video-uclass.o drivers/video/vidconsole-uclass.o)
71CONFIG_SPL_SPLASH_SCREEN (common/splash.o)
72CONFIG_SPL_SPLASH_SOURCE (common/splash_source.o)
73CONFIG_SPL_GPIO (drivers/gpio)
74CONFIG_SPL_DM_GPIO (drivers/gpio/gpio-uclass.o)
75CONFIG_SPL_BMP (drivers/video/bmp.o)
76CONFIG_SPL_BLOBLIST (common/bloblist.o)
Allen Martinf5e0cf62012-04-19 07:58:57 +000077
Simon Glassaf99ed62022-04-30 00:56:46 -060078Adding SPL-specific code
79------------------------
80
81To check whether a feature is enabled, use CONFIG_IS_ENABLED()::
82
83 if (CONFIG_IS_ENABLED(CLK))
84 ...
85
86This checks CONFIG_CLK for the main build, CONFIG_SPL_CLK for the SPL build,
87CONFIG_TPL_CLK for the TPL build, etc.
88
Heinrich Schuchardtcbc4ad12023-07-28 18:44:34 +020089U-Boot Boot Phases
90------------------
Simon Glassaf99ed62022-04-30 00:56:46 -060091
Heinrich Schuchardtcbc4ad12023-07-28 18:44:34 +020092U-Boot goes through the following boot phases where TPL, VPL, SPL are optional.
93While many boards use SPL, less use TPL.
Simon Glassaf99ed62022-04-30 00:56:46 -060094
95TPL
Simon Glass7eec8842022-04-30 00:56:52 -060096 Very early init, as tiny as possible. This loads SPL (or VPL if enabled).
97
98VPL
99 Optional verification step, which can select one of several SPL binaries,
100 if A/B verified boot is enabled. Implementation of the VPL logic is
101 work-in-progress. For now it just boots into SPL.
Simon Glassaf99ed62022-04-30 00:56:46 -0600102
103SPL
104 Secondary program loader. Sets up SDRAM and loads U-Boot proper. It may also
105 load other firmware components.
106
107U-Boot
108 U-Boot proper, containing the command line and boot logic.
109
Heinrich Schuchardtcbc4ad12023-07-28 18:44:34 +0200110Further usages of U-Boot SPL comprise:
111
112* Launching BL31 of ARM Trusted Firmware which invokes main U-Boot as BL33
113* launching EDK II
114* launching Linux kernel
115* launching RISC-V OpenSBI which invokes main U-Boot
Simon Glassaf99ed62022-04-30 00:56:46 -0600116
117Checking the boot phase
118-----------------------
119
120Use `spl_phase()` to find the current U-Boot phase, e.g. `PHASE_SPL`. You can
121also find the previous and next phase and get the phase name.
122
123
Simon Glassa04b9942024-07-20 11:49:48 +0100124.. _fdtgrep_filter:
125
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200126Device tree
127-----------
128The U-Boot device tree is filtered by the fdtgrep tools during the build
129process to generate a much smaller device tree used in SPL (spl/u-boot-spl.dtb)
130with:
Simon Glass7a42cd72022-04-30 00:56:45 -0600131
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200132- the mandatory nodes (/alias, /chosen, /config)
133- the nodes with one pre-relocation property:
Simon Glassb9a1a052023-02-13 08:56:36 -0700134 'bootph-all' or 'bootph-pre-ram'
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200135
Thomas Hebbfd37f242019-11-13 18:18:03 -0800136fdtgrep is also used to remove:
Simon Glass7a42cd72022-04-30 00:56:45 -0600137
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200138- the properties defined in CONFIG_OF_SPL_REMOVE_PROPS
139- all the pre-relocation properties
Simon Glassb9a1a052023-02-13 08:56:36 -0700140 ('bootph-all', 'bootph-pre-ram' (SPL), 'bootph-pre-sram' (TPL) and
141 'bootph-verify' (TPL))
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200142
143All the nodes remaining in the SPL devicetree are bound
Patrick Delaunayfaafeaa2020-03-02 10:12:41 +0100144(see doc/driver-model/design.rst).
Tom Rini3b7e84e2012-08-15 07:23:20 +0000145
Simon Glassb9a1a052023-02-13 08:56:36 -0700146NOTE: U-Boot migrated to a new schema for the u-boot,dm-* tags in 2023. Please
147update to use the new bootph-* tags as described in the
148doc/device-tree-bindings/bootph.yaml binding file.
149
Tom Rini3b7e84e2012-08-15 07:23:20 +0000150Debugging
151---------
152
153When building SPL with DEBUG set you may also need to set CONFIG_PANIC_HANG
154as in most cases do_reset is not defined within SPL.
Tom Rinid835b902012-08-15 07:23:21 +0000155
156
157Estimating stack usage
158----------------------
159
160With gcc 4.6 (and later) and the use of GNU cflow it is possible to estimate
161stack usage at various points in run sequence of SPL. The -fstack-usage option
162to gcc will produce '.su' files (such as arch/arm/cpu/armv7/syslib.su) that
163will give stack usage information and cflow can construct program flow.
164
Simon Glass7a42cd72022-04-30 00:56:45 -0600165Must have gcc 4.6 or later, which supports -fstack-usage:
Tom Rinid835b902012-08-15 07:23:21 +0000166
Simon Glass7a42cd72022-04-30 00:56:45 -0600167#. Build normally
168#. Perform the following shell command to generate a list of C files used in
169 SPL:
170#. `find spl -name '*.su' | sed -e 's:^spl/::' -e 's:[.]su$:.c:' > used-spl.list`
171#. Execute cflow:
172 `$ cflow --main=board_init_r $(cat used-spl.list) 2>&1 | $PAGER`
Tom Rinid835b902012-08-15 07:23:21 +0000173
174cflow will spit out a number of warnings as it does not parse
175the config files and picks functions based on #ifdef. Parsing the '.i'
176files instead introduces another set of headaches. These warnings are
177not usually important to understanding the flow, however.
Devarsh Thakkar27636112023-12-05 21:25:23 +0530178
179
180Reserving memory in SPL
181-----------------------
182
183If memory needs to be reserved in RAM during SPL stage with the requirement that
184the SPL reserved memory remains preserved across further boot stages too
185then it needs to be reserved mandatorily starting from end of RAM. This is to
186ensure that further stages can simply skip this region before carrying out
187further reservations or updating the relocation address.
188
189Also out of these regions which are to be preserved across further stages of
190boot, video framebuffer memory region must be reserved first starting from
191end of RAM for which helper function spl_reserve_video_from_ram_top is provided
192which makes sure that video memory is placed at top of reservation area with
193further reservations below it.
194
195The corresponding information of reservation for those regions can be passed to
196further boot stages using a bloblist. For e.g. the information for
197framebuffer area reserved by SPL can be passed onto U-boot using
198BLOBLISTT_U_BOOT_VIDEO.
199
200The further boot stages need to parse each of the bloblist passed from SPL stage
201starting from video bloblist and skip this whole SPL reserved memory area from
202end of RAM as per the bloblists received, before carrying out further
203reservations or updating the relocation address. For e.g, U-boot proper uses
204function "setup_relocaddr_from_bloblist" to parse the bloblists passed from
205previous stage and skip the memory reserved from previous stage accordingly.