Merge patch series "Introduce SQUASHFS support in SPL"

Richard Genoud <richard.genoud@bootlin.com> says:

SquashFS has support in U-Boot, but not in SPL.

This series adds the possibility for the SPL to load files from SquashFS
partitions.
This is useful, for instance, when there's a SquashFS rootfs containing
U-Boot binary.

NB: falcon mode is not supported yet.

Link: https://lore.kernel.org/r/20260313104229.1555236-1-richard.genoud@bootlin.com
This commit is contained in:
Tom Rini
2026-03-26 11:04:41 -06:00
9 changed files with 135 additions and 64 deletions

View File

@@ -29,6 +29,7 @@ obj-$(CONFIG_$(PHASE_)OPENSBI) += spl_opensbi.o
obj-$(CONFIG_$(PHASE_)USB_STORAGE) += spl_usb.o
obj-$(CONFIG_$(PHASE_)FS_FAT) += spl_fat.o
obj-$(CONFIG_$(PHASE_)FS_EXT4) += spl_ext.o
obj-$(CONFIG_$(PHASE_)FS_SQUASHFS) += spl_squashfs.o
obj-$(CONFIG_$(PHASE_)LOAD_IMX_CONTAINER) += spl_imx_container.o
obj-$(CONFIG_$(PHASE_)SATA) += spl_sata.o
obj-$(CONFIG_$(PHASE_)NVME) += spl_nvme.o

View File

@@ -226,6 +226,11 @@ static int __maybe_unused spl_mmc_fs_load(struct spl_image_info *spl_image,
if (!err)
return 0;
}
if (CONFIG_IS_ENABLED(FS_SQUASHFS)) {
err = spl_load_image_sqfs(spl_image, bootdev, blk_dev, part, file);
if (!err)
return 0;
}
return err;
}
@@ -284,13 +289,15 @@ static int spl_mmc_do_fs_boot(struct spl_image_info *spl_image,
u32 __weak spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device)
{
#if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
return MMCSD_MODE_FS;
#elif defined(CONFIG_SUPPORT_EMMC_BOOT)
return MMCSD_MODE_EMMCBOOT;
#else
if (CONFIG_IS_ENABLED(FS_FAT) ||
CONFIG_IS_ENABLED(FS_EXT4) ||
CONFIG_IS_ENABLED(FS_SQUASHFS))
return MMCSD_MODE_FS;
if (IS_ENABLED(CONFIG_SUPPORT_EMMC_BOOT))
return MMCSD_MODE_EMMCBOOT;
return MMCSD_MODE_RAW;
#endif
}
#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION

78
common/spl/spl_squashfs.c Normal file
View File

@@ -0,0 +1,78 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2020 Paratronic
* Copyright (C) 2026 Bootlin
*
* Author: Richard Genoud <richard.genoud@bootlin.com>
*
*/
#include <env.h>
#include <part.h>
#include <spl.h>
#include <spl_load.h>
#include <squashfs.h>
#include <errno.h>
#include <image.h>
static ulong spl_fit_read(struct spl_load_info *load, ulong file_offset,
ulong size, void *buf)
{
struct legacy_img_hdr *header;
char *filename = load->priv;
loff_t actread;
int ret;
ret = sqfs_read(filename, buf, file_offset, size, &actread);
if (ret)
return ret;
if (CONFIG_IS_ENABLED(OS_BOOT)) {
header = (struct legacy_img_hdr *)buf;
if (image_get_magic(header) != FDT_MAGIC)
return size;
}
return actread;
}
int spl_load_image_sqfs(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev,
struct blk_desc *block_dev, int partition,
const char *filename)
{
int err;
loff_t size = 0;
struct spl_load_info load;
struct disk_partition part_info = {};
err = part_get_info(block_dev, partition, &part_info);
if (err) {
printf("spl: no partition table found\n");
goto end;
}
err = sqfs_probe(block_dev, &part_info);
if (err) {
printf("spl: sqfs probe err part_name:%s type=%s err=%d\n",
part_info.name, part_info.type, err);
goto end;
}
if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL)) {
err = sqfs_size(filename, &size);
if (err)
goto end;
}
spl_load_init(&load, spl_fit_read, (void *)filename, 1);
err = spl_load(spl_image, bootdev, &load, size, 0);
end:
if (err < 0)
printf("%s: error reading image %s, err - %d\n",
__func__, filename, err);
return err;
}