blob: 174bc808c56b10013257a3f1858dce237f11345d [file] [log] [blame]
/*
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/bootmem.h>
#ifdef CONFIG_BLOCK_DEV_RAM
#include <linux/blk.h>
#endif
#include <linux/swap.h>
#include <asm/page.h>
#include <asm/pgalloc.h>
#include <asm/mmapcode.h>
pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((aligned(PAGE_SIZE)));
char empty_zero_page[PAGE_SIZE] __attribute__ ((aligned(PAGE_SIZE)));
EXPORT_SYMBOL(empty_zero_page);
/* static unsigned long totalram_pages = 0; */
extern char _etext, _text, _edata, _end, _init_end, _init_begin;
void __init pagetable_init(void)
{
pgd_init((unsigned long)swapper_pg_dir);
pgd_init((unsigned long)swapper_pg_dir +
sizeof(pgd_t) * USER_PTRS_PER_PGD);
}
void __init paging_init(void)
{
unsigned long zones_size[MAX_NR_ZONES] = { 0, 0 };
extern unsigned long end_mem;
pagetable_init();
zones_size[ZONE_NORMAL] = (end_mem - CONFIG_LINUX_LINK_BASE) >> PAGE_SHIFT;
#ifdef CONFIG_FLATMEM
free_area_init_node(0, zones_size, CONFIG_LINUX_LINK_BASE >> PAGE_SHIFT, NULL);
#else
#error "Fix !CONFIG_FLATMEM"
#endif
}
void __init mem_init(void)
{
int codesize, datasize, initsize, reserved_pages;
int tmp;
high_memory =
(void *)__va((max_low_pfn) * PAGE_SIZE);
max_mapnr = num_physpages;
totalram_pages = free_all_bootmem();
reserved_pages = 0;
for (tmp = 0; tmp < num_physpages; tmp++)
if (PageReserved(mem_map + tmp))
reserved_pages++;
codesize = (unsigned long)&_etext - (unsigned long)&_text;
datasize = (unsigned long)&_end - (unsigned long)&_etext;
initsize = (unsigned long)&_init_end - (unsigned long)&_init_begin;
printk(KERN_NOTICE
"Memory: %luKB available (%dK code,%dK data, %dK init)\n",
(unsigned long)nr_free_pages() << (PAGE_SHIFT - 10),
codesize >> 10, datasize >> 10, initsize >> 10);
}
void __init_refok free_initmem(void)
{
extern char _init_begin, _init_end;
unsigned long addr;
addr = (unsigned long)(&_init_begin);
for (; addr < (unsigned long)(&_init_end); addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
/* Sameer: may be arch-specific code is not supposed to use
this. */
/* set_page_count(virt_to_page(addr), 1); */
free_page(addr);
totalram_pages++;
}
printk(KERN_INFO "Freeing unused kernel memory: %luk freed [%p] TO [%p]\n",
(&_init_end - &_init_begin) >> 10, &_init_begin, &_init_end);
mmapcode_space_init();
}
void show_mem(void)
{
int i, free = 0, total = 0, reserved = 0;
int shared = 0, cached = 0;
printk("Mem-info:\n");
show_free_areas();
printk("Free swap: %6dkB\n",
(int)(nr_swap_pages << (PAGE_SHIFT - 10)));
i = max_mapnr;
while (i-- > 0) {
total++;
if (PageReserved(mem_map + i))
reserved++;
else if (PageSwapCache(mem_map + i))
cached++;
else if (!page_count(mem_map + i))
free++;
else
shared += page_count(mem_map + i) - 1;
}
printk("%d pages of RAM\n", total);
printk("%d reserved pages\n", reserved);
printk("%d pages shared\n", shared);
printk("%d pages swap cached\n", cached);
printk("%d free pages\n", free);
/* Sameer: Seems to be obsolete. We need a look here too */
/* show_buffers(); */
}
#ifdef CONFIG_BLK_DEV_INITRD
void free_initrd_mem(unsigned long start, unsigned long end)
{
int pages = 0;
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
/* Sameer: may be arch-specific code is not supposed to use
this. */
/* set_page_count(virt_to_page(start), 1); */
free_page(start);
totalram_pages++;
pages++;
}
printk("Freeing initrd memory: %luk freed\n",
(pages * PAGE_SIZE) >> 10);
}
#endif