source: trunk/target/linux/brcm47xx/patches-2.6.34/011-MIPS-BCM47xx-Really-fix-128MB-RAM-problem.patch @ 22298

Last change on this file since 22298 was 22298, checked in by hauke, 6 years ago

brcm47xx: write boardflags correct into sprom

File size: 2.4 KB
  • arch/mips/bcm47xx/prom.c

    From cf731bb198bdaa4ce741536252ea99518887b721 Mon Sep 17 00:00:00 2001
    From: Hauke Mehrtens <hauke@hauke-m.de>
    Date: Sun, 18 Jul 2010 12:49:41 +0200
    Subject: [PATCH 1/5] MIPS: BCM47xx: Really fix 128MB RAM problem
    
    The previews patch 84a6fcb368a080620d12fc4d79e07902dbee7335 was wrong,
    I got wrong success reports.
    
    The bcm47xx architecture maps the ram into a 128MB address space. It
    will be paced there as often as goes into the 128MB. The detection
    tries to find the position where the same memory is found. When reading
    over 128MB the processor will throw an exception. If 128MB ram is
    installed, it will not find the same memory because it tries to read
    over the 128MB boarder. Now it just assumes 128MB installed ram if it
    can not find that the ram is repeating.
    
    Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
    ---
     arch/mips/bcm47xx/prom.c |   22 ++++++++++++++--------
     1 files changed, 14 insertions(+), 8 deletions(-)
    
    a b static __init void prom_init_cmdline(voi 
    126126static __init void prom_init_mem(void) 
    127127{ 
    128128        unsigned long mem; 
     129        unsigned long max; 
    129130 
    130131        /* Figure out memory size by finding aliases. 
    131132         * 
    static __init void prom_init_mem(void) 
    134135         * want to reuse the memory used by CFE (around 4MB). That means cfe_* 
    135136         * functions stop to work at some point during the boot, we should only 
    136137         * call them at the beginning of the boot. 
     138         *  
     139         * BCM47XX uses 128MB for addressing the ram, if the system contains 
     140         * less that that amount of ram it remaps the ram more often into the 
     141         * available space. 
     142         * Accessing memory after 128MB will cause an exception. 
     143         * max contains the biggest possible address supported by the platform. 
     144         * If the method wants to try something above we assume 128MB ram. 
    137145         */ 
     146        max = ((unsigned long)(prom_init) | ((128 << 20) - 1)); 
    138147        for (mem = (1 << 20); mem < (128 << 20); mem += (1 << 20)) { 
     148                if (((unsigned long)(prom_init) + mem) > max) { 
     149                        mem = (128 << 20); 
     150                        printk("assume 128MB RAM\n"); 
     151                        break; 
     152                } 
    139153                if (*(unsigned long *)((unsigned long)(prom_init) + mem) == 
    140154                    *(unsigned long *)(prom_init)) 
    141155                        break; 
    142156        } 
    143157 
    144         /* Ignoring the last page when ddr size is 128M. Cached 
    145          * accesses to last page is causing the processor to prefetch 
    146          * using address above 128M stepping out of the ddr address 
    147          * space. 
    148          */ 
    149         if (mem == 0x8000000) 
    150                 mem -= 0x1000; 
    151  
    152158        add_memory_region(0, mem, BOOT_MEM_RAM); 
    153159} 
    154160 
Note: See TracBrowser for help on using the repository browser.