]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - common/image-fdt.c
Kconfig: Move CONFIG_FIT and related options to Kconfig
[people/ms/u-boot.git] / common / image-fdt.c
index ac4563f4a70f70d2e801edafe9dafb4b478517db..8c3f3e63740c08db668bcd6a6d9f96c68bdf2696 100644 (file)
@@ -14,6 +14,7 @@
 #include <errno.h>
 #include <image.h>
 #include <libfdt.h>
+#include <mapmem.h>
 #include <asm/io.h>
 
 #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:
@@ -230,13 +231,14 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
        ulong           fdt_addr;
        char            *fdt_blob = NULL;
        void            *buf;
-#if defined(CONFIG_FIT)
+#if CONFIG_IS_ENABLED(FIT)
        const char      *fit_uname_config = images->fit_uname_cfg;
        const char      *fit_uname_fdt = NULL;
        ulong           default_addr;
        int             fdt_noffset;
 #endif
        const char *select = NULL;
+       int             ok_no_fdt = 0;
 
        *of_flat_tree = NULL;
        *of_size = 0;
@@ -244,7 +246,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
        if (argc > 2)
                select = argv[2];
        if (select || genimg_has_config(images)) {
-#if defined(CONFIG_FIT)
+#if CONFIG_IS_ENABLED(FIT)
                if (select) {
                        /*
                         * If the FDT blob comes from the FIT image and the
@@ -274,7 +276,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                                debug("*  fdt: cmdline image address = 0x%08lx\n",
                                      fdt_addr);
                        }
-#if defined(CONFIG_FIT)
+#if CONFIG_IS_ENABLED(FIT)
                } else {
                        /* use FIT configuration provided in first bootm
                         * command argument
@@ -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;
                        }
 
@@ -349,13 +351,12 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                         * (libfdt based) and raw FDT blob (also libfdt
                         * based).
                         */
-#if defined(CONFIG_FIT)
+#if CONFIG_IS_ENABLED(FIT)
                        /* check FDT blob vs FIT blob */
                        if (fit_check_format(buf)) {
                                ulong load, len;
 
                                fdt_noffset = fit_image_load(images,
-                                       FIT_FDT_PROP,
                                        fdt_addr, &fit_uname_fdt,
                                        &fit_uname_config,
                                        arch, IH_TYPE_FLATDT,
@@ -380,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);
@@ -414,11 +415,11 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                        }
                } else {
                        debug("## No Flattened Device Tree\n");
-                       return 0;
+                       goto no_fdt;
                }
        } else {
                debug("## No Flattened Device Tree\n");
-               return 0;
+               goto no_fdt;
        }
 
        *of_flat_tree = fdt_blob;
@@ -428,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;
 }
 
@@ -443,7 +450,7 @@ error:
  * addresses of some of the devices in the device tree are compared with the
  * actual addresses at which U-Boot has placed them.
  *
- * Returns 1 on success, 0 on failure.  If 0 is returned, U-boot will halt the
+ * Returns 1 on success, 0 on failure.  If 0 is returned, U-Boot will halt the
  * boot process.
  */
 __weak int ft_verify_fdt(void *fdt)
@@ -451,7 +458,7 @@ __weak int ft_verify_fdt(void *fdt)
        return 1;
 }
 
-__weak int arch_fixup_memory_node(void *blob)
+__weak int arch_fixup_fdt(void *blob)
 {
        return 0;
 }
@@ -461,25 +468,46 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 {
        ulong *initrd_start = &images->initrd_start;
        ulong *initrd_end = &images->initrd_end;
-       int ret;
+       int ret = -EPERM;
+       int fdt_ret;
 
-       if (fdt_chosen(blob, 1) < 0) {
-               puts("ERROR: /chosen node create failed");
-               puts(" - must RESET the board to recover.\n");
-               return -1;
+       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;
+       }
+       if (arch_fixup_fdt(blob) < 0) {
+               printf("ERROR: arch-specific fdt fixup failed\n");
+               goto err;
+       }
+       if (IMAGE_OF_BOARD_SETUP) {
+               fdt_ret = ft_board_setup(blob, gd->bd);
+               if (fdt_ret) {
+                       printf("ERROR: board-specific fdt fixup failed: %s\n",
+                              fdt_strerror(fdt_ret));
+                       goto err;
+               }
+       }
+       if (IMAGE_OF_SYSTEM_SETUP) {
+               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;
+               }
        }
-       arch_fixup_memory_node(blob);
-       if (IMAGE_OF_BOARD_SETUP)
-               ft_board_setup(blob, gd->bd);
        fdt_fixup_ethernet(blob);
 
        /* Delete the old LMB reservation */
        lmb_free(lmb, (phys_addr_t)(u32)(uintptr_t)blob,
                 (phys_size_t)fdt_totalsize(blob));
 
-       ret = fdt_resize(blob);
+       ret = fdt_shrink_to_minimum(blob);
        if (ret < 0)
-               return ret;
+               goto err;
        of_size = ret;
 
        if (*initrd_start && *initrd_end) {
@@ -489,14 +517,18 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
        /* Create a new LMB reservation */
        lmb_reserve(lmb, (ulong)blob, of_size);
 
-       fdt_initrd(blob, *initrd_start, *initrd_end, 1);
+       fdt_initrd(blob, *initrd_start, *initrd_end);
        if (!ft_verify_fdt(blob))
-               return -1;
+               goto err;
 
-#ifdef CONFIG_SOC_K2HK
+#if defined(CONFIG_SOC_KEYSTONE)
        if (IMAGE_OF_BOARD_SETUP)
                ft_board_setup_ex(blob, gd->bd);
 #endif
 
        return 0;
+err:
+       printf(" - must RESET the board to recover.\n\n");
+
+       return ret;
 }