diff options
Diffstat (limited to 'arch/x86/kernel/process.c')
| -rw-r--r-- | arch/x86/kernel/process.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 67e9b4a1e89d..ba370dc8685b 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -99,15 +99,6 @@ static void mwait_idle(void) | |||
| 99 | local_irq_enable(); | 99 | local_irq_enable(); |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | |||
| 103 | static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c) | ||
| 104 | { | ||
| 105 | if (force_mwait) | ||
| 106 | return 1; | ||
| 107 | /* Any C1 states supported? */ | ||
| 108 | return c->cpuid_level >= 5 && ((cpuid_edx(5) >> 4) & 0xf) > 0; | ||
| 109 | } | ||
| 110 | |||
| 111 | /* | 102 | /* |
| 112 | * On SMP it's slightly faster (but much more power-consuming!) | 103 | * On SMP it's slightly faster (but much more power-consuming!) |
| 113 | * to poll the ->work.need_resched flag instead of waiting for the | 104 | * to poll the ->work.need_resched flag instead of waiting for the |
| @@ -119,6 +110,33 @@ static void poll_idle(void) | |||
| 119 | cpu_relax(); | 110 | cpu_relax(); |
| 120 | } | 111 | } |
| 121 | 112 | ||
| 113 | /* | ||
| 114 | * mwait selection logic: | ||
| 115 | * | ||
| 116 | * It depends on the CPU. For AMD CPUs that support MWAIT this is | ||
| 117 | * wrong. Family 0x10 and 0x11 CPUs will enter C1 on HLT. Powersavings | ||
| 118 | * then depend on a clock divisor and current Pstate of the core. If | ||
| 119 | * all cores of a processor are in halt state (C1) the processor can | ||
| 120 | * enter the C1E (C1 enhanced) state. If mwait is used this will never | ||
| 121 | * happen. | ||
| 122 | * | ||
| 123 | * idle=mwait overrides this decision and forces the usage of mwait. | ||
| 124 | */ | ||
| 125 | static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c) | ||
| 126 | { | ||
| 127 | if (force_mwait) | ||
| 128 | return 1; | ||
| 129 | |||
| 130 | if (c->x86_vendor == X86_VENDOR_AMD) { | ||
| 131 | switch(c->x86) { | ||
| 132 | case 0x10: | ||
| 133 | case 0x11: | ||
| 134 | return 0; | ||
| 135 | } | ||
| 136 | } | ||
| 137 | return 1; | ||
| 138 | } | ||
| 139 | |||
| 122 | void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) | 140 | void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) |
| 123 | { | 141 | { |
| 124 | static int selected; | 142 | static int selected; |
