blob: aa6d28fa33313b92e0389e883e0e22c706a597a9 [file] [log] [blame]
Simon Glasse7e388b2024-09-29 19:49:42 -06001Generic xPL framework
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +00002=====================
3
4Overview
5--------
6
Simon Glasse7e388b2024-09-29 19:49:42 -06007To unify all existing implementations for secondary/tertiary program loaders
8(generically called xPL)
9and to allow simply adding of new implementations this generic xPL framework
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000010has been created. With this framework almost all source files for a board
11can be reused. No code duplication or symlinking is necessary anymore.
12
13
14How it works
15------------
16
Simon Glasse7e388b2024-09-29 19:49:42 -060017The object files for xPL are built separately and placed in a subdirectory
18("spl", "tpl" or "vpl").
19The final binaries which are generated for SPL are u-boot-spl, u-boot-spl.bin
20and u-boot-spl.map
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000021
Simon Glasse7e388b2024-09-29 19:49:42 -060022A config option named CONFIG_XPL_BUILD is enabled by Kconfig for xPL builds.
23Source files can therefore be compiled for xPL with different settings.
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000024
Simon Glass7a42cd72022-04-30 00:56:45 -060025For example::
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000026
Simon Glasse7e388b2024-09-29 19:49:42 -060027 ifeq ($(CONFIG_XPL_BUILD),y)
Simon Glass7a42cd72022-04-30 00:56:45 -060028 obj-y += board_spl.o
29 else
30 obj-y += board.o
31 endif
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000032
Simon Glasse7e388b2024-09-29 19:49:42 -060033 obj-$(CONFIG_XPL_BUILD) += foo.o
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000034
Simon Glasse7e388b2024-09-29 19:49:42 -060035 if (IS_ENABLED(CONFIG_XPL_BUILD))
Simon Glass7a42cd72022-04-30 00:56:45 -060036 foo();
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000037
Simon Glassd4dce4a2024-09-29 19:49:36 -060038 if (xpl_phase() == PHASE_TPL)
39 bar();
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000040
Simon Glasse7e388b2024-09-29 19:49:42 -060041The building of xPL images can be enabled by CONFIG_SPL (etc.) options in
42Kconfig.
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000043
Simon Glasse7e388b2024-09-29 19:49:42 -060044Because xPL images normally have a different text base, one has to be
45configured by defining CONFIG_xPL_TEXT_BASE. The linker script has to be
46defined with CONFIG_xPL_LDSCRIPT.
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000047
Simon Glasse7e388b2024-09-29 19:49:42 -060048To support generic U-Boot libraries and drivers in the xPL binary one can
49optionally define CONFIG_xPL_XXX_SUPPORT. Currently following options
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000050are supported:
51
52CONFIG_SPL_LIBCOMMON_SUPPORT (common/libcommon.o)
53CONFIG_SPL_LIBDISK_SUPPORT (disk/libdisk.o)
Simon Glassbccfc2e2021-07-10 21:14:36 -060054CONFIG_SPL_I2C (drivers/i2c/libi2c.o)
Simon Glass035939e2021-07-10 21:14:30 -060055CONFIG_SPL_GPIO (drivers/gpio/libgpio.o)
Simon Glassb58bfe02021-08-08 12:20:09 -060056CONFIG_SPL_MMC (drivers/mmc/libmmc.o)
Simon Glassf4d60392021-08-08 12:20:12 -060057CONFIG_SPL_SERIAL (drivers/serial/libserial.o)
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000058CONFIG_SPL_SPI_FLASH_SUPPORT (drivers/mtd/spi/libspi_flash.o)
Simon Glassa5820472021-08-08 12:20:14 -060059CONFIG_SPL_SPI (drivers/spi/libspi.o)
Tien Fong Chee6fd0a712019-01-23 14:20:03 +080060CONFIG_SPL_FS_FAT (fs/fat/libfat.o)
Tien Fong Chee6091dd12019-01-23 14:20:05 +080061CONFIG_SPL_FS_EXT4
Daniel Schwierzeck39ca08e2011-07-18 07:48:07 +000062CONFIG_SPL_LIBGENERIC_SUPPORT (lib/libgeneric.o)
Simon Glasse91ac4c2021-07-10 21:14:24 -060063CONFIG_SPL_POWER (drivers/power/libpower.o)
Miquel Raynal1f1ae152018-08-16 17:30:07 +020064CONFIG_SPL_NAND_SUPPORT (drivers/mtd/nand/raw/libnand.o)
Simon Glass284cb9c2021-07-10 21:14:31 -060065CONFIG_SPL_DRIVERS_MISC (drivers/misc)
Vignesh Raghavendra3d2ba9c2019-11-15 17:00:41 +053066CONFIG_SPL_DMA (drivers/dma/libdma.o)
Heiko Schocher415be992011-11-01 20:00:28 +000067CONFIG_SPL_POST_MEM_SUPPORT (post/drivers/memory.o)
Miquel Raynal1f1ae152018-08-16 17:30:07 +020068CONFIG_SPL_NAND_LOAD (drivers/mtd/nand/raw/nand_spl_load.o)
Christian Riesch23f16a82011-12-09 09:47:35 +000069CONFIG_SPL_SPI_LOAD (drivers/mtd/spi/spi_spl_load.o)
Pavel Machekde997252012-08-30 22:42:11 +020070CONFIG_SPL_RAM_DEVICE (common/spl/spl.c)
Simon Glass1ba1d4e2021-07-10 21:14:28 -060071CONFIG_SPL_WATCHDOG (drivers/watchdog/libwatchdog.o)
Devarsh Thakkar85297f32023-12-05 21:25:22 +053072CONFIG_SPL_SYSCON (drivers/core/syscon-uclass.o)
73CONFIG_SPL_GZIP (lib/gzip.o)
74CONFIG_SPL_VIDEO (drivers/video/video-uclass.o drivers/video/vidconsole-uclass.o)
75CONFIG_SPL_SPLASH_SCREEN (common/splash.o)
76CONFIG_SPL_SPLASH_SOURCE (common/splash_source.o)
77CONFIG_SPL_GPIO (drivers/gpio)
78CONFIG_SPL_DM_GPIO (drivers/gpio/gpio-uclass.o)
79CONFIG_SPL_BMP (drivers/video/bmp.o)
80CONFIG_SPL_BLOBLIST (common/bloblist.o)
Allen Martinf5e0cf62012-04-19 07:58:57 +000081
Simon Glasse7e388b2024-09-29 19:49:42 -060082Adding xPL-specific code
Simon Glassaf99ed62022-04-30 00:56:46 -060083------------------------
84
85To check whether a feature is enabled, use CONFIG_IS_ENABLED()::
86
87 if (CONFIG_IS_ENABLED(CLK))
88 ...
89
90This checks CONFIG_CLK for the main build, CONFIG_SPL_CLK for the SPL build,
91CONFIG_TPL_CLK for the TPL build, etc.
92
Heinrich Schuchardtcbc4ad12023-07-28 18:44:34 +020093U-Boot Boot Phases
94------------------
Simon Glassaf99ed62022-04-30 00:56:46 -060095
Heinrich Schuchardtcbc4ad12023-07-28 18:44:34 +020096U-Boot goes through the following boot phases where TPL, VPL, SPL are optional.
Simon Glasse7e388b2024-09-29 19:49:42 -060097While many boards use SPL, fewer use TPL.
Simon Glassaf99ed62022-04-30 00:56:46 -060098
99TPL
Simon Glass7eec8842022-04-30 00:56:52 -0600100 Very early init, as tiny as possible. This loads SPL (or VPL if enabled).
101
102VPL
103 Optional verification step, which can select one of several SPL binaries,
104 if A/B verified boot is enabled. Implementation of the VPL logic is
105 work-in-progress. For now it just boots into SPL.
Simon Glassaf99ed62022-04-30 00:56:46 -0600106
107SPL
108 Secondary program loader. Sets up SDRAM and loads U-Boot proper. It may also
109 load other firmware components.
110
111U-Boot
112 U-Boot proper, containing the command line and boot logic.
113
Heinrich Schuchardtcbc4ad12023-07-28 18:44:34 +0200114Further usages of U-Boot SPL comprise:
115
116* Launching BL31 of ARM Trusted Firmware which invokes main U-Boot as BL33
117* launching EDK II
118* launching Linux kernel
119* launching RISC-V OpenSBI which invokes main U-Boot
Simon Glassaf99ed62022-04-30 00:56:46 -0600120
121Checking the boot phase
122-----------------------
123
Simon Glassd4dce4a2024-09-29 19:49:36 -0600124Use `xpl_phase()` to find the current U-Boot phase, e.g. `PHASE_SPL`. You can
Simon Glassaf99ed62022-04-30 00:56:46 -0600125also find the previous and next phase and get the phase name.
126
127
Simon Glassa04b9942024-07-20 11:49:48 +0100128.. _fdtgrep_filter:
129
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200130Device tree
131-----------
132The U-Boot device tree is filtered by the fdtgrep tools during the build
133process to generate a much smaller device tree used in SPL (spl/u-boot-spl.dtb)
134with:
Simon Glass7a42cd72022-04-30 00:56:45 -0600135
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200136- the mandatory nodes (/alias, /chosen, /config)
137- the nodes with one pre-relocation property:
Simon Glassb9a1a052023-02-13 08:56:36 -0700138 'bootph-all' or 'bootph-pre-ram'
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200139
Thomas Hebbfd37f242019-11-13 18:18:03 -0800140fdtgrep is also used to remove:
Simon Glass7a42cd72022-04-30 00:56:45 -0600141
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200142- the properties defined in CONFIG_OF_SPL_REMOVE_PROPS
143- all the pre-relocation properties
Simon Glassb9a1a052023-02-13 08:56:36 -0700144 ('bootph-all', 'bootph-pre-ram' (SPL), 'bootph-pre-sram' (TPL) and
145 'bootph-verify' (TPL))
Patrick Delaunay63e4d112019-05-21 19:19:13 +0200146
147All the nodes remaining in the SPL devicetree are bound
Patrick Delaunayfaafeaa2020-03-02 10:12:41 +0100148(see doc/driver-model/design.rst).
Tom Rini3b7e84e2012-08-15 07:23:20 +0000149
Simon Glassb9a1a052023-02-13 08:56:36 -0700150NOTE: U-Boot migrated to a new schema for the u-boot,dm-* tags in 2023. Please
151update to use the new bootph-* tags as described in the
152doc/device-tree-bindings/bootph.yaml binding file.
153
Tom Rini3b7e84e2012-08-15 07:23:20 +0000154Debugging
155---------
156
157When building SPL with DEBUG set you may also need to set CONFIG_PANIC_HANG
158as in most cases do_reset is not defined within SPL.
Tom Rinid835b902012-08-15 07:23:21 +0000159
160
161Estimating stack usage
162----------------------
163
164With gcc 4.6 (and later) and the use of GNU cflow it is possible to estimate
165stack usage at various points in run sequence of SPL. The -fstack-usage option
166to gcc will produce '.su' files (such as arch/arm/cpu/armv7/syslib.su) that
167will give stack usage information and cflow can construct program flow.
168
Simon Glass7a42cd72022-04-30 00:56:45 -0600169Must have gcc 4.6 or later, which supports -fstack-usage:
Tom Rinid835b902012-08-15 07:23:21 +0000170
Simon Glass7a42cd72022-04-30 00:56:45 -0600171#. Build normally
172#. Perform the following shell command to generate a list of C files used in
173 SPL:
174#. `find spl -name '*.su' | sed -e 's:^spl/::' -e 's:[.]su$:.c:' > used-spl.list`
175#. Execute cflow:
176 `$ cflow --main=board_init_r $(cat used-spl.list) 2>&1 | $PAGER`
Tom Rinid835b902012-08-15 07:23:21 +0000177
178cflow will spit out a number of warnings as it does not parse
179the config files and picks functions based on #ifdef. Parsing the '.i'
180files instead introduces another set of headaches. These warnings are
181not usually important to understanding the flow, however.
Devarsh Thakkar27636112023-12-05 21:25:23 +0530182
183
Simon Glasse7e388b2024-09-29 19:49:42 -0600184Reserving memory in xPL
Devarsh Thakkar27636112023-12-05 21:25:23 +0530185-----------------------
186
Simon Glasse7e388b2024-09-29 19:49:42 -0600187If memory needs to be reserved in RAM during an xPL phase with the requirement
188that the xPL reserved memory remains preserved across further boot phases too
Devarsh Thakkar27636112023-12-05 21:25:23 +0530189then it needs to be reserved mandatorily starting from end of RAM. This is to
Simon Glasse7e388b2024-09-29 19:49:42 -0600190ensure that further phases can simply skip this region before carrying out
Devarsh Thakkar27636112023-12-05 21:25:23 +0530191further reservations or updating the relocation address.
192
Simon Glasse7e388b2024-09-29 19:49:42 -0600193Also out of these regions which are to be preserved across further phases of
Devarsh Thakkar27636112023-12-05 21:25:23 +0530194boot, video framebuffer memory region must be reserved first starting from
Simon Glasse7e388b2024-09-29 19:49:42 -0600195end of RAM for which the helper function spl_reserve_video_from_ram_top() is
196provided
197which makes sure that video memory is placed at the top of reservation area with
Devarsh Thakkar27636112023-12-05 21:25:23 +0530198further reservations below it.
199
Simon Glasse7e388b2024-09-29 19:49:42 -0600200The reservation information for these regions can be passed to the
201further boot phases using a bloblist. For e.g. the information for the
202framebuffer area reserved by xPL can be passed onto U-Boot using
203BLOBLISTT_U_BOOT_VIDEO
Devarsh Thakkar27636112023-12-05 21:25:23 +0530204
Simon Glasse7e388b2024-09-29 19:49:42 -0600205The further boot phases need to parse each of the blobs passed from xPL phase
206starting from video bloblist and skip this whole xPL reserved-memory area from
207end of RAM as per the blobs received, before carrying out further
208reservations or updating the relocation address. For e.g, U-Boot proper uses
209function setup_relocaddr_from_bloblist() to parse the bloblist passed from
210previous phase and skip the memory reserved from previous phase accordingly.