Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / x86 / kernel / process.c
index dcfc1f4..14ae100 100644 (file)
@@ -268,13 +268,7 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
 unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;
 EXPORT_SYMBOL(boot_option_idle_override);
 
-/*
- * Powermanagement idle function, if any..
- */
-void (*pm_idle)(void);
-#ifdef CONFIG_APM_MODULE
-EXPORT_SYMBOL(pm_idle);
-#endif
+static void (*x86_idle)(void);
 
 #ifndef CONFIG_SMP
 static inline void play_dead(void)
@@ -351,7 +345,7 @@ void cpu_idle(void)
                        rcu_idle_enter();
 
                        if (cpuidle_idle_call())
-                               pm_idle();
+                               x86_idle();
 
                        rcu_idle_exit();
                        start_critical_timings();
@@ -394,14 +388,16 @@ void default_idle(void)
 EXPORT_SYMBOL(default_idle);
 #endif
 
-bool set_pm_idle_to_default(void)
+#ifdef CONFIG_XEN
+bool xen_set_default_idle(void)
 {
-       bool ret = !!pm_idle;
+       bool ret = !!x86_idle;
 
-       pm_idle = default_idle;
+       x86_idle = default_idle;
 
        return ret;
 }
+#endif
 void stop_this_cpu(void *dummy)
 {
        local_irq_disable();
@@ -411,29 +407,8 @@ void stop_this_cpu(void *dummy)
        set_cpu_online(smp_processor_id(), false);
        disable_local_APIC();
 
-       for (;;) {
-               if (hlt_works(smp_processor_id()))
-                       halt();
-       }
-}
-
-/* Default MONITOR/MWAIT with no hints, used for default C1 state */
-static void mwait_idle(void)
-{
-       if (!need_resched()) {
-               trace_cpu_idle_rcuidle(1, smp_processor_id());
-               if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR))
-                       clflush((void *)&current_thread_info()->flags);
-
-               __monitor((void *)&current_thread_info()->flags, 0, 0);
-               smp_mb();
-               if (!need_resched())
-                       __sti_mwait(0, 0);
-               else
-                       local_irq_enable();
-               trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
-       } else
-               local_irq_enable();
+       for (;;)
+               halt();
 }
 
 /*
@@ -450,53 +425,6 @@ static void poll_idle(void)
        trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
 }
 
-/*
- * mwait selection logic:
- *
- * It depends on the CPU. For AMD CPUs that support MWAIT this is
- * wrong. Family 0x10 and 0x11 CPUs will enter C1 on HLT. Powersavings
- * then depend on a clock divisor and current Pstate of the core. If
- * all cores of a processor are in halt state (C1) the processor can
- * enter the C1E (C1 enhanced) state. If mwait is used this will never
- * happen.
- *
- * idle=mwait overrides this decision and forces the usage of mwait.
- */
-
-#define MWAIT_INFO                     0x05
-#define MWAIT_ECX_EXTENDED_INFO                0x01
-#define MWAIT_EDX_C1                   0xf0
-
-int mwait_usable(const struct cpuinfo_x86 *c)
-{
-       u32 eax, ebx, ecx, edx;
-
-       /* Use mwait if idle=mwait boot option is given */
-       if (boot_option_idle_override == IDLE_FORCE_MWAIT)
-               return 1;
-
-       /*
-        * Any idle= boot option other than idle=mwait means that we must not
-        * use mwait. Eg: idle=halt or idle=poll or idle=nomwait
-        */
-       if (boot_option_idle_override != IDLE_NO_OVERRIDE)
-               return 0;
-
-       if (c->cpuid_level < MWAIT_INFO)
-               return 0;
-
-       cpuid(MWAIT_INFO, &eax, &ebx, &ecx, &edx);
-       /* Check, whether EDX has extended info about MWAIT */
-       if (!(ecx & MWAIT_ECX_EXTENDED_INFO))
-               return 1;
-
-       /*
-        * edx enumeratios MONITOR/MWAIT extensions. Check, whether
-        * C1  supports MWAIT
-        */
-       return (edx & MWAIT_EDX_C1);
-}
-
 bool amd_e400_c1e_detected;
 EXPORT_SYMBOL(amd_e400_c1e_detected);
 
@@ -561,31 +489,24 @@ static void amd_e400_idle(void)
 void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
 {
 #ifdef CONFIG_SMP
-       if (pm_idle == poll_idle && smp_num_siblings > 1) {
+       if (x86_idle == poll_idle && smp_num_siblings > 1)
                pr_warn_once("WARNING: polling idle and HT enabled, performance may degrade\n");
-       }
 #endif
-       if (pm_idle)
+       if (x86_idle)
                return;
 
-       if (cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c)) {
-               /*
-                * One CPU supports mwait => All CPUs supports mwait
-                */
-               pr_info("using mwait in idle threads\n");
-               pm_idle = mwait_idle;
-       } else if (cpu_has_amd_erratum(amd_erratum_400)) {
+       if (cpu_has_amd_erratum(amd_erratum_400)) {
                /* E400: APIC timer interrupt does not wake up CPU from C1e */
                pr_info("using AMD E400 aware idle routine\n");
-               pm_idle = amd_e400_idle;
+               x86_idle = amd_e400_idle;
        } else
-               pm_idle = default_idle;
+               x86_idle = default_idle;
 }
 
 void __init init_amd_e400_c1e_mask(void)
 {
        /* If we're using amd_e400_idle, we need to allocate amd_e400_c1e_mask. */
-       if (pm_idle == amd_e400_idle)
+       if (x86_idle == amd_e400_idle)
                zalloc_cpumask_var(&amd_e400_c1e_mask, GFP_KERNEL);
 }
 
@@ -596,11 +517,8 @@ static int __init idle_setup(char *str)
 
        if (!strcmp(str, "poll")) {
                pr_info("using polling idle threads\n");
-               pm_idle = poll_idle;
+               x86_idle = poll_idle;
                boot_option_idle_override = IDLE_POLL;
-       } else if (!strcmp(str, "mwait")) {
-               boot_option_idle_override = IDLE_FORCE_MWAIT;
-               WARN_ONCE(1, "\"idle=mwait\" will be removed in 2012\n");
        } else if (!strcmp(str, "halt")) {
                /*
                 * When the boot option of idle=halt is added, halt is
@@ -609,7 +527,7 @@ static int __init idle_setup(char *str)
                 * To continue to load the CPU idle driver, don't touch
                 * the boot_option_idle_override.
                 */
-               pm_idle = default_idle;
+               x86_idle = default_idle;
                boot_option_idle_override = IDLE_HALT;
        } else if (!strcmp(str, "nomwait")) {
                /*