X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=common%2Fimage-fdt.c;h=5e4e5bd914e8757f8e413586143a3067ecb7da37;hb=d39449b110c8da47bf5b8dc372bd5cd1c33a1a67;hp=1d76bd60da843404d9dda64e4c5a93630e7ecb5e;hpb=c654b5172a65faba2b541ee1fda1738534d47241;p=karo-tx-uboot.git diff --git a/common/image-fdt.c b/common/image-fdt.c index 1d76bd60da..5e4e5bd914 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #ifndef CONFIG_SYS_FDT_PAD @@ -190,7 +191,7 @@ int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size) *of_flat_tree = of_start; *of_size = of_len; - set_working_fdt_addr(*of_flat_tree); + set_working_fdt_addr((ulong)*of_flat_tree); return 0; error: @@ -237,6 +238,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 +311,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, @@ -324,7 +326,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch, if (load == image_start || load == image_data) { - fdt_blob = (char *)image_data; + fdt_addr = load; break; } @@ -379,7 +381,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 +415,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 +429,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; } @@ -463,6 +471,10 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob, int ret = -EPERM; int fdt_ret; + if (fdt_root(blob) < 0) { + printf("ERROR: root node setup failed\n"); + goto err; + } if (fdt_chosen(blob) < 0) { printf("ERROR: /chosen node create failed\n"); goto err; @@ -480,7 +492,8 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob, } } if (IMAGE_OF_SYSTEM_SETUP) { - if (ft_system_setup(blob, gd->bd)) { + fdt_ret = ft_system_setup(blob, gd->bd); + if (fdt_ret) { printf("ERROR: system-specific fdt fixup failed: %s\n", fdt_strerror(fdt_ret)); goto err;