Merge branch 'master' of git://git.denx.de/u-boot-arm
[oweals/u-boot.git] / arch / powerpc / lib / bootm.c
index 6be22c474a4c0365c24ad23fcf3ebe52acb2a6c2..137547451b342a192424477a45faae802146f8d4 100644 (file)
@@ -87,7 +87,7 @@ static void boot_jump_linux(bootm_headers_t *images)
                 *   r8: 0
                 *   r9: 0
                 */
-#if defined(CONFIG_85xx) || defined(CONFIG_440)
+#if defined(CONFIG_MPC85xx) || defined(CONFIG_440)
  #define EPAPR_MAGIC   (0x45504150)
 #else
  #define EPAPR_MAGIC   (0x65504150)
@@ -226,6 +226,24 @@ static int boot_bd_t_linux(bootm_headers_t *images)
        return ret;
 }
 
+/*
+ * Verify the device tree.
+ *
+ * This function is called after all device tree fix-ups have been enacted,
+ * so that the final device tree can be verified.  The definition of "verified"
+ * is up to the specific implementation.  However, it generally means that the
+ * 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
+ * boot process.
+ */
+static int __ft_verify_fdt(void *fdt)
+{
+       return 1;
+}
+__attribute__((weak, alias("__ft_verify_fdt"))) int ft_verify_fdt(void *fdt);
+
 static int boot_body_linux(bootm_headers_t *images)
 {
        ulong rd_len;
@@ -239,6 +257,10 @@ static int boot_body_linux(bootm_headers_t *images)
 
        int ret;
 
+#if defined(CONFIG_OF_LIBFDT)
+       boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
+#endif
+
        /* allocate space and init command line */
        ret = boot_cmdline_linux(images);
        if (ret)
@@ -284,14 +306,19 @@ static int boot_body_linux(bootm_headers_t *images)
                        return ret;
                of_size = ret;
 
-               if (*initrd_start && *initrd_end)
+               if (*initrd_start && *initrd_end) {
                        of_size += FDT_RAMDISK_OVERHEAD;
+                       fdt_set_totalsize(*of_flat_tree, of_size);
+               }
                /* Create a new LMB reservation */
                lmb_reserve(lmb, (ulong)*of_flat_tree, of_size);
 
                /* fixup the initrd now that we know where it should be */
                if (*initrd_start && *initrd_end)
                        fdt_initrd(*of_flat_tree, *initrd_start, *initrd_end, 1);
+
+               if (!ft_verify_fdt(*of_flat_tree))
+                       return -1;
        }
 #endif /* CONFIG_OF_LIBFDT */
        return 0;