Commit bf0153c1 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc/64s: Move remaining system reset idle code into idle_book3s.S

No functional change.
Reviewed-by: default avatarGautham R. Shenoy <ego@linux.vnet.ibm.com>
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 2563a70c
...@@ -126,31 +126,7 @@ EXC_VIRT_NONE(0x4100, 0x100) ...@@ -126,31 +126,7 @@ EXC_VIRT_NONE(0x4100, 0x100)
#ifdef CONFIG_PPC_P7_NAP #ifdef CONFIG_PPC_P7_NAP
EXC_COMMON_BEGIN(system_reset_idle_common) EXC_COMMON_BEGIN(system_reset_idle_common)
BEGIN_FTR_SECTION b pnv_powersave_wakeup
GET_PACA(r13) /* Restore HSPRG0 to get the winkle bit in r13 */
END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
bl pnv_restore_hyp_resource
li r0,PNV_THREAD_RUNNING
stb r0,PACA_THREAD_IDLE_STATE(r13) /* Clear thread state */
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
li r0,KVM_HWTHREAD_IN_KERNEL
stb r0,HSTATE_HWTHREAD_STATE(r13)
/* Order setting hwthread_state vs. testing hwthread_req */
sync
lbz r0,HSTATE_HWTHREAD_REQ(r13)
cmpwi r0,0
beq 1f
b kvm_start_guest
1:
#endif
/* Return SRR1 from power7_nap() */
mfspr r3,SPRN_SRR1
blt cr3,2f
b pnv_wakeup_loss
2: b pnv_wakeup_noloss
#endif #endif
EXC_COMMON(system_reset_common, 0x100, system_reset_exception) EXC_COMMON(system_reset_common, 0x100, system_reset_exception)
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <asm/kvm_book3s_asm.h> #include <asm/kvm_book3s_asm.h>
#include <asm/opal.h> #include <asm/opal.h>
#include <asm/cpuidle.h> #include <asm/cpuidle.h>
#include <asm/exception-64s.h>
#include <asm/book3s/64/mmu-hash.h> #include <asm/book3s/64/mmu-hash.h>
#include <asm/mmu.h> #include <asm/mmu.h>
...@@ -113,7 +114,7 @@ core_idle_lock_held: ...@@ -113,7 +114,7 @@ core_idle_lock_held:
* *
* Address to 'rfid' to in r5 * Address to 'rfid' to in r5
*/ */
_GLOBAL(pnv_powersave_common) pnv_powersave_common:
/* Use r3 to pass state nap/sleep/winkle */ /* Use r3 to pass state nap/sleep/winkle */
/* NAP is a state loss, we create a regs frame on the /* NAP is a state loss, we create a regs frame on the
* stack, fill it up with the state we care about and * stack, fill it up with the state we care about and
...@@ -188,8 +189,8 @@ pnv_enter_arch207_idle_mode: ...@@ -188,8 +189,8 @@ pnv_enter_arch207_idle_mode:
/* The following store to HSTATE_HWTHREAD_STATE(r13) */ /* The following store to HSTATE_HWTHREAD_STATE(r13) */
/* MUST occur in real mode, i.e. with the MMU off, */ /* MUST occur in real mode, i.e. with the MMU off, */
/* and the MMU must stay off until we clear this flag */ /* and the MMU must stay off until we clear this flag */
/* and test HSTATE_HWTHREAD_REQ(r13) in the system */ /* and test HSTATE_HWTHREAD_REQ(r13) in */
/* reset interrupt vector in exceptions-64s.S. */ /* pnv_powersave_wakeup in this file. */
/* The reason is that another thread can switch the */ /* The reason is that another thread can switch the */
/* MMU to a guest context whenever this flag is set */ /* MMU to a guest context whenever this flag is set */
/* to KVM_HWTHREAD_IN_IDLE, and if the MMU was on, */ /* to KVM_HWTHREAD_IN_IDLE, and if the MMU was on, */
...@@ -376,7 +377,6 @@ _GLOBAL(power9_idle_stop) ...@@ -376,7 +377,6 @@ _GLOBAL(power9_idle_stop)
b pnv_powersave_common b pnv_powersave_common
/* No return */ /* No return */
/* /*
* On waking up from stop 0,1,2 with ESL=1 on POWER9 DD1, * On waking up from stop 0,1,2 with ESL=1 on POWER9 DD1,
* HSPRG0 will be set to the HSPRG0 value of one of the * HSPRG0 will be set to the HSPRG0 value of one of the
...@@ -415,15 +415,41 @@ power9_dd1_recover_paca: ...@@ -415,15 +415,41 @@ power9_dd1_recover_paca:
stb r0,PACA_NAPSTATELOST(r13) stb r0,PACA_NAPSTATELOST(r13)
blr blr
.global pnv_powersave_wakeup
pnv_powersave_wakeup:
BEGIN_FTR_SECTION
GET_PACA(r13) /* Restore HSPRG0 to get the winkle bit in r13 */
END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
bl pnv_restore_hyp_resource
li r0,PNV_THREAD_RUNNING
stb r0,PACA_THREAD_IDLE_STATE(r13) /* Clear thread state */
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
li r0,KVM_HWTHREAD_IN_KERNEL
stb r0,HSTATE_HWTHREAD_STATE(r13)
/* Order setting hwthread_state vs. testing hwthread_req */
sync
lbz r0,HSTATE_HWTHREAD_REQ(r13)
cmpwi r0,0
beq 1f
b kvm_start_guest
1:
#endif
/* Return SRR1 from power7_nap() */
mfspr r3,SPRN_SRR1
blt cr3,pnv_wakeup_noloss
b pnv_wakeup_loss
/* /*
* Called from reset vector. Check whether we have woken up with * Check whether we have woken up with hypervisor state loss.
* hypervisor state loss. If yes, restore hypervisor state and return * If yes, restore hypervisor state and return back to link.
* back to reset vector.
* *
* r13 - Contents of HSPRG0 * r13 - Contents of HSPRG0
* cr3 - set to gt if waking up with partial/complete hypervisor state loss * cr3 - set to gt if waking up with partial/complete hypervisor state loss
*/ */
_GLOBAL(pnv_restore_hyp_resource) pnv_restore_hyp_resource:
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
BEGIN_FTR_SECTION_NESTED(70) BEGIN_FTR_SECTION_NESTED(70)
mflr r6 mflr r6
...@@ -446,12 +472,9 @@ ALT_FTR_SECTION_END_NESTED_IFSET(CPU_FTR_POWER9_DD1, 70) ...@@ -446,12 +472,9 @@ ALT_FTR_SECTION_END_NESTED_IFSET(CPU_FTR_POWER9_DD1, 70)
*/ */
rldicl r5,r5,4,60 rldicl r5,r5,4,60
cmpd cr4,r5,r4 cmpd cr4,r5,r4
bge cr4,pnv_wakeup_tb_loss bge cr4,pnv_wakeup_tb_loss /* returns to caller */
/*
* Waking up without hypervisor state loss. Return to blr /* Waking up without hypervisor state loss. */
* reset vector
*/
blr
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
...@@ -479,8 +502,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) ...@@ -479,8 +502,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
*/ */
bgt cr3,. bgt cr3,.
blr /* Return back to System Reset vector from where blr /* Waking up without hypervisor state loss */
pnv_restore_hyp_resource was invoked */
/* /*
* Called if waking up from idle state which can cause either partial or * Called if waking up from idle state which can cause either partial or
...@@ -492,7 +514,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) ...@@ -492,7 +514,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
* cr3 - gt if waking up with partial/complete hypervisor state loss * cr3 - gt if waking up with partial/complete hypervisor state loss
* cr4 - gt or eq if waking up from complete hypervisor state loss. * cr4 - gt or eq if waking up from complete hypervisor state loss.
*/ */
_GLOBAL(pnv_wakeup_tb_loss) pnv_wakeup_tb_loss:
ld r1,PACAR1(r13) ld r1,PACAR1(r13)
/* /*
* Before entering any idle state, the NVGPRs are saved in the stack * Before entering any idle state, the NVGPRs are saved in the stack
...@@ -683,8 +705,7 @@ hypervisor_state_restored: ...@@ -683,8 +705,7 @@ hypervisor_state_restored:
mtspr SPRN_SRR1,r16 mtspr SPRN_SRR1,r16
mtlr r17 mtlr r17
blr /* Return back to System Reset vector from where blr /* return to pnv_powersave_wakeup */
pnv_restore_hyp_resource was invoked */
fastsleep_workaround_at_exit: fastsleep_workaround_at_exit:
li r3,1 li r3,1
...@@ -696,7 +717,8 @@ fastsleep_workaround_at_exit: ...@@ -696,7 +717,8 @@ fastsleep_workaround_at_exit:
* R3 here contains the value that will be returned to the caller * R3 here contains the value that will be returned to the caller
* of power7_nap. * of power7_nap.
*/ */
_GLOBAL(pnv_wakeup_loss) .global pnv_wakeup_loss
pnv_wakeup_loss:
ld r1,PACAR1(r13) ld r1,PACAR1(r13)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
CHECK_HMI_INTERRUPT CHECK_HMI_INTERRUPT
...@@ -716,7 +738,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) ...@@ -716,7 +738,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
* R3 here contains the value that will be returned to the caller * R3 here contains the value that will be returned to the caller
* of power7_nap. * of power7_nap.
*/ */
_GLOBAL(pnv_wakeup_noloss) pnv_wakeup_noloss:
lbz r0,PACA_NAPSTATELOST(r13) lbz r0,PACA_NAPSTATELOST(r13)
cmpwi r0,0 cmpwi r0,0
bne pnv_wakeup_loss bne pnv_wakeup_loss
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment