xilinx: common: Change bootm_size variable setting
authorMichal Simek <michal.simek@xilinx.com>
Wed, 12 Aug 2020 10:17:53 +0000 (12:17 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Thu, 20 Aug 2020 07:58:16 +0000 (09:58 +0200)
Linux kernel for arm32 requires dtb and initrd to be placed in low memory
to work properly. This requirement is described in chapter 4b) and 5) in
Linux documentation (Documentation/arm/booting.rst).

There is an issue on arm32 with 2GB of memory that bootm_size is bigger
than Linux lowmem (for example with VMSPLIT_3G). That's why limit bootm
size on these systems not to be above 768MB.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
board/xilinx/common/board.c

index 581c88a..eab389d 100644 (file)
@@ -78,11 +78,15 @@ void *board_fdt_blob_setup(void)
 int board_late_init_xilinx(void)
 {
        u32 ret = 0;
+       phys_size_t bootm_size = gd->ram_size;
+
+       if (CONFIG_IS_ENABLED(ARCH_ZYNQ))
+               bootm_size = min(bootm_size, (phys_size_t)(SZ_512M + SZ_256M));
 
        ret |= env_set_hex("script_offset_f", CONFIG_BOOT_SCRIPT_OFFSET);
 
        ret |= env_set_addr("bootm_low", (void *)gd->ram_base);
-       ret |= env_set_addr("bootm_size", (void *)gd->ram_size);
+       ret |= env_set_addr("bootm_size", (void *)bootm_size);
 
        if (ret)
                printf("%s: Saving run time variables FAILED\n", __func__);