spl: Convert mmc to spl_load

This converts the mmc loader to spl_load. Legacy images are handled by
spl_load (via spl_parse_image_header), so mmc_load_legacy can be
omitted. To accurately determine whether mmc_load_image_raw_sector is used
(which might not be the case if SYS_MMCSD_FS_BOOT is enabled), we introduce
a helper config SYS_MMCSD_RAW_MODE. This ensures we can inline spl_load
correctly when a board only boots from filesystems. We still need to check
for SPL_MMC, since some boards enable configure raw mode even without MMC
support.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Sean Anderson 2023-11-08 11:48:50 -05:00 committed by Tom Rini
parent 682184e9b9
commit 5d3401a448
4 changed files with 16 additions and 85 deletions

View file

@ -481,6 +481,11 @@ config SPL_DISPLAY_PRINT
banner ("U-Boot SPL ..."). This function should be provided by banner ("U-Boot SPL ..."). This function should be provided by
the board. the board.
config SPL_SYS_MMCSD_RAW_MODE
bool
help
Support booting from an MMC without a filesystem.
config SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR config SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
bool "MMC raw mode: by sector" bool "MMC raw mode: by sector"
default y if ARCH_SUNXI || ARCH_DAVINCI || ARCH_UNIPHIER || \ default y if ARCH_SUNXI || ARCH_DAVINCI || ARCH_UNIPHIER || \
@ -490,6 +495,7 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
OMAP44XX || OMAP54XX || AM33XX || AM43XX || \ OMAP44XX || OMAP54XX || AM33XX || AM43XX || \
TARGET_SIFIVE_UNLEASHED || TARGET_SIFIVE_UNMATCHED TARGET_SIFIVE_UNLEASHED || TARGET_SIFIVE_UNMATCHED
select SPL_LOAD_BLOCK if SPL_MMC select SPL_LOAD_BLOCK if SPL_MMC
select SPL_SYS_MMCSD_RAW_MODE if SPL_MMC
help help
Use sector number for specifying U-Boot location on MMC/SD in Use sector number for specifying U-Boot location on MMC/SD in
raw mode. raw mode.
@ -527,6 +533,7 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
bool "MMC Raw mode: by partition" bool "MMC Raw mode: by partition"
select SPL_LOAD_BLOCK if SPL_MMC select SPL_LOAD_BLOCK if SPL_MMC
select SPL_SYS_MMCSD_RAW_MODE if SPL_MMC
help help
Use a partition for loading U-Boot when using MMC/SD in raw mode. Use a partition for loading U-Boot when using MMC/SD in raw mode.
@ -1114,6 +1121,7 @@ config SPL_FALCON_BOOT_MMCSD
bool "Enable Falcon boot from MMC or SD media" bool "Enable Falcon boot from MMC or SD media"
depends on SPL_OS_BOOT && SPL_MMC depends on SPL_OS_BOOT && SPL_MMC
select SPL_LOAD_BLOCK select SPL_LOAD_BLOCK
select SPL_SYS_MMCSD_RAW_MODE
help help
Select this if the Falcon mode OS image mode is on MMC or SD media. Select this if the Falcon mode OS image mode is on MMC or SD media.

View file

@ -8,9 +8,9 @@
#include <common.h> #include <common.h>
#include <dm.h> #include <dm.h>
#include <log.h> #include <log.h>
#include <mapmem.h>
#include <part.h> #include <part.h>
#include <spl.h> #include <spl.h>
#include <spl_load.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <errno.h> #include <errno.h>
#include <asm/u-boot.h> #include <asm/u-boot.h>
@ -19,49 +19,6 @@
#include <image.h> #include <image.h>
#include <imx_container.h> #include <imx_container.h>
static int mmc_load_legacy(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev,
struct mmc *mmc,
ulong sector, struct legacy_img_hdr *header)
{
u32 image_offset_sectors;
u32 image_size_sectors;
unsigned long count;
u32 image_offset;
int ret;
ret = spl_parse_image_header(spl_image, bootdev, header);
if (ret)
return ret;
/* convert offset to sectors - round down */
image_offset_sectors = spl_image->offset / mmc->read_bl_len;
/* calculate remaining offset */
image_offset = spl_image->offset % mmc->read_bl_len;
/* convert size to sectors - round up */
image_size_sectors = (spl_image->size + mmc->read_bl_len - 1) /
mmc->read_bl_len;
/* Read the header too to avoid extra memcpy */
count = blk_dread(mmc_get_blk_desc(mmc),
sector + image_offset_sectors,
image_size_sectors,
map_sysmem(spl_image->load_addr,
image_size_sectors * mmc->read_bl_len));
debug("read %x sectors to %lx\n", image_size_sectors,
spl_image->load_addr);
if (count != image_size_sectors)
return -EIO;
if (image_offset)
memmove((void *)(ulong)spl_image->load_addr,
(void *)(ulong)spl_image->load_addr + image_offset,
spl_image->size);
return 0;
}
static ulong h_spl_load_read(struct spl_load_info *load, ulong off, static ulong h_spl_load_read(struct spl_load_info *load, ulong off,
ulong size, void *buf) ulong size, void *buf)
{ {
@ -87,46 +44,14 @@ int mmc_load_image_raw_sector(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev, struct spl_boot_device *bootdev,
struct mmc *mmc, unsigned long sector) struct mmc *mmc, unsigned long sector)
{ {
unsigned long count; int ret;
struct legacy_img_hdr *header;
struct blk_desc *bd = mmc_get_blk_desc(mmc); struct blk_desc *bd = mmc_get_blk_desc(mmc);
int ret = 0;
header = spl_get_load_buffer(-sizeof(*header), bd->blksz);
/* read image header to find the image size & load address */
count = blk_dread(bd, sector, 1, header);
debug("hdr read sector %lx, count=%lu\n", sector, count);
if (count == 0) {
ret = -EIO;
goto end;
}
if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
image_get_magic(header) == FDT_MAGIC) {
struct spl_load_info load;
debug("Found FIT\n");
load.priv = bd;
spl_set_bl_len(&load, bd->blksz);
load.read = h_spl_load_read;
ret = spl_load_simple_fit(spl_image, &load,
sector << bd->log2blksz, header);
} else if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER) &&
valid_container_hdr((void *)header)) {
struct spl_load_info load; struct spl_load_info load;
load.priv = bd; load.priv = bd;
spl_set_bl_len(&load, bd->blksz); spl_set_bl_len(&load, bd->blksz);
load.read = h_spl_load_read; load.read = h_spl_load_read;
ret = spl_load(spl_image, bootdev, &load, 0, sector << bd->log2blksz);
ret = spl_load_imx_container(spl_image, &load,
sector << bd->log2blksz);
} else {
ret = mmc_load_legacy(spl_image, bootdev, mmc, sector, header);
}
end:
if (ret) { if (ret) {
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
puts("mmc_load_image_raw_sector: mmc block read error\n"); puts("mmc_load_image_raw_sector: mmc block read error\n");

View file

@ -97,6 +97,7 @@ static inline int _spl_load(struct spl_image_info *spl_image,
#define SPL_LOAD_USERS \ #define SPL_LOAD_USERS \
IS_ENABLED(CONFIG_SPL_FS_EXT4) + \ IS_ENABLED(CONFIG_SPL_FS_EXT4) + \
IS_ENABLED(CONFIG_SPL_FS_FAT) + \ IS_ENABLED(CONFIG_SPL_FS_FAT) + \
IS_ENABLED(CONFIG_SPL_SYS_MMCSD_RAW_MODE) + \
0 0
#if SPL_LOAD_USERS > 1 #if SPL_LOAD_USERS > 1

View file

@ -428,9 +428,6 @@ static int spl_test_mmc(struct unit_test_state *uts, const char *test_name,
if (spl_test_mmc_fs(uts, test_name, type, create_fat, false)) if (spl_test_mmc_fs(uts, test_name, type, create_fat, false))
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
if (type == LEGACY_LZMA)
return 0;
return do_spl_test_load(uts, test_name, type, return do_spl_test_load(uts, test_name, type,
SPL_LOAD_IMAGE_GET(0, BOOT_DEVICE_MMC1, SPL_LOAD_IMAGE_GET(0, BOOT_DEVICE_MMC1,
spl_mmc_load_image), spl_mmc_load_image),