aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2008-06-24 05:58:53 -0400
committerAndi Kleen <andi@basil.nowhere.org>2008-07-16 17:27:05 -0400
commitc1e3b377ad48febba6f91b8ae42c44ee4d4ab45e (patch)
tree7893e4226f52c4001150066f544415c1b17741f5 /arch
parent5b53496a5ad79e91052f72761a7c5516b069bc99 (diff)
ACPI: Create "idle=halt" bootparam
"idle=halt" limits the idle loop to using the halt instruction. No MWAIT, no IO accesses, no C-states deeper than C1. If something is broken in the idle code, "idle=halt" is a less severe workaround than "idle=poll" which disables all power savings. Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> Signed-off-by: Len Brown <len.brown@intel.com> Signed-off-by: Andi Kleen <ak@linux.intel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/kernel/process.c2
-rw-r--r--arch/x86/kernel/process.c17
2 files changed, 18 insertions, 1 deletions
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
index fabaf08d9a69..612b3c4a0603 100644
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -55,6 +55,8 @@ void (*ia64_mark_idle)(int);
55 55
56unsigned long boot_option_idle_override = 0; 56unsigned long boot_option_idle_override = 0;
57EXPORT_SYMBOL(boot_option_idle_override); 57EXPORT_SYMBOL(boot_option_idle_override);
58unsigned long idle_halt;
59EXPORT_SYMBOL(idle_halt);
58 60
59void 61void
60ia64_do_show_stack (struct unw_frame_info *info, void *arg) 62ia64_do_show_stack (struct unw_frame_info *info, void *arg)
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 7dceea947232..7fc729498760 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -7,6 +7,10 @@
7#include <linux/module.h> 7#include <linux/module.h>
8#include <linux/pm.h> 8#include <linux/pm.h>
9#include <linux/clockchips.h> 9#include <linux/clockchips.h>
10#include <asm/system.h>
11
12unsigned long idle_halt;
13EXPORT_SYMBOL(idle_halt);
10 14
11struct kmem_cache *task_xstate_cachep; 15struct kmem_cache *task_xstate_cachep;
12 16
@@ -325,7 +329,18 @@ static int __init idle_setup(char *str)
325 pm_idle = poll_idle; 329 pm_idle = poll_idle;
326 } else if (!strcmp(str, "mwait")) 330 } else if (!strcmp(str, "mwait"))
327 force_mwait = 1; 331 force_mwait = 1;
328 else 332 else if (!strcmp(str, "halt")) {
333 /*
334 * When the boot option of idle=halt is added, halt is
335 * forced to be used for CPU idle. In such case CPU C2/C3
336 * won't be used again.
337 * To continue to load the CPU idle driver, don't touch
338 * the boot_option_idle_override.
339 */
340 pm_idle = default_idle;
341 idle_halt = 1;
342 return 0;
343 } else
329 return -1; 344 return -1;
330 345
331 boot_option_idle_override = 1; 346 boot_option_idle_override = 1;