From d3dce3d676373b1519546721ee5f3a8c613f40f5 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Wed, 3 Oct 2012 11:34:16 +0000 Subject: MIPS: BCM47XX: ignore last memory page Ignoring the last page when ddr size is 128M. Cached accesses to last page is causing the processor to prefetch using address above 128M stepping out of the ddr address space. Signed-off-by: Hauke Mehrtens Patchwork: http://patchwork.linux-mips.org/patch/4365 Signed-off-by: John Crispin --- arch/mips/bcm47xx/prom.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'arch/mips/bcm47xx/prom.c') diff --git a/arch/mips/bcm47xx/prom.c b/arch/mips/bcm47xx/prom.c index f6e9063cc4c2..22258a4c652b 100644 --- a/arch/mips/bcm47xx/prom.c +++ b/arch/mips/bcm47xx/prom.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -127,6 +128,7 @@ static __init void prom_init_mem(void) { unsigned long mem; unsigned long max; + struct cpuinfo_mips *c = ¤t_cpu_data; /* Figure out memory size by finding aliases. * @@ -155,6 +157,14 @@ static __init void prom_init_mem(void) break; } + /* Ignoring the last page when ddr size is 128M. Cached + * accesses to last page is causing the processor to prefetch + * using address above 128M stepping out of the ddr address + * space. + */ + if (c->cputype == CPU_74K && (mem == (128 << 20))) + mem -= 0x1000; + add_memory_region(0, mem, BOOT_MEM_RAM); } -- cgit v1.2.3 From c47cc20ca53e792938556aa29103fa889ce0d858 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Wed, 3 Oct 2012 11:34:17 +0000 Subject: MIPS: BCM47XX: improve memory size detection The memory size is detected by finding a place where it repeats in memory. Currently we are just checking when the function prom_init is seen again, but it is better to check for a bigger part of the memory to decrease the chance of wrong results. This should fix a problem we saw in OpenWrt, where the detected available memory decreed on some devices when doing a soft reboot. Signed-off-by: Hauke Mehrtens Patchwork: http://patchwork.linux-mips.org/patch/4362 Signed-off-by: John Crispin --- arch/mips/bcm47xx/prom.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'arch/mips/bcm47xx/prom.c') diff --git a/arch/mips/bcm47xx/prom.c b/arch/mips/bcm47xx/prom.c index 22258a4c652b..8c155afb1299 100644 --- a/arch/mips/bcm47xx/prom.c +++ b/arch/mips/bcm47xx/prom.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2004 Florian Schirmer * Copyright (C) 2007 Aurelien Jarno + * Copyright (C) 2010-2012 Hauke Mehrtens * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -128,6 +129,7 @@ static __init void prom_init_mem(void) { unsigned long mem; unsigned long max; + unsigned long off; struct cpuinfo_mips *c = ¤t_cpu_data; /* Figure out memory size by finding aliases. @@ -145,15 +147,15 @@ static __init void prom_init_mem(void) * max contains the biggest possible address supported by the platform. * If the method wants to try something above we assume 128MB ram. */ - max = ((unsigned long)(prom_init) | ((128 << 20) - 1)); + off = (unsigned long)prom_init; + max = off | ((128 << 20) - 1); for (mem = (1 << 20); mem < (128 << 20); mem += (1 << 20)) { - if (((unsigned long)(prom_init) + mem) > max) { + if ((off + mem) > max) { mem = (128 << 20); printk(KERN_DEBUG "assume 128MB RAM\n"); break; } - if (*(unsigned long *)((unsigned long)(prom_init) + mem) == - *(unsigned long *)(prom_init)) + if (!memcmp(prom_init, prom_init + mem, 32)) break; } -- cgit v1.2.3