microblaze: Setup initrd_high and fdt_high at run time
authorMichal Simek <michal.simek@xilinx.com>
Wed, 25 Sep 2019 09:00:17 +0000 (11:00 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 8 Oct 2019 07:55:11 +0000 (09:55 +0200)
Setup initrd_high and fdt_high to be placed in lowmem space for kernel to
be able to reach it. Values are setup at run time to ensure that the same
setting can be used on different memory setup. Do this setting only when
variables are not

Similar run time detection was done for Zynqmp and Versal.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/microblaze/Kconfig
board/xilinx/microblaze-generic/microblaze-generic.c

index 5cc68d63c4f79c8b7008dae9094f9f95041ef4c7..5ce8261451d33c9a46757ac4eae491157633a387 100644 (file)
@@ -20,6 +20,14 @@ config TARGET_MICROBLAZE_GENERIC
 
 endchoice
 
+config STACK_SIZE
+       hex "Define max stack size that can be used by u-boot"
+       default 0x200000
+       help
+         Defines Max stack size that can be used by u-boot so that the
+         initrd_high will be calculated as base stack pointer minus this
+         stack size.
+
 source "board/xilinx/microblaze-generic/Kconfig"
 
 config SPL_LDSCRIPT
index 4e038ddf0cc7ed90ef007049509eff38ae446fbd..30be0150f3099016b463c8e13b1f429255085e33 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/gpio.h>
 #include <dm/uclass.h>
 #include <wdt.h>
+#include <linux/sizes.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -39,6 +40,8 @@ int dram_init(void)
 
 int board_late_init(void)
 {
+       ulong max_size, lowmem_size;
+
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SYSRESET_MICROBLAZE)
        int ret;
 
@@ -47,5 +50,21 @@ int board_late_init(void)
        if (ret)
                printf("Warning: No reset driver: ret=%d\n", ret);
 #endif
+
+       if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
+               debug("Saved variables - Skipping\n");
+               return 0;
+       }
+
+       max_size = gd->start_addr_sp - CONFIG_STACK_SIZE;
+       max_size = round_down(max_size, SZ_16M);
+
+       /* Linux default LOWMEM_SIZE is 0x30000000 = 768MB */
+       lowmem_size = gd->ram_base + 768 * 1024 * 1024;
+
+       env_set_addr("initrd_high", (void *)min_t(ulong, max_size,
+                                                 lowmem_size));
+       env_set_addr("fdt_high", (void *)min_t(ulong, max_size, lowmem_size));
+
        return 0;
 }