diff options
Diffstat (limited to 'arch/powerpc/kernel/prom_init.c')
| -rw-r--r-- | arch/powerpc/kernel/prom_init.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 369e1a6cdd40..2ae860c306d7 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
| @@ -192,6 +192,11 @@ static unsigned long __initdata alloc_bottom; | |||
| 192 | static unsigned long __initdata rmo_top; | 192 | static unsigned long __initdata rmo_top; |
| 193 | static unsigned long __initdata ram_top; | 193 | static unsigned long __initdata ram_top; |
| 194 | 194 | ||
| 195 | #ifdef CONFIG_KEXEC | ||
| 196 | static unsigned long __initdata prom_crashk_base; | ||
| 197 | static unsigned long __initdata prom_crashk_size; | ||
| 198 | #endif | ||
| 199 | |||
| 195 | static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE]; | 200 | static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE]; |
| 196 | static int __initdata mem_reserve_cnt; | 201 | static int __initdata mem_reserve_cnt; |
| 197 | 202 | ||
| @@ -590,6 +595,34 @@ static void __init early_cmdline_parse(void) | |||
| 590 | RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000); | 595 | RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000); |
| 591 | #endif | 596 | #endif |
| 592 | } | 597 | } |
| 598 | |||
| 599 | #ifdef CONFIG_KEXEC | ||
| 600 | /* | ||
| 601 | * crashkernel=size@addr specifies the location to reserve for | ||
| 602 | * crash kernel. | ||
| 603 | */ | ||
| 604 | opt = strstr(RELOC(prom_cmd_line), RELOC("crashkernel=")); | ||
| 605 | if (opt) { | ||
| 606 | opt += 12; | ||
| 607 | RELOC(prom_crashk_size) = prom_memparse(opt, &opt); | ||
| 608 | |||
| 609 | if (ALIGN(RELOC(prom_crashk_size), 0x1000000) != | ||
| 610 | RELOC(prom_crashk_size)) { | ||
| 611 | prom_printf("Warning: crashkernel size is not " | ||
| 612 | "aligned to 16MB\n"); | ||
| 613 | } | ||
| 614 | |||
| 615 | /* | ||
| 616 | * At present, the crash kernel always run at 32MB. | ||
| 617 | * Just ignore whatever user passed. | ||
| 618 | */ | ||
| 619 | RELOC(prom_crashk_base) = 0x2000000; | ||
| 620 | if (*opt == '@') { | ||
| 621 | prom_printf("Warning: PPC64 kdump kernel always runs " | ||
| 622 | "at 32 MB\n"); | ||
| 623 | } | ||
| 624 | } | ||
| 625 | #endif | ||
| 593 | } | 626 | } |
| 594 | 627 | ||
| 595 | #ifdef CONFIG_PPC_PSERIES | 628 | #ifdef CONFIG_PPC_PSERIES |
| @@ -1011,6 +1044,12 @@ static void __init prom_init_mem(void) | |||
| 1011 | prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); | 1044 | prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); |
| 1012 | prom_printf(" rmo_top : %x\n", RELOC(rmo_top)); | 1045 | prom_printf(" rmo_top : %x\n", RELOC(rmo_top)); |
| 1013 | prom_printf(" ram_top : %x\n", RELOC(ram_top)); | 1046 | prom_printf(" ram_top : %x\n", RELOC(ram_top)); |
| 1047 | #ifdef CONFIG_KEXEC | ||
| 1048 | if (RELOC(prom_crashk_base)) { | ||
| 1049 | prom_printf(" crashk_base : %x\n", RELOC(prom_crashk_base)); | ||
| 1050 | prom_printf(" crashk_size : %x\n", RELOC(prom_crashk_size)); | ||
| 1051 | } | ||
| 1052 | #endif | ||
| 1014 | } | 1053 | } |
| 1015 | 1054 | ||
| 1016 | 1055 | ||
| @@ -2094,6 +2133,10 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
| 2094 | */ | 2133 | */ |
| 2095 | prom_init_mem(); | 2134 | prom_init_mem(); |
| 2096 | 2135 | ||
| 2136 | #ifdef CONFIG_KEXEC | ||
| 2137 | if (RELOC(prom_crashk_base)) | ||
| 2138 | reserve_mem(RELOC(prom_crashk_base), RELOC(prom_crashk_size)); | ||
| 2139 | #endif | ||
| 2097 | /* | 2140 | /* |
| 2098 | * Determine which cpu is actually running right _now_ | 2141 | * Determine which cpu is actually running right _now_ |
| 2099 | */ | 2142 | */ |
| @@ -2150,6 +2193,16 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
| 2150 | } | 2193 | } |
| 2151 | #endif | 2194 | #endif |
| 2152 | 2195 | ||
| 2196 | #ifdef CONFIG_KEXEC | ||
| 2197 | if (RELOC(prom_crashk_base)) { | ||
| 2198 | prom_setprop(_prom->chosen, "/chosen", "linux,crashkernel-base", | ||
| 2199 | PTRRELOC(&prom_crashk_base), | ||
| 2200 | sizeof(RELOC(prom_crashk_base))); | ||
| 2201 | prom_setprop(_prom->chosen, "/chosen", "linux,crashkernel-size", | ||
| 2202 | PTRRELOC(&prom_crashk_size), | ||
| 2203 | sizeof(RELOC(prom_crashk_size))); | ||
| 2204 | } | ||
| 2205 | #endif | ||
| 2153 | /* | 2206 | /* |
| 2154 | * Fixup any known bugs in the device-tree | 2207 | * Fixup any known bugs in the device-tree |
| 2155 | */ | 2208 | */ |
