aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/rtas.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/rtas.c')
-rw-r--r--arch/powerpc/kernel/rtas.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 41048de3c6c3..271ff6318eda 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -41,6 +41,8 @@
41#include <asm/atomic.h> 41#include <asm/atomic.h>
42#include <asm/time.h> 42#include <asm/time.h>
43#include <asm/mmu.h> 43#include <asm/mmu.h>
44#include <asm/topology.h>
45#include <asm/pSeries_reconfig.h>
44 46
45struct rtas_t rtas = { 47struct rtas_t rtas = {
46 .lock = __ARCH_SPIN_LOCK_UNLOCKED 48 .lock = __ARCH_SPIN_LOCK_UNLOCKED
@@ -493,7 +495,7 @@ unsigned int rtas_busy_delay(int status)
493 495
494 might_sleep(); 496 might_sleep();
495 ms = rtas_busy_delay_time(status); 497 ms = rtas_busy_delay_time(status);
496 if (ms) 498 if (ms && need_resched())
497 msleep(ms); 499 msleep(ms);
498 500
499 return ms; 501 return ms;
@@ -713,6 +715,7 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w
713 int cpu; 715 int cpu;
714 716
715 slb_set_size(SLB_MIN_SIZE); 717 slb_set_size(SLB_MIN_SIZE);
718 stop_topology_update();
716 printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id()); 719 printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id());
717 720
718 while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) && 721 while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) &&
@@ -728,6 +731,8 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w
728 rc = atomic_read(&data->error); 731 rc = atomic_read(&data->error);
729 732
730 atomic_set(&data->error, rc); 733 atomic_set(&data->error, rc);
734 start_topology_update();
735 pSeries_coalesce_init();
731 736
732 if (wake_when_done) { 737 if (wake_when_done) {
733 atomic_set(&data->done, 1); 738 atomic_set(&data->done, 1);
@@ -805,7 +810,7 @@ static void rtas_percpu_suspend_me(void *info)
805 __rtas_suspend_cpu((struct rtas_suspend_me_data *)info, 1); 810 __rtas_suspend_cpu((struct rtas_suspend_me_data *)info, 1);
806} 811}
807 812
808static int rtas_ibm_suspend_me(struct rtas_args *args) 813int rtas_ibm_suspend_me(struct rtas_args *args)
809{ 814{
810 long state; 815 long state;
811 long rc; 816 long rc;
@@ -855,7 +860,7 @@ static int rtas_ibm_suspend_me(struct rtas_args *args)
855 return atomic_read(&data.error); 860 return atomic_read(&data.error);
856} 861}
857#else /* CONFIG_PPC_PSERIES */ 862#else /* CONFIG_PPC_PSERIES */
858static int rtas_ibm_suspend_me(struct rtas_args *args) 863int rtas_ibm_suspend_me(struct rtas_args *args)
859{ 864{
860 return -ENOSYS; 865 return -ENOSYS;
861} 866}
@@ -969,7 +974,7 @@ void __init rtas_initialize(void)
969 */ 974 */
970#ifdef CONFIG_PPC64 975#ifdef CONFIG_PPC64
971 if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR)) { 976 if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR)) {
972 rtas_region = min(memblock.rmo_size, RTAS_INSTANTIATE_MAX); 977 rtas_region = min(ppc64_rma_size, RTAS_INSTANTIATE_MAX);
973 ibm_suspend_me_token = rtas_token("ibm,suspend-me"); 978 ibm_suspend_me_token = rtas_token("ibm,suspend-me");
974 } 979 }
975#endif 980#endif