[PATCH 1/1] spl: add FIT support to semihosting boot method

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Sat Jul 22 21:27:48 CEST 2023


Allow loading a FIT image via semihosting in SPL.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
---
 common/spl/spl_semihosting.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/common/spl/spl_semihosting.c b/common/spl/spl_semihosting.c
index 5b5e842a11..f7dd289286 100644
--- a/common/spl/spl_semihosting.c
+++ b/common/spl/spl_semihosting.c
@@ -21,6 +21,23 @@ static int smh_read_full(long fd, void *memp, size_t len)
 	return 0;
 }
 
+static ulong smh_fit_read(struct spl_load_info *load, ulong file_offset,
+			  ulong size, void *buf)
+{
+	long fd;
+	ulong ret;
+
+	fd = smh_open(load->filename, MODE_READ | MODE_BINARY);
+	if (fd < 0) {
+		log_debug("could not open %s: %ld\n", load->filename, fd);
+		return 0;
+	}
+	ret = smh_read(fd, buf, size);
+	smh_close(fd);
+
+	return ret;
+}
+
 static int spl_smh_load_image(struct spl_image_info *spl_image,
 			      struct spl_boot_device *bootdev)
 {
@@ -49,6 +66,20 @@ static int spl_smh_load_image(struct spl_image_info *spl_image,
 		goto out;
 	}
 
+	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+	    image_get_magic(header) == FDT_MAGIC) {
+		struct spl_load_info load;
+
+		debug("Found FIT\n");
+		load.read = smh_fit_read;
+		load.bl_len = 1;
+		load.filename = filename;
+		load.priv = NULL;
+		smh_close(fd);
+
+		return spl_load_simple_fit(spl_image, &load, 0, header);
+	}
+
 	ret = spl_parse_image_header(spl_image, bootdev, header);
 	if (ret) {
 		log_debug("failed to parse image header: %d\n", ret);
-- 
2.40.1



More information about the U-Boot mailing list