xen/arm: Dummy implementation of multi-bank support
authorJulien Grall <julien.grall@linaro.org>
Mon, 15 Jul 2013 14:40:55 +0000 (15:40 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Wed, 17 Jul 2013 09:53:23 +0000 (10:53 +0100)
U-boot for the arndale board splits the memory in 8 contiguous banks and
rewrites the memory node. So most of the memory is lost.

As the frametable is only able to handle contiguous memory, use the first
contiguous banks and warn if some of the memory banks are not used.

Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
[ ijc -- "some banks" -> "some memory banks" ]

xen/arch/arm/setup.c

index b192d15d51873d455e7491ad937d01a49a752d50..c22972f0deaeaecb4045f2de97052641fd63dfcd 100644 (file)
@@ -288,16 +288,27 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
     unsigned long heap_pages, xenheap_pages, domheap_pages;
     unsigned long dtb_pages;
     unsigned long boot_mfn_start, boot_mfn_end;
+    int i = 0;
 
-    /*
-     * TODO: only using the first RAM bank for now.  The heaps and the
-     * frame table assume RAM is physically contiguous.
-     */
-    if ( early_info.mem.nr_banks > 1 )
-        early_printk("WARNING: Only using first bank of memory\n");
+    /* TODO: Handle non-contiguous memory bank */
+    if ( !early_info.mem.nr_banks )
+        early_panic("No memory bank\n");
     ram_start = early_info.mem.bank[0].start;
     ram_size  = early_info.mem.bank[0].size;
     ram_end = ram_start + ram_size;
+
+    for ( i = 1; i < early_info.mem.nr_banks; i++ )
+    {
+        if ( ram_end != early_info.mem.bank[i].start )
+            break;
+
+        ram_size += early_info.mem.bank[i].size;
+        ram_end += early_info.mem.bank[i].size;
+    }
+
+    if ( i != early_info.mem.nr_banks )
+        early_printk("WARNING: some memory banks are not used\n");
+
     total_pages = ram_pages = ram_size >> PAGE_SHIFT;
 
     /*