aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/mm/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/mm/mem.c')
-rw-r--r--arch/powerpc/mm/mem.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 29d4dde65c4..95985f286e3 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -123,7 +123,8 @@ int arch_add_memory(int nid, u64 start, u64 size)
123 pgdata = NODE_DATA(nid); 123 pgdata = NODE_DATA(nid);
124 124
125 start = (unsigned long)__va(start); 125 start = (unsigned long)__va(start);
126 create_section_mapping(start, start + size); 126 if (create_section_mapping(start, start + size))
127 return -EINVAL;
127 128
128 /* this should work for most non-highmem platforms */ 129 /* this should work for most non-highmem platforms */
129 zone = pgdata->node_zones; 130 zone = pgdata->node_zones;
@@ -249,7 +250,7 @@ static int __init mark_nonram_nosave(void)
249 */ 250 */
250void __init paging_init(void) 251void __init paging_init(void)
251{ 252{
252 unsigned long total_ram = memblock_phys_mem_size(); 253 unsigned long long total_ram = memblock_phys_mem_size();
253 phys_addr_t top_of_ram = memblock_end_of_DRAM(); 254 phys_addr_t top_of_ram = memblock_end_of_DRAM();
254 unsigned long max_zone_pfns[MAX_NR_ZONES]; 255 unsigned long max_zone_pfns[MAX_NR_ZONES];
255 256
@@ -269,7 +270,7 @@ void __init paging_init(void)
269 kmap_prot = PAGE_KERNEL; 270 kmap_prot = PAGE_KERNEL;
270#endif /* CONFIG_HIGHMEM */ 271#endif /* CONFIG_HIGHMEM */
271 272
272 printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%lx\n", 273 printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%llx\n",
273 (unsigned long long)top_of_ram, total_ram); 274 (unsigned long long)top_of_ram, total_ram);
274 printk(KERN_DEBUG "Memory hole size: %ldMB\n", 275 printk(KERN_DEBUG "Memory hole size: %ldMB\n",
275 (long int)((top_of_ram - total_ram) >> 20)); 276 (long int)((top_of_ram - total_ram) >> 20));
@@ -337,8 +338,9 @@ void __init mem_init(void)
337 338
338 highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; 339 highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT;
339 for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { 340 for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
341 phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT;
340 struct page *page = pfn_to_page(pfn); 342 struct page *page = pfn_to_page(pfn);
341 if (memblock_is_reserved(pfn << PAGE_SHIFT)) 343 if (memblock_is_reserved(paddr))
342 continue; 344 continue;
343 ClearPageReserved(page); 345 ClearPageReserved(page);
344 init_page_count(page); 346 init_page_count(page);
@@ -352,6 +354,15 @@ void __init mem_init(void)
352 } 354 }
353#endif /* CONFIG_HIGHMEM */ 355#endif /* CONFIG_HIGHMEM */
354 356
357#if defined(CONFIG_PPC_FSL_BOOK3E) && !defined(CONFIG_SMP)
358 /*
359 * If smp is enabled, next_tlbcam_idx is initialized in the cpu up
360 * functions.... do it here for the non-smp case.
361 */
362 per_cpu(next_tlbcam_idx, smp_processor_id()) =
363 (mfspr(SPRN_TLB1CFG) & TLBnCFG_N_ENTRY) - 1;
364#endif
365
355 printk(KERN_INFO "Memory: %luk/%luk available (%luk kernel code, " 366 printk(KERN_INFO "Memory: %luk/%luk available (%luk kernel code, "
356 "%luk reserved, %luk data, %luk bss, %luk init)\n", 367 "%luk reserved, %luk data, %luk bss, %luk init)\n",
357 nr_free_pages() << (PAGE_SHIFT-10), 368 nr_free_pages() << (PAGE_SHIFT-10),
@@ -382,6 +393,25 @@ void __init mem_init(void)
382 mem_init_done = 1; 393 mem_init_done = 1;
383} 394}
384 395
396void free_initmem(void)
397{
398 unsigned long addr;
399
400 ppc_md.progress = ppc_printk_progress;
401
402 addr = (unsigned long)__init_begin;
403 for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) {
404 memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
405 ClearPageReserved(virt_to_page(addr));
406 init_page_count(virt_to_page(addr));
407 free_page(addr);
408 totalram_pages++;
409 }
410 pr_info("Freeing unused kernel memory: %luk freed\n",
411 ((unsigned long)__init_end -
412 (unsigned long)__init_begin) >> 10);
413}
414
385#ifdef CONFIG_BLK_DEV_INITRD 415#ifdef CONFIG_BLK_DEV_INITRD
386void __init free_initrd_mem(unsigned long start, unsigned long end) 416void __init free_initrd_mem(unsigned long start, unsigned long end)
387{ 417{