summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorRichard Genoud <[email protected]>2026-03-13 11:42:26 +0100
committerTom Rini <[email protected]>2026-03-26 11:04:28 -0600
commit6494e823b46ced400764b6203d7480c9e3badc20 (patch)
treeb0bdbe490c25ab06c887c505e593221c20f1b916 /common
parent5e23f7f9f3b3c8fe78ed3aadeed9b187ba8930da (diff)
spl: add squashfs support
Implement spl_load_image_sqfs() in spl code. This will be used in MMC to read a file from a squashfs partition. Also, loosen squashfs read checks on file size by not failing when a bigger size than the actual file size is requested. (Just read the file) This is needed for FIT loading, because the length is ALIGNed. Signed-off-by: Richard Genoud <[email protected]> Reviewed-by: Miquel Raynal <[email protected]> Reviewed-by: João Marcos Costa <[email protected]>
Diffstat (limited to 'common')
-rw-r--r--common/spl/Makefile1
-rw-r--r--common/spl/spl_squashfs.c78
2 files changed, 79 insertions, 0 deletions
diff --git a/common/spl/Makefile b/common/spl/Makefile
index 4c9482bd309..53cc45fc5b9 100644
--- a/common/spl/Makefile
+++ b/common/spl/Makefile
@@ -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
diff --git a/common/spl/spl_squashfs.c b/common/spl/spl_squashfs.c
new file mode 100644
index 00000000000..d3b1c70bfc4
--- /dev/null
+++ b/common/spl/spl_squashfs.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Paratronic
+ * Copyright (C) 2026 Bootlin
+ *
+ * Author: Richard Genoud <[email protected]>
+ *
+ */
+
+#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;
+}