diff options
| -rw-r--r-- | arch/powerpc/kernel/setup_64.c | 5 | ||||
| -rw-r--r-- | arch/ppc64/kernel/machine_kexec.c | 51 | ||||
| -rw-r--r-- | include/asm-powerpc/kexec.h | 1 |
3 files changed, 57 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index fdbd9f9122f2..608fee7c7e20 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
| @@ -59,6 +59,7 @@ | |||
| 59 | #include <asm/firmware.h> | 59 | #include <asm/firmware.h> |
| 60 | #include <asm/xmon.h> | 60 | #include <asm/xmon.h> |
| 61 | #include <asm/udbg.h> | 61 | #include <asm/udbg.h> |
| 62 | #include <asm/kexec.h> | ||
| 62 | 63 | ||
| 63 | #include "setup.h" | 64 | #include "setup.h" |
| 64 | 65 | ||
| @@ -415,6 +416,10 @@ void __init setup_system(void) | |||
| 415 | */ | 416 | */ |
| 416 | unflatten_device_tree(); | 417 | unflatten_device_tree(); |
| 417 | 418 | ||
| 419 | #ifdef CONFIG_KEXEC | ||
| 420 | kexec_setup(); /* requires unflattened device tree. */ | ||
| 421 | #endif | ||
| 422 | |||
| 418 | /* | 423 | /* |
| 419 | * Fill the ppc64_caches & systemcfg structures with informations | 424 | * Fill the ppc64_caches & systemcfg structures with informations |
| 420 | * retreived from the device-tree. Need to be called before | 425 | * retreived from the device-tree. Need to be called before |
diff --git a/arch/ppc64/kernel/machine_kexec.c b/arch/ppc64/kernel/machine_kexec.c index 203f1d5e6f10..97c51e452be7 100644 --- a/arch/ppc64/kernel/machine_kexec.c +++ b/arch/ppc64/kernel/machine_kexec.c | |||
| @@ -305,3 +305,54 @@ void machine_kexec(struct kimage *image) | |||
| 305 | ppc_md.hpte_clear_all); | 305 | ppc_md.hpte_clear_all); |
| 306 | /* NOTREACHED */ | 306 | /* NOTREACHED */ |
| 307 | } | 307 | } |
| 308 | |||
| 309 | /* Values we need to export to the second kernel via the device tree. */ | ||
| 310 | static unsigned long htab_base, htab_size, kernel_end; | ||
| 311 | |||
| 312 | static struct property htab_base_prop = { | ||
| 313 | .name = "linux,htab-base", | ||
| 314 | .length = sizeof(unsigned long), | ||
| 315 | .value = (unsigned char *)&htab_base, | ||
| 316 | }; | ||
| 317 | |||
| 318 | static struct property htab_size_prop = { | ||
| 319 | .name = "linux,htab-size", | ||
| 320 | .length = sizeof(unsigned long), | ||
| 321 | .value = (unsigned char *)&htab_size, | ||
| 322 | }; | ||
| 323 | |||
| 324 | static struct property kernel_end_prop = { | ||
| 325 | .name = "linux,kernel-end", | ||
| 326 | .length = sizeof(unsigned long), | ||
| 327 | .value = (unsigned char *)&kernel_end, | ||
| 328 | }; | ||
| 329 | |||
| 330 | static void __init export_htab_values(void) | ||
| 331 | { | ||
| 332 | struct device_node *node; | ||
| 333 | |||
| 334 | node = of_find_node_by_path("/chosen"); | ||
| 335 | if (!node) | ||
| 336 | return; | ||
| 337 | |||
| 338 | kernel_end = __pa(_end); | ||
| 339 | prom_add_property(node, &kernel_end_prop); | ||
| 340 | |||
| 341 | /* On machines with no htab htab_address is NULL */ | ||
| 342 | if (NULL == htab_address) | ||
| 343 | goto out; | ||
| 344 | |||
| 345 | htab_base = __pa(htab_address); | ||
| 346 | prom_add_property(node, &htab_base_prop); | ||
| 347 | |||
| 348 | htab_size = 1UL << ppc64_pft_size; | ||
| 349 | prom_add_property(node, &htab_size_prop); | ||
| 350 | |||
| 351 | out: | ||
| 352 | of_node_put(node); | ||
| 353 | } | ||
| 354 | |||
| 355 | void __init kexec_setup(void) | ||
| 356 | { | ||
| 357 | export_htab_values(); | ||
| 358 | } | ||
diff --git a/include/asm-powerpc/kexec.h b/include/asm-powerpc/kexec.h index 062ab9ba68eb..c72ffc709ea8 100644 --- a/include/asm-powerpc/kexec.h +++ b/include/asm-powerpc/kexec.h | |||
| @@ -40,6 +40,7 @@ extern note_buf_t crash_notes[]; | |||
| 40 | #ifdef __powerpc64__ | 40 | #ifdef __powerpc64__ |
| 41 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for | 41 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for |
| 42 | master to copy new code to 0 */ | 42 | master to copy new code to 0 */ |
| 43 | extern void __init kexec_setup(void); | ||
| 43 | #else | 44 | #else |
| 44 | struct kimage; | 45 | struct kimage; |
| 45 | extern void machine_kexec_simple(struct kimage *image); | 46 | extern void machine_kexec_simple(struct kimage *image); |
