All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 1/3] image: fix bootm failure for FIT image
@ 2014-08-15 20:55 Bryan Wu
  2014-08-15 20:55 ` [U-Boot] [PATCH 2/3] image: move all function comments to header file Bryan Wu
                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Bryan Wu @ 2014-08-15 20:55 UTC (permalink / raw)
  To: u-boot

Commit b3dd64f5d537 "bootm: use genimg_get_kernel_addr()" introduced
a bug for booting FIT image. It's because calling fit_parse_config()
twice will give us wrong value in img_addr.

Add a new version for CONFIG_FIT of genimg_get_kernel_addr() and
return fit_uname_config and fit_uname_kernel for CONFIG_FIT.

Reported-by: York Sun <yorksun@freescale.com>
Signed-off-by: Bryan Wu <pengw@nvidia.com>
---
 common/bootm.c   |  9 +++++----
 common/cmd_pxe.c |  9 +++++++++
 common/image.c   | 19 ++++++++++---------
 include/image.h  |  6 ++++++
 4 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/common/bootm.c b/common/bootm.c
index 76d811c..85b71ba 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -731,7 +731,12 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
 	int		os_noffset;
 #endif
 
+#if defined(CONFIG_FIT)
+	img_addr = genimg_get_kernel_addr(argv[0], &fit_uname_config,
+					  &fit_uname_kernel);
+#else
 	img_addr = genimg_get_kernel_addr(argv[0]);
+#endif
 
 	bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
 
@@ -788,10 +793,6 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
 #endif
 #if defined(CONFIG_FIT)
 	case IMAGE_FORMAT_FIT:
-		if (!fit_parse_conf(argv[0], load_addr, &img_addr,
-					&fit_uname_config))
-			fit_parse_subimage(argv[0], load_addr, &img_addr,
-					&fit_uname_kernel);
 		os_noffset = fit_image_load(images, img_addr,
 				&fit_uname_kernel, &fit_uname_config,
 				IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
index c816339..9a2c370 100644
--- a/common/cmd_pxe.c
+++ b/common/cmd_pxe.c
@@ -612,6 +612,10 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
 	int len = 0;
 	ulong kernel_addr;
 	void *buf;
+#if defined(CONFIG_FIT)
+	const char *fit_uname_config = NULL;
+	const char *fit_uname_kernel = NULL;
+#endif
 
 	label_print(label);
 
@@ -774,7 +778,12 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
 	if (bootm_argv[3])
 		bootm_argc = 4;
 
+#if defined(CONFIG_FIT)
+	kernel_addr = genimg_get_kernel_addr(bootm_argv[1], &fit_uname_config,
+					     &fit_uname_kernel);
+#else
 	kernel_addr = genimg_get_kernel_addr(bootm_argv[1]);
+#endif
 	buf = map_sysmem(kernel_addr, 0);
 	/* Try bootm for legacy and FIT format image */
 	if (genimg_get_format(buf) != IMAGE_FORMAT_INVALID)
diff --git a/common/image.c b/common/image.c
index a2999c0..ea980cb 100644
--- a/common/image.c
+++ b/common/image.c
@@ -652,13 +652,14 @@ int genimg_get_comp_id(const char *name)
  * returns:
  *     kernel start address
  */
-ulong genimg_get_kernel_addr(char * const img_addr)
-{
 #if defined(CONFIG_FIT)
-	const char	*fit_uname_config = NULL;
-	const char	*fit_uname_kernel = NULL;
+ulong genimg_get_kernel_addr(char * const img_addr,
+			     const char **fit_uname_config,
+			     const char **fit_uname_kernel)
+#else
+ulong genimg_get_kernel_addr(char * const img_addr)
 #endif
-
+{
 	ulong kernel_addr;
 
 	/* find out kernel image address */
@@ -668,13 +669,13 @@ ulong genimg_get_kernel_addr(char * const img_addr)
 		      load_addr);
 #if defined(CONFIG_FIT)
 	} else if (fit_parse_conf(img_addr, load_addr, &kernel_addr,
-				  &fit_uname_config)) {
+				  fit_uname_config)) {
 		debug("*  kernel: config '%s' from image at 0x%08lx\n",
-		      fit_uname_config, kernel_addr);
+		      *fit_uname_config, kernel_addr);
 	} else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr,
-				     &fit_uname_kernel)) {
+				     fit_uname_kernel)) {
 		debug("*  kernel: subimage '%s' from image at 0x%08lx\n",
-		      fit_uname_kernel, kernel_addr);
+		      *fit_uname_kernel, kernel_addr);
 #endif
 	} else {
 		kernel_addr = simple_strtoul(img_addr, NULL, 16);
diff --git a/include/image.h b/include/image.h
index ca2fe86..a47c146 100644
--- a/include/image.h
+++ b/include/image.h
@@ -424,7 +424,13 @@ enum fit_load_op {
 #define IMAGE_FORMAT_FIT	0x02	/* new, libfdt based format */
 #define IMAGE_FORMAT_ANDROID	0x03	/* Android boot image */
 
+#if defined(CONFIG_FIT)
+ulong genimg_get_kernel_addr(char * const img_addr,
+			     const char	**fit_uname_config,
+			     const char	**fit_uname_kernel);
+#else
 ulong genimg_get_kernel_addr(char * const img_addr);
+#endif
 int genimg_get_format(const void *img_addr);
 int genimg_has_config(bootm_headers_t *images);
 ulong genimg_get_image(ulong img_addr);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2014-09-22  6:41 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-15 20:55 [U-Boot] [PATCH v2 1/3] image: fix bootm failure for FIT image Bryan Wu
2014-08-15 20:55 ` [U-Boot] [PATCH 2/3] image: move all function comments to header file Bryan Wu
2014-08-15 22:01   ` Jeroen Hofstee
2014-08-15 22:07     ` Bryan Wu
2014-08-15 22:10       ` York Sun
2014-08-15 22:11         ` Bryan Wu
2014-08-15 22:14           ` Stephen Warren
2014-08-15 22:25             ` York Sun
2014-08-15 22:56               ` Bryan Wu
2014-08-18 18:18                 ` Simon Glass
2014-08-23 12:42   ` [U-Boot] [U-Boot, " Tom Rini
2014-08-23 17:48     ` Tom Rini
2014-09-19 23:17       ` Simon Glass
2014-09-20  5:34         ` Masahiro YAMADA
2014-09-20  7:39           ` Albert ARIBAUD
2014-09-22  6:41           ` Simon Glass
2014-08-15 20:55 ` [U-Boot] [PATCH 3/3] bootm: make sure pass NULL when argc < 1 Bryan Wu
2014-08-22 20:36 ` [U-Boot] [PATCH v2 1/3] image: fix bootm failure for FIT image Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.