Merge branch 'agust@denx.de-next' of git://git.denx.de/u-boot-staging
[platform/kernel/u-boot.git] / arch / arm / lib / bootm.c
index 160ba55..37476cc 100644 (file)
@@ -69,8 +69,8 @@ void arch_lmb_reserve(struct lmb *lmb)
        sp = get_sp();
        debug("## Current stack ends at 0x%08lx ", sp);
 
-       /* adjust sp by 1K to be safe */
-       sp -= 1024;
+       /* adjust sp by 4K to be safe */
+       sp -= 4096;
        lmb_reserve(lmb, sp,
                    gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size - sp);
 }
@@ -96,6 +96,9 @@ static void announce_and_cleanup(void)
 {
        printf("\nStarting kernel ...\n\n");
        bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel");
+#ifdef CONFIG_BOOTSTAGE_FDT
+       bootstage_fdt_add_report();
+#endif
 #ifdef CONFIG_BOOTSTAGE_REPORT
        bootstage_report();
 #endif
@@ -256,7 +259,11 @@ static int create_fdt(bootm_headers_t *images)
 
        fdt_chosen(*of_flat_tree, 1);
        fixup_memory_node(*of_flat_tree);
+       fdt_fixup_ethernet(*of_flat_tree);
        fdt_initrd(*of_flat_tree, *initrd_start, *initrd_end, 1);
+#ifdef CONFIG_OF_BOARD_SETUP
+       ft_board_setup(*of_flat_tree, gd->bd);
+#endif
 
        return 0;
 }
@@ -317,6 +324,7 @@ static void boot_jump_linux(bootm_headers_t *images)
        unsigned long machid = gd->bd->bi_arch_number;
        char *s;
        void (*kernel_entry)(int zero, int arch, uint params);
+       unsigned long r2;
 
        kernel_entry = (void (*)(int, int, uint))images->ep;
 
@@ -330,7 +338,15 @@ static void boot_jump_linux(bootm_headers_t *images)
                "...\n", (ulong) kernel_entry);
        bootstage_mark(BOOTSTAGE_ID_RUN_OS);
        announce_and_cleanup();
-       kernel_entry(0, machid, gd->bd->bi_boot_params);
+
+#ifdef CONFIG_OF_LIBFDT
+       if (images->ft_len)
+               r2 = (unsigned long)images->ft_addr;
+       else
+#endif
+               r2 = gd->bd->bi_boot_params;
+
+       kernel_entry(0, machid, r2);
 }
 
 /* Main Entry point for arm bootm implementation
@@ -359,3 +375,33 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
        boot_jump_linux(images);
        return 0;
 }
+
+#ifdef CONFIG_CMD_BOOTZ
+
+struct zimage_header {
+       uint32_t        code[9];
+       uint32_t        zi_magic;
+       uint32_t        zi_start;
+       uint32_t        zi_end;
+};
+
+#define        LINUX_ARM_ZIMAGE_MAGIC  0x016f2818
+
+int bootz_setup(void *image, void **start, void **end)
+{
+       struct zimage_header *zi = (struct zimage_header *)image;
+
+       if (zi->zi_magic != LINUX_ARM_ZIMAGE_MAGIC) {
+               puts("Bad Linux ARM zImage magic!\n");
+               return 1;
+       }
+
+       *start = (void *)zi->zi_start;
+       *end = (void *)zi->zi_end;
+
+       debug("Kernel image @ 0x%08x [ 0x%08x - 0x%08x ]\n",
+               (uint32_t)image, (uint32_t)*start, (uint32_t)*end);
+
+       return 0;
+}
+#endif /* CONFIG_CMD_BOOTZ */