lkml.org 
[lkml]   [2009]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [v10 PATCH 8/9]: pSeries: implement pSeries processor idle module
    * Benjamin Herrenschmidt <benh@kernel.crashing.org> [2009-12-04 13:47:38]:

    > On Wed, 2009-12-02 at 15:32 +0530, Arun R Bharadwaj wrote:
    > > * Arun R Bharadwaj <arun@linux.vnet.ibm.com> [2009-12-02 15:24:27]:
    > >
    > > This patch creates arch/powerpc/platforms/pseries/processor_idle.c,
    > > which implements the cpuidle infrastructure for pseries.
    > > It implements a pseries_cpuidle_loop() which would be the main idle loop
    > > called from cpu_idle(). It makes decision of entering either
    > > dedicated_snooze_loop or dedicated_cede_loop for dedicated lpar and
    > > shared_cede_loop for shared lpar processor based on the
    > > decision taken by the cpuidle governor.
    >
    > So unless I'm mistaken, you removed our powerpc "generic" idle loop that
    > calls into ppc_md.power_save(), and replaced it by some pseries specific
    > idle loops... Now what about all the other powerpc platforms ? native
    > 970 (aka G5) ? 6xx ? Cell ? Or are you still calling ppc_md.power_save
    > somewhere that I missed ?
    >
    > Cheers,
    > Ben.

    Hi Ben,

    I forgot to attach the patch which enables cpuidle for the rest of the
    POWER platforms. Attaching it below.

    So for these platforms, ppc_md.power_save will be called from from the
    cpuidle_idle_call idle loop itself. Also, this cpuidle_idle_call is
    not a pseries specific idle loop. It is a common loop for Intel and
    PPC which use cpuidle infrastructure.

    arun



    This patch enables cpuidle for the rest of the POWER platforms like
    44x, Cell, Pasemi etc.

    Signed-off-by: Arun R Bharadwaj <arun@linux.vnet.ibm.com>
    ---
    arch/powerpc/include/asm/system.h | 2 ++
    arch/powerpc/kernel/idle.c | 28 ++++++++++++++++++++++++++++
    arch/powerpc/kernel/setup_32.c | 8 ++++++--
    arch/powerpc/platforms/44x/idle.c | 2 ++
    arch/powerpc/platforms/cell/pervasive.c | 2 ++
    arch/powerpc/platforms/pasemi/idle.c | 2 ++
    arch/powerpc/platforms/ps3/setup.c | 2 ++
    7 files changed, 44 insertions(+), 2 deletions(-)

    Index: linux.trees.git/arch/powerpc/include/asm/system.h
    ===================================================================
    --- linux.trees.git.orig/arch/powerpc/include/asm/system.h
    +++ linux.trees.git/arch/powerpc/include/asm/system.h
    @@ -551,8 +551,10 @@ void cpu_idle_wait(void);

    #ifdef CONFIG_CPU_IDLE
    extern void update_smt_snooze_delay(int snooze);
    +extern void setup_cpuidle_ppc(void);
    #else
    static inline void update_smt_snooze_delay(int snooze) {}
    +static inline void setup_cpuidle_ppc(void) {}
    #endif

    #endif /* __KERNEL__ */
    Index: linux.trees.git/arch/powerpc/kernel/idle.c
    ===================================================================
    --- linux.trees.git.orig/arch/powerpc/kernel/idle.c
    +++ linux.trees.git/arch/powerpc/kernel/idle.c
    @@ -129,6 +129,34 @@ void default_idle(void)
    HMT_very_low();
    }

    +#ifdef CONFIG_CPU_IDLE
    +DEFINE_PER_CPU(struct cpuidle_device, ppc_idle_devices);
    +struct cpuidle_driver cpuidle_ppc_driver = {
    + .name = "cpuidle_ppc",
    +};
    +
    +static void ppc_idle_loop(struct cpuidle_device *dev, struct cpuidle_state *st)
    +{
    + ppc_md.power_save();
    +}
    +
    +void setup_cpuidle_ppc(void)
    +{
    + struct cpuidle_device *dev;
    + int cpu;
    +
    + cpuidle_register_driver(&cpuidle_ppc_driver);
    +
    + for_each_online_cpu(cpu) {
    + dev = &per_cpu(ppc_idle_devices, cpu);
    + dev->cpu = cpu;
    + dev->states[0].enter = ppc_idle_loop;
    + dev->state_count = 1;
    + cpuidle_register_device(dev);
    + }
    +}
    +#endif
    +
    int powersave_nap;

    #ifdef CONFIG_SYSCTL
    Index: linux.trees.git/arch/powerpc/kernel/setup_32.c
    ===================================================================
    --- linux.trees.git.orig/arch/powerpc/kernel/setup_32.c
    +++ linux.trees.git/arch/powerpc/kernel/setup_32.c
    @@ -133,14 +133,18 @@ notrace void __init machine_init(unsigne

    #ifdef CONFIG_6xx
    if (cpu_has_feature(CPU_FTR_CAN_DOZE) ||
    - cpu_has_feature(CPU_FTR_CAN_NAP))
    + cpu_has_feature(CPU_FTR_CAN_NAP)) {
    ppc_md.power_save = ppc6xx_idle;
    + setup_cpuidle_ppc();
    + }
    #endif

    #ifdef CONFIG_E500
    if (cpu_has_feature(CPU_FTR_CAN_DOZE) ||
    - cpu_has_feature(CPU_FTR_CAN_NAP))
    + cpu_has_feature(CPU_FTR_CAN_NAP)) {
    ppc_md.power_save = e500_idle;
    + setup_cpuidle_ppc();
    + }
    #endif
    if (ppc_md.progress)
    ppc_md.progress("id mach(): done", 0x200);
    Index: linux.trees.git/arch/powerpc/platforms/44x/idle.c
    ===================================================================
    --- linux.trees.git.orig/arch/powerpc/platforms/44x/idle.c
    +++ linux.trees.git/arch/powerpc/platforms/44x/idle.c
    @@ -24,6 +24,7 @@
    #include <linux/of.h>
    #include <linux/kernel.h>
    #include <asm/machdep.h>
    +#include <asm/system.h>

    static int mode_spin;

    @@ -46,6 +47,7 @@ int __init ppc44x_idle_init(void)
    /* If we are not setting spin mode
    then we set to wait mode */
    ppc_md.power_save = &ppc44x_idle;
    + setup_cpuidle_ppc();
    }

    return 0;
    Index: linux.trees.git/arch/powerpc/platforms/cell/pervasive.c
    ===================================================================
    --- linux.trees.git.orig/arch/powerpc/platforms/cell/pervasive.c
    +++ linux.trees.git/arch/powerpc/platforms/cell/pervasive.c
    @@ -35,6 +35,7 @@
    #include <asm/pgtable.h>
    #include <asm/reg.h>
    #include <asm/cell-regs.h>
    +#include <asm/system.h>

    #include "pervasive.h"

    @@ -128,5 +129,6 @@ void __init cbe_pervasive_init(void)
    }

    ppc_md.power_save = cbe_power_save;
    + setup_cpuidle_ppc();
    ppc_md.system_reset_exception = cbe_system_reset_exception;
    }
    Index: linux.trees.git/arch/powerpc/platforms/pasemi/idle.c
    ===================================================================
    --- linux.trees.git.orig/arch/powerpc/platforms/pasemi/idle.c
    +++ linux.trees.git/arch/powerpc/platforms/pasemi/idle.c
    @@ -27,6 +27,7 @@
    #include <asm/machdep.h>
    #include <asm/reg.h>
    #include <asm/smp.h>
    +#include <asm/system.h>

    #include "pasemi.h"

    @@ -81,6 +82,7 @@ static int __init pasemi_idle_init(void)

    ppc_md.system_reset_exception = pasemi_system_reset_exception;
    ppc_md.power_save = modes[current_mode].entry;
    + setup_cpuidle_ppc();
    printk(KERN_INFO "Using PA6T idle loop (%s)\n", modes[current_mode].name);

    return 0;
    Index: linux.trees.git/arch/powerpc/platforms/ps3/setup.c
    ===================================================================
    --- linux.trees.git.orig/arch/powerpc/platforms/ps3/setup.c
    +++ linux.trees.git/arch/powerpc/platforms/ps3/setup.c
    @@ -33,6 +33,7 @@
    #include <asm/prom.h>
    #include <asm/lv1call.h>
    #include <asm/ps3gpu.h>
    +#include <asm/system.h>

    #include "platform.h"

    @@ -214,6 +215,7 @@ static void __init ps3_setup_arch(void)
    prealloc_ps3flash_bounce_buffer();

    ppc_md.power_save = ps3_power_save;
    + setup_cpuidle_ppc();
    ps3_os_area_init();

    DBG(" <- %s:%d\n", __func__, __LINE__);

    \
     
     \ /
      Last update: 2009-12-04 09:19    [W:0.034 / U:89.416 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site