idle.c (688d794c4c3f8b08c814381ee2edd3ede5856056) | idle.c (799fef06123f86ff69cf754f996219e6ad1678f8) |
---|---|
1/* 2 * Idle daemon for PowerPC. Idle daemon will handle any action 3 * that needs to be taken when the system becomes idle. 4 * 5 * Originally written by Cort Dougan (cort@cs.nmt.edu). 6 * Subsequent 32-bit hacking by Tom Rini, Armin Kuster, 7 * Paul Mackerras and others. 8 * --- 19 unchanged lines hidden (view full) --- 28 29#include <asm/processor.h> 30#include <asm/cputable.h> 31#include <asm/time.h> 32#include <asm/machdep.h> 33#include <asm/runlatch.h> 34#include <asm/smp.h> 35 | 1/* 2 * Idle daemon for PowerPC. Idle daemon will handle any action 3 * that needs to be taken when the system becomes idle. 4 * 5 * Originally written by Cort Dougan (cort@cs.nmt.edu). 6 * Subsequent 32-bit hacking by Tom Rini, Armin Kuster, 7 * Paul Mackerras and others. 8 * --- 19 unchanged lines hidden (view full) --- 28 29#include <asm/processor.h> 30#include <asm/cputable.h> 31#include <asm/time.h> 32#include <asm/machdep.h> 33#include <asm/runlatch.h> 34#include <asm/smp.h> 35 |
36#ifdef CONFIG_HOTPLUG_CPU 37#define cpu_should_die() cpu_is_offline(smp_processor_id()) 38#else 39#define cpu_should_die() 0 40#endif | |
41 42unsigned long cpuidle_disable = IDLE_NO_OVERRIDE; 43EXPORT_SYMBOL(cpuidle_disable); 44 45static int __init powersave_off(char *arg) 46{ 47 ppc_md.power_save = NULL; 48 cpuidle_disable = IDLE_POWERSAVE_OFF; 49 return 0; 50} 51__setup("powersave=off", powersave_off); 52 | 36 37unsigned long cpuidle_disable = IDLE_NO_OVERRIDE; 38EXPORT_SYMBOL(cpuidle_disable); 39 40static int __init powersave_off(char *arg) 41{ 42 ppc_md.power_save = NULL; 43 cpuidle_disable = IDLE_POWERSAVE_OFF; 44 return 0; 45} 46__setup("powersave=off", powersave_off); 47 |
53/* 54 * The body of the idle task. 55 */ 56void cpu_idle(void) | 48#ifdef CONFIG_HOTPLUG_CPU 49void arch_cpu_idle_dead(void) |
57{ | 50{ |
58 set_thread_flag(TIF_POLLING_NRFLAG); 59 while (1) { 60 tick_nohz_idle_enter(); 61 rcu_idle_enter(); | 51 sched_preempt_enable_no_resched(); 52 cpu_die(); 53} 54#endif |
62 | 55 |
63 while (!need_resched() && !cpu_should_die()) { 64 ppc64_runlatch_off(); | 56void arch_cpu_idle(void) 57{ 58 ppc64_runlatch_off(); |
65 | 59 |
66 if (ppc_md.power_save) { 67 clear_thread_flag(TIF_POLLING_NRFLAG); 68 /* 69 * smp_mb is so clearing of TIF_POLLING_NRFLAG 70 * is ordered w.r.t. need_resched() test. 71 */ 72 smp_mb(); 73 local_irq_disable(); 74 75 /* Don't trace irqs off for idle */ 76 stop_critical_timings(); 77 78 /* check again after disabling irqs */ 79 if (!need_resched() && !cpu_should_die()) 80 ppc_md.power_save(); 81 82 start_critical_timings(); 83 84 /* Some power_save functions return with 85 * interrupts enabled, some don't. 86 */ 87 if (irqs_disabled()) 88 local_irq_enable(); 89 set_thread_flag(TIF_POLLING_NRFLAG); 90 91 } else { 92 /* 93 * Go into low thread priority and possibly 94 * low power mode. 95 */ 96 HMT_low(); 97 HMT_very_low(); 98 } 99 } 100 101 HMT_medium(); 102 ppc64_runlatch_on(); 103 rcu_idle_exit(); 104 tick_nohz_idle_exit(); 105 if (cpu_should_die()) { 106 sched_preempt_enable_no_resched(); 107 cpu_die(); 108 } 109 schedule_preempt_disabled(); | 60 if (ppc_md.power_save) { 61 ppc_md.power_save(); 62 /* 63 * Some power_save functions return with 64 * interrupts enabled, some don't. 65 */ 66 if (irqs_disabled()) 67 local_irq_enable(); 68 } else { 69 local_irq_enable(); 70 /* 71 * Go into low thread priority and possibly 72 * low power mode. 73 */ 74 HMT_low(); 75 HMT_very_low(); |
110 } | 76 } |
77 78 HMT_medium(); 79 ppc64_runlatch_on(); |
|
111} 112 113int powersave_nap; 114 115#ifdef CONFIG_SYSCTL 116/* 117 * Register the sysctl to set/clear powersave_nap. 118 */ --- 28 unchanged lines hidden --- | 80} 81 82int powersave_nap; 83 84#ifdef CONFIG_SYSCTL 85/* 86 * Register the sysctl to set/clear powersave_nap. 87 */ --- 28 unchanged lines hidden --- |