summaryrefslogtreecommitdiffstats
path: root/target/linux/ar7/files/arch/mips/ar7/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ar7/files/arch/mips/ar7/memory.c')
-rw-r--r--target/linux/ar7/files/arch/mips/ar7/memory.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/target/linux/ar7/files/arch/mips/ar7/memory.c b/target/linux/ar7/files/arch/mips/ar7/memory.c
index 72d6668a1..e8522a174 100644
--- a/target/linux/ar7/files/arch/mips/ar7/memory.c
+++ b/target/linux/ar7/files/arch/mips/ar7/memory.c
@@ -37,22 +37,25 @@
static int __init memsize(void)
{
u32 size = (64 << 20);
- volatile u32 *addr = (u32 *)KSEG1ADDR(0x14000000 + size - 4);
+ u32 *addr = (u32 *)KSEG1ADDR(0x14000000 + size - 4);
u32 *kernel_end = (u32 *)KSEG1ADDR(CPHYSADDR((u32)&_end));
+ u32 *tmpaddr = addr;
- while (addr > kernel_end) {
- *addr = (u32)addr;
+ while (tmpaddr > kernel_end) {
+ *tmpaddr = (u32)tmpaddr;
size >>= 1;
- addr -= size >> 2;
+ tmpaddr -= size >> 2;
}
do {
- addr += size >> 2;
- if (*addr != (u32)addr)
+ tmpaddr += size >> 2;
+ if (*tmpaddr != (u32)tmpaddr)
break;
size <<= 1;
} while (size < (64 << 20));
+ writel(tmpaddr, &addr);
+
return size;
}