Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=8b32bc03256c82a6a4fcb3c2520b54469b74ec82
Commit:     8b32bc03256c82a6a4fcb3c2520b54469b74ec82
Parent:     0d08a84770cb03aea24268e515342d44df8ea588
Author:     Olof Johansson <[EMAIL PROTECTED]>
AuthorDate: Wed Nov 7 09:26:06 2007 -0600
Committer:  Olof Johansson <[EMAIL PROTECTED]>
CommitDate: Sat Dec 1 13:03:40 2007 -0600

    [POWERPC] pasemi: Don't enter powersaving states from elevated astates
    
    When the PWRficient cpus are entered into powersavings states, the
    astate is automatically dropped down to 0. While we still restore it
    when we come out of idle, it can still cause some weird effects with
    respect to performance (especially since it takes a while to ramp up to
    higher astates).
    
    So, to avoid this, don't enter power savings when the cpufreq driver
    (or user) has set higher astates than 0.
    
    The restore is still required, since there's a chance the astate has
    been raised from the other cpu while the idling one was asleep.
    
    Signed-off-by: Olof Johansson <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/pasemi/cpufreq.c   |    6 ++++++
 arch/powerpc/platforms/pasemi/pasemi.h    |    6 ++++++
 arch/powerpc/platforms/pasemi/powersave.S |   11 ++++++++++-
 3 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/platforms/pasemi/cpufreq.c 
b/arch/powerpc/platforms/pasemi/cpufreq.c
index 8caa166..58556b0 100644
--- a/arch/powerpc/platforms/pasemi/cpufreq.c
+++ b/arch/powerpc/platforms/pasemi/cpufreq.c
@@ -32,6 +32,7 @@
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/time.h>
+#include <asm/smp.h>
 
 #define SDCASR_REG             0x0100
 #define SDCASR_REG_STRIDE      0x1000
@@ -124,6 +125,11 @@ static void set_astate(int cpu, unsigned int astate)
        local_irq_restore(flags);
 }
 
+int check_astate(void)
+{
+       return get_cur_astate(hard_smp_processor_id());
+}
+
 void restore_astate(int cpu)
 {
        set_astate(cpu, current_astate);
diff --git a/arch/powerpc/platforms/pasemi/pasemi.h 
b/arch/powerpc/platforms/pasemi/pasemi.h
index 516acab..c96127b 100644
--- a/arch/powerpc/platforms/pasemi/pasemi.h
+++ b/arch/powerpc/platforms/pasemi/pasemi.h
@@ -16,8 +16,14 @@ extern void idle_doze(void);
 
 /* Restore astate to last set */
 #ifdef CONFIG_PPC_PASEMI_CPUFREQ
+extern int check_astate(void);
 extern void restore_astate(int cpu);
 #else
+static inline int check_astate(void)
+{
+       /* Always return >0 so we never power save */
+       return 1;
+}
 static inline void restore_astate(int cpu)
 {
 }
diff --git a/arch/powerpc/platforms/pasemi/powersave.S 
b/arch/powerpc/platforms/pasemi/powersave.S
index 6d0fba6..56f45ad 100644
--- a/arch/powerpc/platforms/pasemi/powersave.S
+++ b/arch/powerpc/platforms/pasemi/powersave.S
@@ -62,7 +62,16 @@ sleep_common:
        mflr    r0
        std     r0, 16(r1)
        stdu    r1,-64(r1)
+#ifdef CONFIG_PPC_PASEMI_CPUFREQ
+       std     r3, 48(r1)
 
+       /* Only do power savings when in astate 0 */
+       bl      .check_astate
+       cmpwi   r3,0
+       bne     1f
+
+       ld      r3, 48(r1)
+#endif
        LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
        mfmsr   r4
        andc    r5,r4,r6
@@ -73,7 +82,7 @@ sleep_common:
 
        mtmsrd  r4,0
 
-       addi    r1,r1,64
+1:     addi    r1,r1,64
        ld      r0,16(r1)
        mtlr    r0
        blr
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to