From: Dave Kleikamp Date: Fri, 23 May 2014 21:39:00 +0000 (-0500) Subject: sparc64: add and call reserve_crashkernel X-Git-Tag: v4.1.12-92~147^2~3^2~13 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=943edadd1bc30e6e42f3fbd9701737e57c07c35c;p=users%2Fjedix%2Flinux-maple.git sparc64: add and call reserve_crashkernel original patch by Bob Picco Signed-off-by: Dave Kleikamp Cc: Bob Picco --- diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 3261a7ee9db95..cab7cbdfb67e5 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -792,6 +793,51 @@ static void __init find_ramdisk(unsigned long phys_base) #endif } +static void __init reserve_crashkernel(void) +{ +#ifdef CONFIG_KEXEC + unsigned long total_mem; + unsigned long long crash_size, crash_base; + unsigned long long alignment = REAL_HPAGE_SIZE; + int ret; + + total_mem = memblock_phys_mem_size(); + + ret = parse_crashkernel(boot_command_line, total_mem, + &crash_size, &crash_base); + + if (ret) + return; + + if (crash_base <= 0) + crash_base = memblock_find_in_range(alignment, ULLONG_MAX, + crash_size, alignment); + else { + unsigned long start; + + start = memblock_find_in_range(crash_base, + crash_base + crash_size, crash_size, alignment); + crash_base = start; + } + + if (!crash_base) { + pr_err("crashkernel reservation failed.\n"); + return; + } + + memblock_reserve(crash_base, crash_size); + + pr_info("Reserving %ldMB of memory at %ldMB for crashkernel (System RAM: %ldMB)\n", + (unsigned long) (crash_size >> 20), + (unsigned long) (crash_base >> 20), + (unsigned long) (total_mem >> 20)); + + crashk_res.start = crash_base; + crashk_res.end = crash_base + crash_size - 1; + insert_resource(&iomem_resource, &crashk_res); +#endif +} + struct node_mem_mask { unsigned long mask; unsigned long val; @@ -2180,6 +2226,8 @@ void __init paging_init(void) find_ramdisk(phys_base); + reserve_crashkernel(); + if (cmdline_memory_size) reduce_memory(cmdline_memory_size);