0001
0002
0003
0004
0005
0006 #include <linux/memblock.h>
0007 #include <linux/init.h>
0008 #include <linux/mm.h>
0009 #include <linux/pfn.h>
0010 #include <linux/proc_fs.h>
0011 #include <linux/string.h>
0012 #include <linux/swap.h>
0013
0014 #include <asm/bootinfo.h>
0015 #include <asm/page.h>
0016 #include <asm/sections.h>
0017
0018 #include <asm/mach-ar7/ar7.h>
0019
0020 static int __init memsize(void)
0021 {
0022 u32 size = (64 << 20);
0023 u32 *addr = (u32 *)KSEG1ADDR(AR7_SDRAM_BASE + size - 4);
0024 u32 *kernel_end = (u32 *)KSEG1ADDR(CPHYSADDR((u32)&_end));
0025 u32 *tmpaddr = addr;
0026
0027 while (tmpaddr > kernel_end) {
0028 *tmpaddr = (u32)tmpaddr;
0029 size >>= 1;
0030 tmpaddr -= size >> 2;
0031 }
0032
0033 do {
0034 tmpaddr += size >> 2;
0035 if (*tmpaddr != (u32)tmpaddr)
0036 break;
0037 size <<= 1;
0038 } while (size < (64 << 20));
0039
0040 writel((u32)tmpaddr, &addr);
0041
0042 return size;
0043 }
0044
0045 void __init prom_meminit(void)
0046 {
0047 unsigned long pages;
0048
0049 pages = memsize() >> PAGE_SHIFT;
0050 memblock_add(PHYS_OFFSET, pages << PAGE_SHIFT);
0051 }