7 To unify all existing implementations for a secondary program loader (SPL)
8 and to allow simply adding of new implementations this generic SPL framework
9 has been created. With this framework almost all source files for a board
10 can be reused. No code duplication or symlinking is necessary anymore.
16 The object files for SPL are built separately and placed in the "spl" directory.
17 The final binaries which are generated are u-boot-spl, u-boot-spl.bin and
20 A config option named CONFIG_SPL_BUILD is enabled by Kconfig for SPL.
21 Source files can therefore be compiled for SPL with different settings.
25 ifeq ($(CONFIG_SPL_BUILD),y)
31 obj-$(CONFIG_SPL_BUILD) += foo.o
33 #ifdef CONFIG_SPL_BUILD
38 The building of SPL images can be enabled by CONFIG_SPL option in Kconfig.
40 Because SPL images normally have a different text base, one has to be
41 configured by defining CONFIG_SPL_TEXT_BASE. The linker script has to be
42 defined with CONFIG_SPL_LDSCRIPT.
44 To support generic U-Boot libraries and drivers in the SPL binary one can
45 optionally define CONFIG_SPL_XXX_SUPPORT. Currently following options
48 CONFIG_SPL_LIBCOMMON_SUPPORT (common/libcommon.o)
49 CONFIG_SPL_LIBDISK_SUPPORT (disk/libdisk.o)
50 CONFIG_SPL_I2C (drivers/i2c/libi2c.o)
51 CONFIG_SPL_GPIO (drivers/gpio/libgpio.o)
52 CONFIG_SPL_MMC (drivers/mmc/libmmc.o)
53 CONFIG_SPL_SERIAL (drivers/serial/libserial.o)
54 CONFIG_SPL_SPI_FLASH_SUPPORT (drivers/mtd/spi/libspi_flash.o)
55 CONFIG_SPL_SPI (drivers/spi/libspi.o)
56 CONFIG_SPL_FS_FAT (fs/fat/libfat.o)
58 CONFIG_SPL_LIBGENERIC_SUPPORT (lib/libgeneric.o)
59 CONFIG_SPL_POWER (drivers/power/libpower.o)
60 CONFIG_SPL_NAND_SUPPORT (drivers/mtd/nand/raw/libnand.o)
61 CONFIG_SPL_DRIVERS_MISC (drivers/misc)
62 CONFIG_SPL_DMA (drivers/dma/libdma.o)
63 CONFIG_SPL_POST_MEM_SUPPORT (post/drivers/memory.o)
64 CONFIG_SPL_NAND_LOAD (drivers/mtd/nand/raw/nand_spl_load.o)
65 CONFIG_SPL_SPI_LOAD (drivers/mtd/spi/spi_spl_load.o)
66 CONFIG_SPL_RAM_DEVICE (common/spl/spl.c)
67 CONFIG_SPL_WATCHDOG (drivers/watchdog/libwatchdog.o)
71 The U-Boot device tree is filtered by the fdtgrep tools during the build
72 process to generate a much smaller device tree used in SPL (spl/u-boot-spl.dtb)
74 - the mandatory nodes (/alias, /chosen, /config)
75 - the nodes with one pre-relocation property:
76 'u-boot,dm-pre-reloc' or 'u-boot,dm-spl'
78 fdtgrep is also used to remove:
79 - the properties defined in CONFIG_OF_SPL_REMOVE_PROPS
80 - all the pre-relocation properties
81 ('u-boot,dm-pre-reloc', 'u-boot,dm-spl' and 'u-boot,dm-tpl')
83 All the nodes remaining in the SPL devicetree are bound
84 (see doc/driver-model/design.rst).
89 When building SPL with DEBUG set you may also need to set CONFIG_PANIC_HANG
90 as in most cases do_reset is not defined within SPL.
93 Estimating stack usage
94 ----------------------
96 With gcc 4.6 (and later) and the use of GNU cflow it is possible to estimate
97 stack usage at various points in run sequence of SPL. The -fstack-usage option
98 to gcc will produce '.su' files (such as arch/arm/cpu/armv7/syslib.su) that
99 will give stack usage information and cflow can construct program flow.
101 Must have gcc 4.6 or later, which supports -fstack-usage
104 2) Perform the following shell command to generate a list of C files used in
106 $ find spl -name '*.su' | sed -e 's:^spl/::' -e 's:[.]su$:.c:' > used-spl.list
108 $ cflow --main=board_init_r `cat used-spl.list` 2>&1 | $PAGER
110 cflow will spit out a number of warnings as it does not parse
111 the config files and picks functions based on #ifdef. Parsing the '.i'
112 files instead introduces another set of headaches. These warnings are
113 not usually important to understanding the flow, however.