/*
 * 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
