armv8: fsl-layerscape: Fix MC reserved memory calculation
authorYork Sun <york.sun@nxp.com>
Thu, 7 Sep 2017 17:12:32 +0000 (10:12 -0700)
committerYork Sun <york.sun@nxp.com>
Mon, 11 Sep 2017 15:01:07 +0000 (08:01 -0700)
In case high region memory doesn't have enough space for Management
Complex (MC), the return value should indicate a failure so the
caller can handle it accordingly.

Signed-off-by: York Sun <york.sun@nxp.com>
Reported-by: Ebony Zhu <ebony.zhu@nxp.com>
arch/arm/cpu/armv8/fsl-layerscape/cpu.c

index 3c9a5edc8bb4a6c79f0df6814f15abc97dd267cf..d21a49454e15dd0b9e791a29b5467cfe494547ef 100644 (file)
@@ -619,13 +619,22 @@ void efi_reset_system_init(void)
 
 #endif
 
+/*
+ * Calculate reserved memory with given memory bank
+ * Return aligned memory size on success
+ * Return (ram_size + needed size) for failure
+ */
 phys_size_t board_reserve_ram_top(phys_size_t ram_size)
 {
        phys_size_t ram_top = ram_size;
 
 #if defined(CONFIG_FSL_MC_ENET) && !defined(CONFIG_SPL_BUILD)
+       ram_top = mc_get_dram_block_size();
+       if (ram_top > ram_size)
+               return ram_size + ram_top;
+
+       ram_top = ram_size - ram_top;
        /* The start address of MC reserved memory needs to be aligned. */
-       ram_top -= mc_get_dram_block_size();
        ram_top &= ~(CONFIG_SYS_MC_RSV_MEM_ALIGN - 1);
 #endif
 
@@ -669,8 +678,8 @@ phys_size_t get_effective_memsize(void)
        /* Check if we have enough memory for MC */
        if (rem < board_reserve_ram_top(rem)) {
                /* Not enough memory in high region to reserve */
-               if (ea_size > board_reserve_ram_top(rem))
-                       ea_size -= board_reserve_ram_top(rem);
+               if (ea_size > board_reserve_ram_top(ea_size))
+                       ea_size -= board_reserve_ram_top(ea_size);
                else
                        printf("Error: No enough space for reserved memory.\n");
        }