powerpc/powernv: abstraction for saving SPRs before entering deep idle states
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 <ego@linux.vnet.ibm.com> Signed-off-by: Shreyas B. Prabhu <shreyas@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Родитель
4eae2c9ae5
Коммит
0dfffb48ce
|
@ -52,6 +52,36 @@
|
||||||
|
|
||||||
.text
|
.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.
|
* 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.
|
* Threads will spin in HMT_LOW until the lock bit is cleared.
|
||||||
|
@ -209,28 +239,8 @@ fastsleep_workaround_at_entry:
|
||||||
b common_enter
|
b common_enter
|
||||||
|
|
||||||
enter_winkle:
|
enter_winkle:
|
||||||
/*
|
bl 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)
|
|
||||||
IDLE_STATE_ENTER_SEQ(PPC_WINKLE)
|
IDLE_STATE_ENTER_SEQ(PPC_WINKLE)
|
||||||
|
|
||||||
_GLOBAL(power7_idle)
|
_GLOBAL(power7_idle)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче