]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/blackfin/kernel/setup.c
[Blackfin] arch: detect the memory available in the system on the fly by default
[mv-sheeva.git] / arch / blackfin / kernel / setup.c
index c2f3e73ba25a25b8052a764be26331d0db9d474a..d6668328be7243f0d87f9830110dd0cdaad541cb 100644 (file)
@@ -649,6 +649,49 @@ static __init void setup_bootmem_allocator(void)
                BOOTMEM_DEFAULT);
 }
 
+#define EBSZ_TO_MEG(ebsz) \
+({ \
+       int meg = 0; \
+       switch (ebsz & 0xf) { \
+               case 0x1: meg =  16; break; \
+               case 0x3: meg =  32; break; \
+               case 0x5: meg =  64; break; \
+               case 0x7: meg = 128; break; \
+               case 0x9: meg = 256; break; \
+               case 0xb: meg = 512; break; \
+       } \
+       meg; \
+})
+static inline int __init get_mem_size(void)
+{
+#ifdef CONFIG_MEM_SIZE
+       return CONFIG_MEM_SIZE;
+#else
+# if defined(EBIU_SDBCTL)
+#  if defined(BF561_FAMILY)
+       int ret = 0;
+       u32 sdbctl = bfin_read_EBIU_SDBCTL();
+       ret += EBSZ_TO_MEG(sdbctl >>  0);
+       ret += EBSZ_TO_MEG(sdbctl >>  8);
+       ret += EBSZ_TO_MEG(sdbctl >> 16);
+       ret += EBSZ_TO_MEG(sdbctl >> 24);
+       return ret;
+#  else
+       return EBSZ_TO_MEG(bfin_read_EBIU_SDBCTL());
+#  endif
+# elif defined(EBIU_DDRCTL1)
+       switch (bfin_read_EBIU_DDRCTL1() & 0xc0000) {
+               case DEVSZ_64:  return 64;
+               case DEVSZ_128: return 128;
+               case DEVSZ_256: return 256;
+               case DEVSZ_512: return 512;
+               default:        return 0;
+       }
+# endif
+#endif
+       BUG();
+}
+
 void __init setup_arch(char **cmdline_p)
 {
        unsigned long sclk, cclk;
@@ -669,7 +712,7 @@ void __init setup_arch(char **cmdline_p)
 
        /* setup memory defaults from the user config */
        physical_mem_end = 0;
-       _ramend = CONFIG_MEM_SIZE * 1024 * 1024;
+       _ramend = get_mem_size() * 1024 * 1024;
 
        memset(&bfin_memmap, 0, sizeof(bfin_memmap));