[U-Boot] [RFC PATCH] arm: bootm: Boot kernel with U-Boot's FDT blob

Lokesh Vutla lokeshvutla at ti.com
Wed Jan 11 06:19:14 CET 2017



On Tuesday 10 January 2017 06:28 PM, Michal Simek wrote:
> U-Boot configured via DTB can use the same DTB for booting the kernel.
> When OF_CONTROL is used fdtcontroladdr is setup and can be use for boot.
> 
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
> 
> Didn't check if there is any side effect or not but it looks weird when
> you have DT driver u-boot that you have to load dtb again.
> 
> ---
>  arch/arm/lib/bootm.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index 43cc83ec95b6..9740045b0094 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -245,6 +245,20 @@ static void boot_prep_linux(bootm_headers_t *images)
>  		}
>  		setup_board_tags(&params);
>  		setup_end_tag(gd->bd);
> +	} else if (IS_ENABLED(CONFIG_OF_CONTROL)) {
> +#ifdef CONFIG_OF_LIBFDT
> +		images->ft_addr = (char *)getenv_hex("fdtcontroladdr", 0);

If your intent is to use U-Boot's fdt as fallback, why can't we just use
gd->fdt_blob instead of getting from env?

IMO, this is not the right place to get the fallback fdt. Instead it
should fallback at bootm_get_fdt() so that other parameters like
images->ft_length is also updated. Can you try the following diff?

diff --git a/common/image-fdt.c b/common/image-fdt.c
index e7540be8d6..f8714b3702 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -238,7 +238,6 @@ 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;
@@ -311,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 no_fdt;
+				goto fallback_fdt;

 			/*
 			 * move image data to the load address,
@@ -381,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 no_fdt;
+			goto fallback_fdt;
 		}

 		printf("   Booting using the fdt blob at %#08lx\n", fdt_addr);
@@ -415,11 +414,17 @@ int boot_get_fdt(int flag, int argc, char * const
argv[], uint8_t arch,
 			}
 		} else {
 			debug("## No Flattened Device Tree\n");
-			goto no_fdt;
+			goto fallback_fdt;
 		}
 	} else {
 		debug("## No Flattened Device Tree\n");
-		goto no_fdt;
+		goto fallback_fdt;
+	}
+
+fallback_fdt:
+	if (!fdt_blob) {
+		printf("## Using U-boot's fdt to boot kernel\n");
+		fdt_blob = (char *)gd->fdt_blob;
 	}

 	*of_flat_tree = fdt_blob;
@@ -429,12 +434,10 @@ 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) {
+	if (!select) {
 		debug("Continuing to boot without FDT\n");
 		return 0;
 	}

Thanks and regards,
Lokesh


More information about the U-Boot mailing list