]> git.sur5r.net Git - u-boot/commitdiff
boot: fdt: Perform arch_fixup_fdt() on the given device tree for falcon boot
authorB, Ravi <ravibabu@ti.com>
Tue, 18 Apr 2017 11:57:27 +0000 (17:27 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 12 May 2017 02:21:26 +0000 (22:21 -0400)
In single stage bootmode or falcon boot mode, the SPL shall update the
device tree that we load with the normal fixups done via
arch_fixup_fdt(), when possible (ie we have enough information in this
restricted environment to be able to do that still).  This will include
for example updating them memory nodes.

Signed-off-by: Ravi Babu <ravibabu@ti.com>
[trini: Reword commit message]

common/spl/spl.c

index 8eea2f937a529d89ec4c991cf2060d725ac333a8..df984b8efdbe7f33bb08d266fe480b963a44dfd8 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
@@ -323,6 +359,9 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
 
        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,
@@ -364,6 +403,7 @@ 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);
 #endif