x86: Support machines with >4GB of RAM
authorSimon Glass <sjg@chromium.org>
Mon, 2 Mar 2015 19:40:49 +0000 (12:40 -0700)
committerSimon Glass <sjg@chromium.org>
Fri, 17 Apr 2015 01:27:40 +0000 (19:27 -0600)
Some systems have more than 4GB of RAM. U-Boot can only place things below
4GB so any memory above that should not be used. Ignore any such memory so
that the memory size will not exceed the maximum.

This prevents gd->ram_size exceeding 4GB which causes problems for PCI
devices which use DMA.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
arch/x86/cpu/coreboot/sdram.c

index e98a2302e79d83c51ff63a43a74e206d507b861a..9c3ab81734255d55b7c22300e8de067b134a0645 100644 (file)
@@ -90,7 +90,8 @@ int dram_init(void)
                struct memrange *memrange = &lib_sysinfo.memrange[i];
                unsigned long long end = memrange->base + memrange->size;
 
-               if (memrange->type == CB_MEM_RAM && end > ram_size)
+               if (memrange->type == CB_MEM_RAM && end > ram_size &&
+                   memrange->base < (1ULL << 32))
                        ram_size = end;
        }
        gd->ram_size = ram_size;
@@ -108,7 +109,8 @@ void dram_init_banksize(void)
                for (i = 0, j = 0; i < lib_sysinfo.n_memranges; i++) {
                        struct memrange *memrange = &lib_sysinfo.memrange[i];
 
-                       if (memrange->type == CB_MEM_RAM) {
+                       if (memrange->type == CB_MEM_RAM &&
+                           memrange->base < (1ULL << 32)) {
                                gd->bd->bi_dram[j].start = memrange->base;
                                gd->bd->bi_dram[j].size = memrange->size;
                                j++;