diff options
Diffstat (limited to 'arch/powerpc/mm/mem.c')
-rw-r--r-- | arch/powerpc/mm/mem.c | 38 |
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 | */ |
250 | void __init paging_init(void) | 251 | void __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 | ||
396 | void 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 |
386 | void __init free_initrd_mem(unsigned long start, unsigned long end) | 416 | void __init free_initrd_mem(unsigned long start, unsigned long end) |
387 | { | 417 | { |