* Peter Zijlstra <a.p.zijls...@chello.nl> [2009-08-27 14:53:27]:

Hi Peter, Ben,

I've put the whole thing in a sort of a block diagram. Hope it
explains things more clearly.






                                ----------------
                                |    CPUIDLE   |  (Select idle states like
                                |   GOVERNORS  |   C1, C1e, C6 etc in case
                                | (Menu/Ladder)|   x86 & nap, snooze in
                                |              |   case of POWER - based on
                                ----------------   latency & power req)
                                        ^
                                        |
                                        |
                                        |
                                        |
                                        |
  ----------                    -----------------                -------------
  |        |                    |               |                |  PSERIES  |
  |  ACPI  |------------------> |    CPUIDLE    | <--------------|   IDLE    |
  |        |                    |               |                |           |
  ----------                    -----------------                -------------

Main idle routine- pm_idle()                             Main idle routine-
                                                             ppc_md.power_save()

pm_idle = cpuidle_pm_idle;                               ppc_md.power_save =
(start using cpuidle's idle                                   cpuidle_pm_idle();
 loop, which internally calls
 governor to select the right
 state to go into).


Relavent code snippet from drivers/cpuidle/cpuidle.c
-------------------------------------

static void cpuidle_idle_call(void)
{
        ............
        ............

        /* Call the menu_select() to select the idle state to enter. */
        next_state = cpuidle_curr_governor->select(dev);

        ............
        ............

        /*
         * Enter the idle state previously selected. target_state->enter
         * would call pseries_cpuidle_loop() which selects nap/snooze
         * /
        dev->last_residency = target_state->enter(dev, target_state);
}

void cpuidle_install_idle_handler(void)
{
        .........
        .........
        cpuidle_pm_idle = cpuidle_idle_call;
}

--arun
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to