diff mbox

[U-Boot,2/2] spl: Support loading a FIT from NAND

Message ID 1460453371-7790-3-git-send-email-lokeshvutla@ti.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Lokesh Vutla April 12, 2016, 9:29 a.m. UTC
Detect a FIT when loading from NAND and handle it using the
new FIT SPL support.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 common/spl/spl_nand.c | 33 ++++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

Comments

Tom Rini April 12, 2016, 4:03 p.m. UTC | #1
On Tue, Apr 12, 2016 at 02:59:31PM +0530, Lokesh Vutla wrote:

> Detect a FIT when loading from NAND and handle it using the
> new FIT SPL support.
> 
> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>

Reviewed-by: Tom Rini <trini@konsulko.com>
diff mbox

Patch

diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 79388ff..479eb89 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -9,6 +9,8 @@ 
 #include <spl.h>
 #include <asm/io.h>
 #include <nand.h>
+#include <libfdt_env.h>
+#include <fdt.h>
 
 #if defined(CONFIG_SPL_NAND_RAW_ONLY)
 int spl_nand_load_image(void)
@@ -24,6 +26,19 @@  int spl_nand_load_image(void)
 	return 0;
 }
 #else
+
+static ulong spl_nand_fit_read(struct spl_load_info *load, ulong offs,
+			       ulong size, void *dst)
+{
+	int ret;
+
+	ret = nand_spl_load_image(offs, size, dst);
+	if (!ret)
+		return size;
+	else
+		return 0;
+}
+
 static int spl_nand_load_element(int offset, struct image_header *header)
 {
 	int err;
@@ -32,9 +47,21 @@  static int spl_nand_load_element(int offset, struct image_header *header)
 	if (err)
 		return err;
 
-	spl_parse_image_header(header);
-	return nand_spl_load_image(offset, spl_image.size,
-				   (void *)(unsigned long)spl_image.load_addr);
+	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+	    image_get_magic(header) == FDT_MAGIC) {
+		struct spl_load_info load;
+
+		debug("Found FIT\n");
+		load.dev = NULL;
+		load.priv = NULL;
+		load.bl_len = 1;
+		load.read = spl_nand_fit_read;
+		return spl_load_simple_fit(&load, offset, header);
+	} else {
+		spl_parse_image_header(header);
+		return nand_spl_load_image(offset, spl_image.size,
+					   (void *)spl_image.load_addr);
+	}
 }
 
 int spl_nand_load_image(void)