README.SPL 3.78 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Generic SPL framework
=====================

Overview
--------

To unify all existing implementations for a secondary program loader (SPL)
and to allow simply adding of new implementations this generic SPL framework
has been created. With this framework almost all source files for a board
can be reused. No code duplication or symlinking is necessary anymore.


How it works
------------

16
The object files for SPL are built separately and placed in the "spl" directory.
17
18
19
The final binaries which are generated are u-boot-spl, u-boot-spl.bin and
u-boot-spl.map.

20
A config option named CONFIG_SPL_BUILD is enabled by Kconfig for SPL.
21
22
23
24
25
Source files can therefore be compiled for SPL with different settings.

For example:

ifeq ($(CONFIG_SPL_BUILD),y)
26
obj-y += board_spl.o
27
else
28
obj-y += board.o
29
30
endif

31
obj-$(CONFIG_SPL_BUILD) += foo.o
32
33

#ifdef CONFIG_SPL_BUILD
Wolfgang Denk's avatar
Wolfgang Denk committed
34
	foo();
35
36
37
#endif


38
The building of SPL images can be enabled by CONFIG_SPL option in Kconfig.
39

Peter Meerwald's avatar
Peter Meerwald committed
40
41
Because SPL images normally have a different text base, one has to be
configured by defining CONFIG_SPL_TEXT_BASE. The linker script has to be
42
43
44
45
46
47
48
49
defined with CONFIG_SPL_LDSCRIPT.

To support generic U-Boot libraries and drivers in the SPL binary one can
optionally define CONFIG_SPL_XXX_SUPPORT. Currently following options
are supported:

CONFIG_SPL_LIBCOMMON_SUPPORT (common/libcommon.o)
CONFIG_SPL_LIBDISK_SUPPORT (disk/libdisk.o)
50
CONFIG_SPL_I2C (drivers/i2c/libi2c.o)
Simon Glass's avatar
Simon Glass committed
51
CONFIG_SPL_GPIO (drivers/gpio/libgpio.o)
Simon Glass's avatar
Simon Glass committed
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)
Simon Glass's avatar
Simon Glass committed
55
CONFIG_SPL_SPI (drivers/spi/libspi.o)
56
CONFIG_SPL_FS_FAT (fs/fat/libfat.o)
57
CONFIG_SPL_FS_EXT4
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)
68

69
70
71
72
73
74
75
76
77
Device tree
-----------
The U-Boot device tree is filtered by the fdtgrep tools during the build
process to generate a much smaller device tree used in SPL (spl/u-boot-spl.dtb)
with:
- the mandatory nodes (/alias, /chosen, /config)
- the nodes with one pre-relocation property:
  'u-boot,dm-pre-reloc' or 'u-boot,dm-spl'

78
fdtgrep is also used to remove:
79
80
81
82
83
- the properties defined in CONFIG_OF_SPL_REMOVE_PROPS
- all the pre-relocation properties
  ('u-boot,dm-pre-reloc', 'u-boot,dm-spl' and 'u-boot,dm-tpl')

All the nodes remaining in the SPL devicetree are bound
84
(see doc/driver-model/design.rst).
85
86
87
88
89
90

Debugging
---------

When building SPL with DEBUG set you may also need to set CONFIG_PANIC_HANG
as in most cases do_reset is not defined within SPL.
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113


Estimating stack usage
----------------------

With gcc 4.6 (and later) and the use of GNU cflow it is possible to estimate
stack usage at various points in run sequence of SPL.  The -fstack-usage option
to gcc will produce '.su' files (such as arch/arm/cpu/armv7/syslib.su) that
will give stack usage information and cflow can construct program flow.

Must have gcc 4.6 or later, which supports -fstack-usage

1) Build normally
2) Perform the following shell command to generate a list of C files used in
SPL:
$ find spl -name '*.su' | sed -e 's:^spl/::' -e 's:[.]su$:.c:' > used-spl.list
3) Execute cflow:
$ cflow --main=board_init_r `cat used-spl.list` 2>&1 | $PAGER

cflow will spit out a number of warnings as it does not parse
the config files and picks functions based on #ifdef.  Parsing the '.i'
files instead introduces another set of headaches.  These warnings are
not usually important to understanding the flow, however.