Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Copyright (C) 2007 Felix Fietkau <nbd@openwrt.org>
0004  * Copyright (C) 2007 Eugene Konev <ejka@openwrt.org>
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 }