diff options
| author | Boris Ostrovsky <boris.ostrovsky@amd.com> | 2012-03-13 14:55:09 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2012-03-30 03:23:01 -0400 |
| commit | 1a022e3f1be11730bd8747b1af96a0274bf6356e (patch) | |
| tree | d3c95b68626ac7d963ac3a85a07dae1cfc011906 /drivers/cpuidle | |
| parent | e07510585a88c0f6c6c728e2e006aa913496d4ae (diff) | |
idle, x86: Allow off-lined CPU to enter deeper C states
Currently when a CPU is off-lined it enters either MWAIT-based idle or,
if MWAIT is not desired or supported, HLT-based idle (which places the
processor in C1 state). This patch allows processors without MWAIT
support to stay in states deeper than C1.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/cpuidle')
| -rw-r--r-- | drivers/cpuidle/cpuidle.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index f7cab5e9c4d..3e146b2ada4 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -72,6 +72,34 @@ typedef int (*cpuidle_enter_t)(struct cpuidle_device *dev, | |||
| 72 | static cpuidle_enter_t cpuidle_enter_ops; | 72 | static cpuidle_enter_t cpuidle_enter_ops; |
| 73 | 73 | ||
| 74 | /** | 74 | /** |
| 75 | * cpuidle_play_dead - cpu off-lining | ||
| 76 | * | ||
| 77 | * Only returns in case of an error | ||
| 78 | */ | ||
| 79 | int cpuidle_play_dead(void) | ||
| 80 | { | ||
| 81 | struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); | ||
| 82 | struct cpuidle_driver *drv = cpuidle_get_driver(); | ||
| 83 | int i, dead_state = -1; | ||
| 84 | int power_usage = -1; | ||
| 85 | |||
| 86 | /* Find lowest-power state that supports long-term idle */ | ||
| 87 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { | ||
| 88 | struct cpuidle_state *s = &drv->states[i]; | ||
| 89 | |||
| 90 | if (s->power_usage < power_usage && s->enter_dead) { | ||
| 91 | power_usage = s->power_usage; | ||
| 92 | dead_state = i; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | if (dead_state != -1) | ||
| 97 | return drv->states[dead_state].enter_dead(dev, dead_state); | ||
| 98 | |||
| 99 | return -ENODEV; | ||
| 100 | } | ||
| 101 | |||
| 102 | /** | ||
| 75 | * cpuidle_idle_call - the main idle loop | 103 | * cpuidle_idle_call - the main idle loop |
| 76 | * | 104 | * |
| 77 | * NOTE: no locks or semaphores should be used here | 105 | * NOTE: no locks or semaphores should be used here |
