Create a function for saving SPRs before entering deep idle states.
This function can be reused for POWER9 deep idle states.

Reviewed-by: Gautham R. Shenoy <e...@linux.vnet.ibm.com>
Signed-off-by: Shreyas B. Prabhu <shre...@linux.vnet.ibm.com>
---
 - No changes since v3

Changes in v3:
=============
 - Newly added in v3

 arch/powerpc/kernel/idle_book3s.S | 54 +++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/arch/powerpc/kernel/idle_book3s.S 
b/arch/powerpc/kernel/idle_book3s.S
index a8397e3..2f909a1 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -53,6 +53,36 @@
        .text
 
 /*
+ * Used by threads before entering deep idle states. Saves SPRs
+ * in interrupt stack frame
+ */
+save_sprs_to_stack:
+       /*
+        * Note all register i.e per-core, per-subcore or per-thread is saved
+        * here since any thread in the core might wake up first
+        */
+       mfspr   r3,SPRN_SDR1
+       std     r3,_SDR1(r1)
+       mfspr   r3,SPRN_RPR
+       std     r3,_RPR(r1)
+       mfspr   r3,SPRN_SPURR
+       std     r3,_SPURR(r1)
+       mfspr   r3,SPRN_PURR
+       std     r3,_PURR(r1)
+       mfspr   r3,SPRN_TSCR
+       std     r3,_TSCR(r1)
+       mfspr   r3,SPRN_DSCR
+       std     r3,_DSCR(r1)
+       mfspr   r3,SPRN_AMOR
+       std     r3,_AMOR(r1)
+       mfspr   r3,SPRN_WORT
+       std     r3,_WORT(r1)
+       mfspr   r3,SPRN_WORC
+       std     r3,_WORC(r1)
+
+       blr
+
+/*
  * Used by threads when the lock bit of core_idle_state is set.
  * Threads will spin in HMT_LOW until the lock bit is cleared.
  * r14 - pointer to core_idle_state
@@ -209,28 +239,8 @@ fastsleep_workaround_at_entry:
        b       common_enter
 
 enter_winkle:
-       /*
-        * Note all register i.e per-core, per-subcore or per-thread is saved
-        * here since any thread in the core might wake up first
-        */
-       mfspr   r3,SPRN_SDR1
-       std     r3,_SDR1(r1)
-       mfspr   r3,SPRN_RPR
-       std     r3,_RPR(r1)
-       mfspr   r3,SPRN_SPURR
-       std     r3,_SPURR(r1)
-       mfspr   r3,SPRN_PURR
-       std     r3,_PURR(r1)
-       mfspr   r3,SPRN_TSCR
-       std     r3,_TSCR(r1)
-       mfspr   r3,SPRN_DSCR
-       std     r3,_DSCR(r1)
-       mfspr   r3,SPRN_AMOR
-       std     r3,_AMOR(r1)
-       mfspr   r3,SPRN_WORT
-       std     r3,_WORT(r1)
-       mfspr   r3,SPRN_WORC
-       std     r3,_WORC(r1)
+       bl      save_sprs_to_stack
+
        IDLE_STATE_ENTER_SEQ(PPC_WINKLE)
 
 _GLOBAL(power7_idle)
-- 
2.4.11

Reply via email to