Allow loading a FIT image via semihosting in SPL.

Signed-off-by: Heinrich Schuchardt <heinrich.schucha...@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

Reply via email to