summaryrefslogtreecommitdiff
path: root/board/xilinx/microblaze-generic
diff options
context:
space:
mode:
authorMichal Simek <michal.simek@xilinx.com>2019-09-25 11:00:17 +0200
committerMichal Simek <michal.simek@xilinx.com>2019-10-08 09:55:11 +0200
commite0418347f9aa0f5099dfc1dac8eafceb98e38ccf (patch)
tree317ce3a1c984a95752a9f0451c3e4da00309b9c0 /board/xilinx/microblaze-generic
parent8272f31036c3128e0787183e214389744bea61ee (diff)
microblaze: Setup initrd_high and fdt_high at run time
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>
Diffstat (limited to 'board/xilinx/microblaze-generic')
-rw-r--r--board/xilinx/microblaze-generic/microblaze-generic.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/board/xilinx/microblaze-generic/microblaze-generic.c b/board/xilinx/microblaze-generic/microblaze-generic.c
index 4e038ddf0c..30be0150f3 100644
--- a/board/xilinx/microblaze-generic/microblaze-generic.c
+++ b/board/xilinx/microblaze-generic/microblaze-generic.c
@@ -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;
}