spl.rst 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. Generic SPL framework
  2. =====================
  3. Overview
  4. --------
  5. To unify all existing implementations for a secondary program loader (SPL)
  6. and to allow simply adding of new implementations this generic SPL framework
  7. has been created. With this framework almost all source files for a board
  8. can be reused. No code duplication or symlinking is necessary anymore.
  9. How it works
  10. ------------
  11. The object files for SPL are built separately and placed in the "spl" directory.
  12. The final binaries which are generated are u-boot-spl, u-boot-spl.bin and
  13. u-boot-spl.map.
  14. A config option named CONFIG_SPL_BUILD is enabled by Kconfig for SPL.
  15. Source files can therefore be compiled for SPL with different settings.
  16. For example::
  17. ifeq ($(CONFIG_SPL_BUILD),y)
  18. obj-y += board_spl.o
  19. else
  20. obj-y += board.o
  21. endif
  22. obj-$(CONFIG_SPL_BUILD) += foo.o
  23. #ifdef CONFIG_SPL_BUILD
  24. foo();
  25. #endif
  26. The building of SPL images can be enabled by CONFIG_SPL option in Kconfig.
  27. Because SPL images normally have a different text base, one has to be
  28. configured by defining CONFIG_SPL_TEXT_BASE. The linker script has to be
  29. defined with CONFIG_SPL_LDSCRIPT.
  30. To support generic U-Boot libraries and drivers in the SPL binary one can
  31. optionally define CONFIG_SPL_XXX_SUPPORT. Currently following options
  32. are supported:
  33. CONFIG_SPL_LIBCOMMON_SUPPORT (common/libcommon.o)
  34. CONFIG_SPL_LIBDISK_SUPPORT (disk/libdisk.o)
  35. CONFIG_SPL_I2C (drivers/i2c/libi2c.o)
  36. CONFIG_SPL_GPIO (drivers/gpio/libgpio.o)
  37. CONFIG_SPL_MMC (drivers/mmc/libmmc.o)
  38. CONFIG_SPL_SERIAL (drivers/serial/libserial.o)
  39. CONFIG_SPL_SPI_FLASH_SUPPORT (drivers/mtd/spi/libspi_flash.o)
  40. CONFIG_SPL_SPI (drivers/spi/libspi.o)
  41. CONFIG_SPL_FS_FAT (fs/fat/libfat.o)
  42. CONFIG_SPL_FS_EXT4
  43. CONFIG_SPL_LIBGENERIC_SUPPORT (lib/libgeneric.o)
  44. CONFIG_SPL_POWER (drivers/power/libpower.o)
  45. CONFIG_SPL_NAND_SUPPORT (drivers/mtd/nand/raw/libnand.o)
  46. CONFIG_SPL_DRIVERS_MISC (drivers/misc)
  47. CONFIG_SPL_DMA (drivers/dma/libdma.o)
  48. CONFIG_SPL_POST_MEM_SUPPORT (post/drivers/memory.o)
  49. CONFIG_SPL_NAND_LOAD (drivers/mtd/nand/raw/nand_spl_load.o)
  50. CONFIG_SPL_SPI_LOAD (drivers/mtd/spi/spi_spl_load.o)
  51. CONFIG_SPL_RAM_DEVICE (common/spl/spl.c)
  52. CONFIG_SPL_WATCHDOG (drivers/watchdog/libwatchdog.o)
  53. Adding SPL-specific code
  54. ------------------------
  55. To check whether a feature is enabled, use CONFIG_IS_ENABLED()::
  56. if (CONFIG_IS_ENABLED(CLK))
  57. ...
  58. This checks CONFIG_CLK for the main build, CONFIG_SPL_CLK for the SPL build,
  59. CONFIG_TPL_CLK for the TPL build, etc.
  60. U-Boot Boot Phases
  61. ------------------
  62. U-Boot goes through the following boot phases where TPL, VPL, SPL are optional.
  63. While many boards use SPL, less use TPL.
  64. TPL
  65. Very early init, as tiny as possible. This loads SPL (or VPL if enabled).
  66. VPL
  67. Optional verification step, which can select one of several SPL binaries,
  68. if A/B verified boot is enabled. Implementation of the VPL logic is
  69. work-in-progress. For now it just boots into SPL.
  70. SPL
  71. Secondary program loader. Sets up SDRAM and loads U-Boot proper. It may also
  72. load other firmware components.
  73. U-Boot
  74. U-Boot proper, containing the command line and boot logic.
  75. Further usages of U-Boot SPL comprise:
  76. * Launching BL31 of ARM Trusted Firmware which invokes main U-Boot as BL33
  77. * launching EDK II
  78. * launching Linux kernel
  79. * launching RISC-V OpenSBI which invokes main U-Boot
  80. Checking the boot phase
  81. -----------------------
  82. Use `spl_phase()` to find the current U-Boot phase, e.g. `PHASE_SPL`. You can
  83. also find the previous and next phase and get the phase name.
  84. Device tree
  85. -----------
  86. The U-Boot device tree is filtered by the fdtgrep tools during the build
  87. process to generate a much smaller device tree used in SPL (spl/u-boot-spl.dtb)
  88. with:
  89. - the mandatory nodes (/alias, /chosen, /config)
  90. - the nodes with one pre-relocation property:
  91. 'bootph-all' or 'bootph-pre-ram'
  92. fdtgrep is also used to remove:
  93. - the properties defined in CONFIG_OF_SPL_REMOVE_PROPS
  94. - all the pre-relocation properties
  95. ('bootph-all', 'bootph-pre-ram' (SPL), 'bootph-pre-sram' (TPL) and
  96. 'bootph-verify' (TPL))
  97. All the nodes remaining in the SPL devicetree are bound
  98. (see doc/driver-model/design.rst).
  99. NOTE: U-Boot migrated to a new schema for the u-boot,dm-* tags in 2023. Please
  100. update to use the new bootph-* tags as described in the
  101. doc/device-tree-bindings/bootph.yaml binding file.
  102. Debugging
  103. ---------
  104. When building SPL with DEBUG set you may also need to set CONFIG_PANIC_HANG
  105. as in most cases do_reset is not defined within SPL.
  106. Estimating stack usage
  107. ----------------------
  108. With gcc 4.6 (and later) and the use of GNU cflow it is possible to estimate
  109. stack usage at various points in run sequence of SPL. The -fstack-usage option
  110. to gcc will produce '.su' files (such as arch/arm/cpu/armv7/syslib.su) that
  111. will give stack usage information and cflow can construct program flow.
  112. Must have gcc 4.6 or later, which supports -fstack-usage:
  113. #. Build normally
  114. #. Perform the following shell command to generate a list of C files used in
  115. SPL:
  116. #. `find spl -name '*.su' | sed -e 's:^spl/::' -e 's:[.]su$:.c:' > used-spl.list`
  117. #. Execute cflow:
  118. `$ cflow --main=board_init_r $(cat used-spl.list) 2>&1 | $PAGER`
  119. cflow will spit out a number of warnings as it does not parse
  120. the config files and picks functions based on #ifdef. Parsing the '.i'
  121. files instead introduces another set of headaches. These warnings are
  122. not usually important to understanding the flow, however.