diff mbox

[U-Boot,v2] fdt: Allow non-FDT kernels to boot when CONFIG_OF_LIBFDT is defined

Message ID 1417123456-30398-1-git-send-email-suriyan.r@gmail.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Suriyan Ramasami Nov. 27, 2014, 9:24 p.m. UTC
The boot commands - bootz/bootm mandate a third argument which is the
address to the FDT blob. In cases where this argument is not specified,
boot fails with a message indicating a missing FDT.

This causes non-FDT kernels to fail to boot. This patch allows both FDT
and non-FDT kernels to boot by making the third parameter to the bootm/bootz
optional.

Signed-off-by: Suriyan Ramasami <suriyan.r@gmail.com>

---

Changes in v2:
- Simon: take care of real non error cases by introducing a no_fdt label to
  jump to instead of piggy backing on the error label. Also, use !select
  instead of argc <= 2.
- I am assuming this will have to be Tested-by and Acked-by again as there
  are more code changes than before. Hence dropping them.

Changes in v1:
- First try

 common/image-fdt.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

Comments

Simon Glass Nov. 30, 2014, 3:42 a.m. UTC | #1
On 27 November 2014 at 14:24, Suriyan Ramasami <suriyan.r@gmail.com> wrote:
> The boot commands - bootz/bootm mandate a third argument which is the
> address to the FDT blob. In cases where this argument is not specified,
> boot fails with a message indicating a missing FDT.
>
> This causes non-FDT kernels to fail to boot. This patch allows both FDT
> and non-FDT kernels to boot by making the third parameter to the bootm/bootz
> optional.
>
> Signed-off-by: Suriyan Ramasami <suriyan.r@gmail.com>
>
> ---
>
> Changes in v2:
> - Simon: take care of real non error cases by introducing a no_fdt label to
>   jump to instead of piggy backing on the error label. Also, use !select
>   instead of argc <= 2.
> - I am assuming this will have to be Tested-by and Acked-by again as there
>   are more code changes than before. Hence dropping them.
>
> Changes in v1:
> - First try
>
>  common/image-fdt.c | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)

Looks good, thanks!

Acked-by: Simon Glass <sjg@chromium.org>
Tom Rini Dec. 8, 2014, 9:43 p.m. UTC | #2
On Thu, Nov 27, 2014 at 01:24:16PM -0800, Suriyan Ramasami wrote:

> The boot commands - bootz/bootm mandate a third argument which is the
> address to the FDT blob. In cases where this argument is not specified,
> boot fails with a message indicating a missing FDT.
> 
> This causes non-FDT kernels to fail to boot. This patch allows both FDT
> and non-FDT kernels to boot by making the third parameter to the bootm/bootz
> optional.
> 
> Signed-off-by: Suriyan Ramasami <suriyan.r@gmail.com>
> Acked-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/common/image-fdt.c b/common/image-fdt.c
index 1d76bd6..e3f06cd 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -237,6 +237,7 @@  int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
 	int		fdt_noffset;
 #endif
 	const char *select = NULL;
+	int		ok_no_fdt = 0;
 
 	*of_flat_tree = NULL;
 	*of_size = 0;
@@ -309,7 +310,7 @@  int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
 			       fdt_addr);
 			fdt_hdr = image_get_fdt(fdt_addr);
 			if (!fdt_hdr)
-				goto error;
+				goto no_fdt;
 
 			/*
 			 * move image data to the load address,
@@ -379,7 +380,7 @@  int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
 			break;
 		default:
 			puts("ERROR: Did not find a cmdline Flattened Device Tree\n");
-			goto error;
+			goto no_fdt;
 		}
 
 		printf("   Booting using the fdt blob at %#08lx\n", fdt_addr);
@@ -413,11 +414,11 @@  int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
 			}
 		} else {
 			debug("## No Flattened Device Tree\n");
-			goto error;
+			goto no_fdt;
 		}
 	} else {
 		debug("## No Flattened Device Tree\n");
-		goto error;
+		goto no_fdt;
 	}
 
 	*of_flat_tree = fdt_blob;
@@ -427,9 +428,15 @@  int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
 
 	return 0;
 
+no_fdt:
+	ok_no_fdt = 1;
 error:
 	*of_flat_tree = NULL;
 	*of_size = 0;
+	if (!select && ok_no_fdt) {
+		debug("Continuing to boot without FDT\n");
+		return 0;
+	}
 	return 1;
 }