[U-Boot] [PATCH v2 00/27] spl: Use linker list and parameters for SPL image loading

Simon Glass sjg at chromium.org
Sun Sep 25 02:19:50 CEST 2016


At present the SPL code uses a global spl_image variable which is shared
amongst lots of files, some in common/spl and some elsewhere. There is no
need for this to be global, and in fact a parameter makes it easier to
understand what information the functions act on. It also reduces the BSS
use in the SPL (at the expense of stack) which is useful on boards which
don't have BSS available early on.

There are many global functions for loading images from each boot device
type, like spl_mmc_load_image() and spl_spi_load_image(). Mostly these take
the same parameters (none or a u32). There are various rules for compiling
in calls to these functions and in some cases somewhat different rules for
compiling in the functions themselves. For example, spl_spi_load_image() is
called if either of CONFIG_SPL_SPI_SUPPORT or CONFIG_SPL_SPI__FLASHSUPPORT
is enabled, but included in the image if CONFIG_SPL_SPI_LOAD is enabled.

There is work in progress to look at that problem (Andrew F. Davis has sent
some patches [1]), and this series does not address it. But even with that
fixed its seems better to use a linker list and a consistent function
signature for loading images.

This series converts spl_image into a parameter and moves the SPL load
functions into a linker list, where each method is declared in the file
that provides it. The existing dispatching code is dropped.

There is a priorty value attached to each loader which should allow the
existing ordering to be maintained.

Code size is about 20 bytes larger on average which I think is acceptable.
The BSS size drops by about 64 bytes, but really this just transfers to
the stack.

There is an obvious follow-on from this, to move boot_name_table[] into the
same linker list struct (i.e. add a name field to struct spl_image_loader).
The complication here is that we don't want naming if
CONFIG_SPL_LIBCOMMON_SUPPORT is not enabled, since it bloats the code. In
addition I think that common/spl/spl.c can be tidied up a little.

Finally, my reading of the load functions is that they could do with some
rationalisation once we have a way to init any device without
subsystem-specific function calls. For example, spl_sata.c and spl_usb.c
contain very similar code but for the init methods.

[1] http://patchwork.ozlabs.org/patch/662945/

Changes in v2:
- Fix typo - rename spL_find_loader() to spl_ll_find_loader()
- Add a memset() to clear the spl_image data

Simon Glass (27):
  spl: Move spl_board_load_image() into a generic header
  spl: Add a parameter to spl_set_header_raw_uboot()
  spl: Add a parameter to spl_parse_image_header()
  spl: Add a parameter to jump_to_image_linux()
  spl: Add function comments to spl_start_uboot()
  spl: Kconfig: Move SPL_DISPLAY_PRINT to Kconfig
  spl: Convert boot_device into a struct
  spl: Add a way to declare an SPL image loader
  spl: Convert spl_ram_load_image() to use linker list
  spl: Convert spl_mmc_load_image() to use linker list
  spl: Convert spl_ubi_load_image() to use linker list
  spl: Convert spl_nand_load_image() to use linker list
  spl: Convert spl_onenand_load_image() to use linker list
  spl: Convert spl_nor_load_image() to use linker list
  spl: Convert spl_ymodem_load_image() to use linker list
  spl: Convert spl_usb_load_image() to use linker list
  spl: Convert spl_sata_load_image() to use linker list
  spl: spi: Move the generic SPI loader into common/spl
  spl: Convert spl_spi_load_image() to use linker list
  spi: Move freescale-specific code into a private header
  spl: Convert spl_net_load_image() to use linker list
  spl: Convert spl_board_load_image() to use linker list
  spl: Pass spl_image as a parameter to load_image() methods
  spl: Update ext functions to take an spl_image parameter
  spl: Update fat functions to take an spl_image parameter
  spl: Update spl_load_simple_fit() to take an spl_image param
  spl: Make spl_boot_list a local variable

 arch/arm/cpu/armv7/omap4/Kconfig                   |   3 +
 arch/arm/cpu/armv7/omap5/Kconfig                   |   3 +
 arch/arm/include/asm/spl.h                         |   9 --
 arch/arm/lib/spl.c                                 |   4 +-
 arch/arm/mach-sunxi/board.c                        |   6 +-
 arch/arm/mach-uniphier/boot-mode/spl_board.c       |  10 +-
 arch/microblaze/cpu/spl.c                          |   4 +-
 arch/powerpc/lib/spl.c                             |   4 +-
 arch/sandbox/cpu/spl.c                             |   4 +-
 arch/sandbox/include/asm/spl.h                     |   8 -
 board/Arcturus/ucp1020/spl.c                       |   2 -
 board/freescale/common/spl.h                       |  13 ++
 board/freescale/p1010rdb/spl.c                     |   3 +-
 board/freescale/p1022ds/spl.c                      |   3 +-
 board/freescale/p1_p2_rdb_pc/spl.c                 |   3 +-
 board/freescale/t102xqds/spl.c                     |   7 +-
 board/freescale/t102xrdb/spl.c                     |   7 +-
 board/freescale/t104xrdb/spl.c                     |   7 +-
 board/freescale/t208xqds/spl.c                     |   7 +-
 board/freescale/t208xrdb/spl.c                     |   7 +-
 common/spl/Kconfig                                 |   9 ++
 common/spl/Makefile                                |   1 +
 common/spl/spl.c                                   | 178 ++++++++-------------
 common/spl/spl_ext.c                               |  21 +--
 common/spl/spl_fat.c                               |  23 +--
 common/spl/spl_fit.c                               |   9 +-
 common/spl/spl_mmc.c                               |  72 +++++----
 common/spl/spl_nand.c                              |  37 +++--
 common/spl/spl_net.c                               |  36 ++++-
 common/spl/spl_nor.c                               |  18 ++-
 common/spl/spl_onenand.c                           |   9 +-
 common/spl/spl_sata.c                              |  15 +-
 .../mtd/spi/spi_spl_load.c => common/spl/spl_spi.c |  22 +--
 common/spl/spl_ubi.c                               |  14 +-
 common/spl/spl_usb.c                               |  17 +-
 common/spl/spl_ymodem.c                            |  13 +-
 drivers/mtd/spi/Makefile                           |   1 -
 drivers/mtd/spi/fsl_espi_spl.c                     |   4 +-
 drivers/mtd/spi/sunxi_spi_spl.c                    |  11 +-
 include/configs/ti_omap4_common.h                  |   1 -
 include/configs/ti_omap5_common.h                  |   1 -
 include/spi_flash.h                                |   3 -
 include/spl.h                                      | 151 +++++++++++++----
 43 files changed, 463 insertions(+), 317 deletions(-)
 create mode 100644 board/freescale/common/spl.h
 rename drivers/mtd/spi/spi_spl_load.c => common/spl/spl_spi.c (78%)

-- 
2.8.0.rc3.226.g39d4020



More information about the U-Boot mailing list