board_f: show_dram_config: Print also real DRAM size
[platform/kernel/u-boot.git] / common / memsize.c
index c315275..3c80ad2 100644 (file)
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
+#include <init.h>
+#include <asm/global_data.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -27,7 +28,7 @@ DECLARE_GLOBAL_DATA_PTR;
 long get_ram_size(long *base, long maxsize)
 {
        volatile long *addr;
-       long           save[31];
+       long           save[BITS_PER_LONG - 1];
        long           save_base;
        long           cnt;
        long           val;
@@ -93,11 +94,23 @@ long get_ram_size(long *base, long maxsize)
 
 phys_size_t __weak get_effective_memsize(void)
 {
-#ifndef CONFIG_VERY_BIG_RAM
-       return gd->ram_size;
+       phys_size_t ram_size = gd->ram_size;
+
+       /*
+        * Check for overflow and limit ram size to some representable value.
+        * It is required that ram_base + ram_size must be representable by
+        * phys_size_t type and must be aligned by direct access, therefore
+        * calculate it from last 4kB sector which should work as alignment
+        * on any platform.
+        */
+       if (gd->ram_base + ram_size < gd->ram_base)
+               ram_size = ((phys_size_t)~0xfffULL) - gd->ram_base;
+
+#ifndef CONFIG_MAX_MEM_MAPPED
+       return ram_size;
 #else
        /* limit stack to what we can reasonable map */
-       return ((gd->ram_size > CONFIG_MAX_MEM_MAPPED) ?
-               CONFIG_MAX_MEM_MAPPED : gd->ram_size);
+       return ((ram_size > CONFIG_MAX_MEM_MAPPED) ?
+               CONFIG_MAX_MEM_MAPPED : ram_size);
 #endif
 }