
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%)