static void cbe_idle(void) { unsigned long ctrl; /* Why do we do that on every idle ? Couldn't that be done once for * all or do we lose the state some way ? Also, the pm_control * register setting, that can't be set once at boot ? We really want * to move that away in order to implement a simple powersave */ cbe_enable_pause_zero(); while (1) { if (!need_resched()) { local_irq_disable(); while (!need_resched()) { /* go into low thread priority */ HMT_low(); /* * atomically disable thread execution * and runlatch. * External and Decrementer exceptions * are still handled when the thread * is disabled but now enter in * cbe_system_reset_exception() */ ctrl = mfspr(SPRN_CTRLF); ctrl &= ~(CTRL_RUNLATCH | CTRL_TE); mtspr(SPRN_CTRLT, ctrl); } /* restore thread prio */ HMT_medium(); local_irq_enable(); } /* * turn runlatch on again before scheduling the * process we just woke up */ ppc64_runlatch_on(); preempt_enable_no_resched(); schedule(); preempt_disable(); } }
static void cbe_idle(void) { unsigned long ctrl; cbe_enable_pause_zero(); while (1) { if (!need_resched()) { local_irq_disable(); while (!need_resched()) { /* go into low thread priority */ HMT_low(); /* * atomically disable thread execution * and runlatch. * External and Decrementer exceptions * are still handled when the thread * is disabled but now enter in * cbe_system_reset_exception() */ ctrl = mfspr(SPRN_CTRLF); ctrl &= ~(CTRL_RUNLATCH | CTRL_TE); mtspr(SPRN_CTRLT, ctrl); } /* restore thread prio */ HMT_medium(); local_irq_enable(); } /* * turn runlatch on again before scheduling the * process we just woke up */ ppc64_runlatch_on(); preempt_enable_no_resched(); schedule(); preempt_disable(); } }