Merge branch 'master' of git://git.denx.de/u-boot-mmc
[platform/kernel/u-boot.git] / common / spl / spl.c
index d98b9fc..0a49766 100644 (file)
@@ -17,6 +17,7 @@
 #include <malloc.h>
 #include <dm/root.h>
 #include <linux/compiler.h>
+#include <fdt_support.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -56,6 +57,14 @@ __weak int spl_start_uboot(void)
        return 1;
 }
 
+/* weak default platform specific function to initialize
+ * dram banks
+ */
+__weak int dram_init_banksize(void)
+{
+       return 0;
+}
+
 /*
  * Weak default function for arch specific zImage check. Return zero
  * and fill start and end address if image is recognized.
@@ -66,6 +75,33 @@ int __weak bootz_setup(ulong image, ulong *start, ulong *end)
 }
 #endif
 
+void spl_fixup_fdt(void)
+{
+#if defined(CONFIG_SPL_OF_LIBFDT) && defined(CONFIG_SYS_SPL_ARGS_ADDR)
+       void *fdt_blob = (void *)CONFIG_SYS_SPL_ARGS_ADDR;
+       int err;
+
+       err = fdt_check_header(fdt_blob);
+       if (err < 0) {
+               printf("fdt_root: %s\n", fdt_strerror(err));
+               return;
+       }
+
+       /* fixup the memory dt node */
+       err = fdt_shrink_to_minimum(fdt_blob, 0);
+       if (err == 0) {
+               printf("spl: fdt_shrink_to_minimum err - %d\n", err);
+               return;
+       }
+
+       err = arch_fixup_fdt(fdt_blob);
+       if (err) {
+               printf("spl: arch_fixup_fdt err - %d\n", err);
+               return;
+       }
+#endif
+}
+
 /*
  * Weak default function for board specific cleanup/preparation before
  * Linux boot. Some boards/platforms might not need it, so just provide
@@ -85,6 +121,9 @@ void spl_set_header_raw_uboot(struct spl_image_info *spl_image)
 {
        spl_image->size = CONFIG_SYS_MONITOR_LEN;
        spl_image->entry_point = CONFIG_SYS_UBOOT_START;
+#ifdef CONFIG_CPU_V7M
+       spl_image->entry_point |= 0x1;
+#endif
        spl_image->load_addr = CONFIG_SYS_TEXT_BASE;
        spl_image->os = IH_OS_U_BOOT;
        spl_image->name = "U-Boot";
@@ -227,10 +266,11 @@ int spl_early_init(void)
 int spl_init(void)
 {
        int ret;
+       bool setup_malloc = !(IS_ENABLED(CONFIG_SPL_STACK_R) &&
+                       IS_ENABLED(CONFIG_SPL_SYS_MALLOC_SIMPLE));
 
        if (!(gd->flags & GD_FLG_SPL_EARLY_INIT)) {
-               ret = spl_common_init(
-                       !IS_ENABLED(CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN));
+               ret = spl_common_init(setup_malloc);
                if (ret)
                        return ret;
        }
@@ -318,6 +358,10 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
        struct spl_image_info spl_image;
 
        debug(">>spl:board_init_r()\n");
+       gd->bd = &bdata;
+#ifdef CONFIG_SPL_OS_BOOT
+       dram_init_banksize();
+#endif
 
 #if defined(CONFIG_SYS_SPL_MALLOC_START)
        mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
@@ -341,6 +385,9 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
 #endif
 
        memset(&spl_image, '\0', sizeof(spl_image));
+#ifdef CONFIG_SYS_SPL_ARGS_ADDR
+       spl_image.arg = (void *)CONFIG_SYS_SPL_ARGS_ADDR;
+#endif
        board_boot_order(spl_boot_list);
 
        if (boot_from_devices(&spl_image, spl_boot_list,
@@ -356,9 +403,9 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
 #ifdef CONFIG_SPL_OS_BOOT
        case IH_OS_LINUX:
                debug("Jumping to Linux\n");
+               spl_fixup_fdt();
                spl_board_prepare_for_linux();
-               jump_to_image_linux(&spl_image,
-                                   (void *)CONFIG_SYS_SPL_ARGS_ADDR);
+               jump_to_image_linux(&spl_image);
 #endif
        default:
                debug("Unsupported OS image.. Jumping nevertheless..\n");
@@ -368,6 +415,11 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
              gd->malloc_ptr / 1024);
 #endif
 
+       if (IS_ENABLED(CONFIG_SPL_ATF_SUPPORT)) {
+               debug("loaded - jumping to U-Boot via ATF BL31.\n");
+               bl31_entry();
+       }
+
        debug("loaded - jumping to U-Boot...\n");
        spl_board_prepare_for_boot();
        jump_to_image_no_args(&spl_image);
@@ -379,7 +431,6 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
  */
 void preloader_console_init(void)
 {
-       gd->bd = &bdata;
        gd->baudrate = CONFIG_BAUDRATE;
 
        serial_init();          /* serial communications setup */