diff options
Diffstat (limited to 'arch/powerpc/mm/mem.c')
| -rw-r--r-- | arch/powerpc/mm/mem.c | 35 | 
1 files changed, 32 insertions, 3 deletions
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 29d4dde65c45..c781bbcf7338 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -249,7 +249,7 @@ static int __init mark_nonram_nosave(void)   */  void __init paging_init(void)  { -	unsigned long total_ram = memblock_phys_mem_size(); +	unsigned long long total_ram = memblock_phys_mem_size();  	phys_addr_t top_of_ram = memblock_end_of_DRAM();  	unsigned long max_zone_pfns[MAX_NR_ZONES]; @@ -269,7 +269,7 @@ void __init paging_init(void)  	kmap_prot = PAGE_KERNEL;  #endif /* CONFIG_HIGHMEM */ -	printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%lx\n", +	printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%llx\n",  	       (unsigned long long)top_of_ram, total_ram);  	printk(KERN_DEBUG "Memory hole size: %ldMB\n",  	       (long int)((top_of_ram - total_ram) >> 20)); @@ -337,8 +337,9 @@ void __init mem_init(void)  		highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT;  		for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { +			phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT;  			struct page *page = pfn_to_page(pfn); -			if (memblock_is_reserved(pfn << PAGE_SHIFT)) +			if (memblock_is_reserved(paddr))  				continue;  			ClearPageReserved(page);  			init_page_count(page); @@ -352,6 +353,15 @@ void __init mem_init(void)  	}  #endif /* CONFIG_HIGHMEM */ +#if defined(CONFIG_PPC_FSL_BOOK3E) && !defined(CONFIG_SMP) +	/* +	 * If smp is enabled, next_tlbcam_idx is initialized in the cpu up +	 * functions.... do it here for the non-smp case. +	 */ +	per_cpu(next_tlbcam_idx, smp_processor_id()) = +		(mfspr(SPRN_TLB1CFG) & TLBnCFG_N_ENTRY) - 1; +#endif +  	printk(KERN_INFO "Memory: %luk/%luk available (%luk kernel code, "  	       "%luk reserved, %luk data, %luk bss, %luk init)\n",  		nr_free_pages() << (PAGE_SHIFT-10), @@ -382,6 +392,25 @@ void __init mem_init(void)  	mem_init_done = 1;  } +void free_initmem(void) +{ +	unsigned long addr; + +	ppc_md.progress = ppc_printk_progress; + +	addr = (unsigned long)__init_begin; +	for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) { +		memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); +		ClearPageReserved(virt_to_page(addr)); +		init_page_count(virt_to_page(addr)); +		free_page(addr); +		totalram_pages++; +	} +	pr_info("Freeing unused kernel memory: %luk freed\n", +		((unsigned long)__init_end - +		(unsigned long)__init_begin) >> 10); +} +  #ifdef CONFIG_BLK_DEV_INITRD  void __init free_initrd_mem(unsigned long start, unsigned long end)  {  |