aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2007-05-02 13:27:12 -0400
committerAndi Kleen <andi@basil.nowhere.org>2007-05-02 13:27:12 -0400
commitf039b754714a422959027cb18bb33760eb8153f0 (patch)
treec5f28502adf35f5ea7738a974cd7c4fc81e1dd21 /arch/i386
parentc169859d6dfc7471ef9f2dbd720936e17906a084 (diff)
[PATCH] x86: Don't use MWAIT on AMD Family 10
It doesn't put the CPU into deeper sleep states, so it's better to use the standard idle loop to save power. But allow to reenable it anyways for benchmarking. I also removed the obsolete idle=halt on i386 Cc: andreas.herrmann@amd.com Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/kernel/cpu/amd.c5
-rw-r--r--arch/i386/kernel/process.c17
2 files changed, 13 insertions, 9 deletions
diff --git a/arch/i386/kernel/cpu/amd.c b/arch/i386/kernel/cpu/amd.c
index 2d47db482972..197cda62caa3 100644
--- a/arch/i386/kernel/cpu/amd.c
+++ b/arch/i386/kernel/cpu/amd.c
@@ -53,6 +53,8 @@ static __cpuinit int amd_apic_timer_broken(void)
53 return 0; 53 return 0;
54} 54}
55 55
56int force_mwait __cpuinitdata;
57
56static void __cpuinit init_amd(struct cpuinfo_x86 *c) 58static void __cpuinit init_amd(struct cpuinfo_x86 *c)
57{ 59{
58 u32 l, h; 60 u32 l, h;
@@ -275,6 +277,9 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
275 277
276 if (amd_apic_timer_broken()) 278 if (amd_apic_timer_broken())
277 set_bit(X86_FEATURE_LAPIC_TIMER_BROKEN, c->x86_capability); 279 set_bit(X86_FEATURE_LAPIC_TIMER_BROKEN, c->x86_capability);
280
281 if (c->x86 == 0x10 && !force_mwait)
282 clear_bit(X86_FEATURE_MWAIT, c->x86_capability);
278} 283}
279 284
280static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 * c, unsigned int size) 285static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 * c, unsigned int size)
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
index 393a67d5d943..7e8e129b3d7d 100644
--- a/arch/i386/kernel/process.c
+++ b/arch/i386/kernel/process.c
@@ -272,25 +272,24 @@ void __devinit select_idle_routine(const struct cpuinfo_x86 *c)
272 } 272 }
273} 273}
274 274
275static int __init idle_setup (char *str) 275static int __init idle_setup(char *str)
276{ 276{
277 if (!strncmp(str, "poll", 4)) { 277 if (!strcmp(str, "poll")) {
278 printk("using polling idle threads.\n"); 278 printk("using polling idle threads.\n");
279 pm_idle = poll_idle; 279 pm_idle = poll_idle;
280#ifdef CONFIG_X86_SMP 280#ifdef CONFIG_X86_SMP
281 if (smp_num_siblings > 1) 281 if (smp_num_siblings > 1)
282 printk("WARNING: polling idle and HT enabled, performance may degrade.\n"); 282 printk("WARNING: polling idle and HT enabled, performance may degrade.\n");
283#endif 283#endif
284 } else if (!strncmp(str, "halt", 4)) { 284 } else if (!strcmp(str, "mwait"))
285 printk("using halt in idle threads.\n"); 285 force_mwait = 1;
286 pm_idle = default_idle; 286 else
287 } 287 return -1;
288 288
289 boot_option_idle_override = 1; 289 boot_option_idle_override = 1;
290 return 1; 290 return 0;
291} 291}
292 292early_param("idle", idle_setup);
293__setup("idle=", idle_setup);
294 293
295void show_regs(struct pt_regs * regs) 294void show_regs(struct pt_regs * regs)
296{ 295{