[U-Boot] [RFC PATCH] SPL: FIT: Enable SPL_FIT_LOAD for sd bootmode for fat partions

Michal Simek michal.simek at xilinx.com
Thu Apr 28 11:31:27 CEST 2016


Support U-Boot SPL to load FIT image from fat partition.
Fit image can be setup via CONFIG_SPL_FS_LOAD_KERNEL_NAME.
Falcon mode is not supported.

Signed-off-by: Michal Simek <michal.simek at xilinx.com>
---

 common/spl/spl_fat.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
 fs/fat/fat.c         |  4 ++--
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
index d16cd540e38a..4e319c5fa470 100644
--- a/common/spl/spl_fat.c
+++ b/common/spl/spl_fat.c
@@ -13,6 +13,7 @@
 #include <spl.h>
 #include <asm/u-boot.h>
 #include <fat.h>
+#include <libfdt.h>
 #include <errno.h>
 #include <image.h>
 
@@ -39,6 +40,29 @@ static int spl_register_fat_device(struct blk_desc *block_dev, int partition)
 	return err;
 }
 
+#ifdef CONFIG_SPL_LOAD_FIT
+static ulong spl_fat_file_read(struct spl_load_info *load, ulong sector,
+			       ulong count, void *buf)
+{
+	int err;
+	loff_t actread;
+	char *filename = (char *)load->priv;
+
+	debug("%s: name %s, sector %lx, count %lx, buf %lx\n",
+	      __func__, filename,  sector, count, (ulong)buf);
+
+	err = file_fat_read_at(filename, sector, buf, count, &actread);
+	if (err < 0) {
+		printf("%s: error reading image %s, err - %d\n",
+		       __func__, filename, err);
+		return err;
+	}
+
+	debug("actread %lx\n", (ulong)actread);
+	return actread;
+}
+#endif
+
 int spl_load_image_fat(struct blk_desc *block_dev,
 						int partition,
 						const char *filename)
@@ -57,16 +81,29 @@ int spl_load_image_fat(struct blk_desc *block_dev,
 	if (err <= 0)
 		goto end;
 
-	spl_parse_image_header(header);
+	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+	    image_get_magic(header) == FDT_MAGIC) {
+		struct spl_load_info load;
+
+		debug("Found FIT\n");
+		load.priv = (char *)filename;
+		load.bl_len = 1;
+		load.read = spl_fat_file_read;
+		spl_load_simple_fit(&load, 0, header);
+	} else {
+		debug("Legacy image\n");
 
-	err = file_fat_read(filename, (u8 *)(uintptr_t)spl_image.load_addr, 0);
+		spl_parse_image_header(header);
 
+		err = file_fat_read(filename,
+				    (u8 *)(uintptr_t)spl_image.load_addr, 0);
 end:
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
-	if (err <= 0)
-		printf("%s: error reading image %s, err - %d\n",
-		       __func__, filename, err);
+		if (err <= 0)
+			printf("%s: error reading image %s, err - %d\n",
+			       __func__, filename, err);
 #endif
+	}
 
 	return (err <= 0);
 }
@@ -81,6 +118,7 @@ int spl_load_image_fat_os(struct blk_desc *block_dev, int partition)
 	if (err)
 		return err;
 
+#if !defined(CONFIG_SPL_LOAD_FIT)
 #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT)
 	file = getenv("falcon_args_file");
 	if (file) {
@@ -116,7 +154,7 @@ defaults:
 #endif
 		return -1;
 	}
-
+#endif
 	return spl_load_image_fat(block_dev, partition,
 			CONFIG_SPL_FS_LOAD_KERNEL_NAME);
 }
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 600a90e30922..0d987e0465ee 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -281,9 +281,9 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
 
 	if ((unsigned long)buffer & (ARCH_DMA_MINALIGN - 1)) {
 		ALLOC_CACHE_ALIGN_BUFFER(__u8, tmpbuf, mydata->sect_size);
-
+#if !defined(CONFIG_SPL_LOAD_FIT)
 		printf("FAT: Misaligned buffer address (%p)\n", buffer);
-
+#endif
 		while (size >= mydata->sect_size) {
 			ret = disk_read(startsect++, 1, tmpbuf);
 			if (ret != 1) {
-- 
1.9.1



More information about the U-Boot mailing list