Re: [PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss

2016-09-07 Thread Shreyas B. Prabhu
Hi Gautham,

Thanks for fixing this.

On Wed, Sep 7, 2016 at 1:16 AM, Gautham R. Shenoy
 wrote:
> From: "Gautham R. Shenoy" 
>
> pnv_wakeup_tb_loss function currently expects the cr4 to be "eq" if
> the CPU is waking up from a complete hypervisor state loss. Hence, it
> currently restores the SPR contents only if cr4 is "eq".
>
> However, after the commit bcef83a00dc4 ("powerpc/powernv: Add platform
> support for stop instruction"), on ISA_V300 CPUs, the function
> pnv_restore_hyp_resource sets cr4 to contain the result of the
> comparison between state the CPU has woken up and the first deepest
> stop state before calling pnv_wakeup_tb_loss.
>
> Thus if the CPU woke up from a state that is deeper than the first
> deepest stop state, cr4 have "gt" set and hence, pnv_wakeup_tb_loss
> will fail to restore the SPRs on waking up from such a state.
>
> Fix the code in pnv_wakeup_tb_loss to restore the SPR states when cr4 is
> "eq" or "gt".
>
> Fixes: Commit bcef83a00dc4 ("powerpc/powernv: Add platform support for
> stop instruction")
>
> Cc: Vaidyanathan Srinivasan 
> Cc: Michael Neuling 
> Cc: Michael Ellerman 
> Cc: Shreyas B. Prabhu 
> Signed-off-by: Gautham R. Shenoy 
> ---

Reviewed-by: Shreyas B. Prabhu 


Thanks,
Shreyas


Re: [PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss

2016-09-07 Thread Shreyas B. Prabhu
Hi Gautham,

Thanks for fixing this.

On Wed, Sep 7, 2016 at 1:16 AM, Gautham R. Shenoy
 wrote:
> From: "Gautham R. Shenoy" 
>
> pnv_wakeup_tb_loss function currently expects the cr4 to be "eq" if
> the CPU is waking up from a complete hypervisor state loss. Hence, it
> currently restores the SPR contents only if cr4 is "eq".
>
> However, after the commit bcef83a00dc4 ("powerpc/powernv: Add platform
> support for stop instruction"), on ISA_V300 CPUs, the function
> pnv_restore_hyp_resource sets cr4 to contain the result of the
> comparison between state the CPU has woken up and the first deepest
> stop state before calling pnv_wakeup_tb_loss.
>
> Thus if the CPU woke up from a state that is deeper than the first
> deepest stop state, cr4 have "gt" set and hence, pnv_wakeup_tb_loss
> will fail to restore the SPRs on waking up from such a state.
>
> Fix the code in pnv_wakeup_tb_loss to restore the SPR states when cr4 is
> "eq" or "gt".
>
> Fixes: Commit bcef83a00dc4 ("powerpc/powernv: Add platform support for
> stop instruction")
>
> Cc: Vaidyanathan Srinivasan 
> Cc: Michael Neuling 
> Cc: Michael Ellerman 
> Cc: Shreyas B. Prabhu 
> Signed-off-by: Gautham R. Shenoy 
> ---

Reviewed-by: Shreyas B. Prabhu 


Thanks,
Shreyas


[PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss

2016-09-06 Thread Gautham R. Shenoy
From: "Gautham R. Shenoy" 

pnv_wakeup_tb_loss function currently expects the cr4 to be "eq" if
the CPU is waking up from a complete hypervisor state loss. Hence, it
currently restores the SPR contents only if cr4 is "eq".

However, after the commit bcef83a00dc4 ("powerpc/powernv: Add platform
support for stop instruction"), on ISA_V300 CPUs, the function
pnv_restore_hyp_resource sets cr4 to contain the result of the
comparison between state the CPU has woken up and the first deepest
stop state before calling pnv_wakeup_tb_loss.

Thus if the CPU woke up from a state that is deeper than the first
deepest stop state, cr4 have "gt" set and hence, pnv_wakeup_tb_loss
will fail to restore the SPRs on waking up from such a state.

Fix the code in pnv_wakeup_tb_loss to restore the SPR states when cr4 is
"eq" or "gt".

Fixes: Commit bcef83a00dc4 ("powerpc/powernv: Add platform support for
stop instruction")

Cc: Vaidyanathan Srinivasan 
Cc: Michael Neuling 
Cc: Michael Ellerman 
Cc: Shreyas B. Prabhu 
Signed-off-by: Gautham R. Shenoy 
---
 arch/powerpc/kernel/idle_book3s.S | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/kernel/idle_book3s.S 
b/arch/powerpc/kernel/idle_book3s.S
index 2265c63..bd739fe 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -411,7 +411,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
  *
  * r13 - PACA
  * cr3 - gt if waking up with partial/complete hypervisor state loss
- * cr4 - 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)
ld  r1,PACAR1(r13)
@@ -453,7 +453,7 @@ lwarx_loop2:
 * At this stage
 * cr2 - eq if first thread to wakeup in core
 * cr3-  gt if waking up with partial/complete hypervisor state loss
-* cr4 - eq if waking up from complete hypervisor state loss.
+* cr4 - gt or eq if waking up from complete hypervisor state loss.
 */
 
ori r15,r15,PNV_CORE_IDLE_LOCK_BIT
@@ -481,7 +481,7 @@ first_thread_in_subcore:
 * If waking up from sleep, subcore state is not lost. Hence
 * skip subcore state restore
 */
-   bne cr4,subcore_state_restored
+   blt cr4,subcore_state_restored
 
/* Restore per-subcore state */
ld  r4,_SDR1(r1)
@@ -526,7 +526,7 @@ timebase_resync:
 * If waking up from sleep, per core state is not lost, skip to
 * clear_lock.
 */
-   bne cr4,clear_lock
+   blt cr4,clear_lock
 
/*
 * First thread in the core to wake up and its waking up with
@@ -557,7 +557,7 @@ common_exit:
 * If waking up from sleep, hypervisor state is not lost. Hence
 * skip hypervisor state restore.
 */
-   bne cr4,hypervisor_state_restored
+   blt cr4,hypervisor_state_restored
 
/* Waking up from winkle */
 
-- 
1.9.4



[PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss

2016-09-06 Thread Gautham R. Shenoy
From: "Gautham R. Shenoy" 

pnv_wakeup_tb_loss function currently expects the cr4 to be "eq" if
the CPU is waking up from a complete hypervisor state loss. Hence, it
currently restores the SPR contents only if cr4 is "eq".

However, after the commit bcef83a00dc4 ("powerpc/powernv: Add platform
support for stop instruction"), on ISA_V300 CPUs, the function
pnv_restore_hyp_resource sets cr4 to contain the result of the
comparison between state the CPU has woken up and the first deepest
stop state before calling pnv_wakeup_tb_loss.

Thus if the CPU woke up from a state that is deeper than the first
deepest stop state, cr4 have "gt" set and hence, pnv_wakeup_tb_loss
will fail to restore the SPRs on waking up from such a state.

Fix the code in pnv_wakeup_tb_loss to restore the SPR states when cr4 is
"eq" or "gt".

Fixes: Commit bcef83a00dc4 ("powerpc/powernv: Add platform support for
stop instruction")

Cc: Vaidyanathan Srinivasan 
Cc: Michael Neuling 
Cc: Michael Ellerman 
Cc: Shreyas B. Prabhu 
Signed-off-by: Gautham R. Shenoy 
---
 arch/powerpc/kernel/idle_book3s.S | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/kernel/idle_book3s.S 
b/arch/powerpc/kernel/idle_book3s.S
index 2265c63..bd739fe 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -411,7 +411,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
  *
  * r13 - PACA
  * cr3 - gt if waking up with partial/complete hypervisor state loss
- * cr4 - 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)
ld  r1,PACAR1(r13)
@@ -453,7 +453,7 @@ lwarx_loop2:
 * At this stage
 * cr2 - eq if first thread to wakeup in core
 * cr3-  gt if waking up with partial/complete hypervisor state loss
-* cr4 - eq if waking up from complete hypervisor state loss.
+* cr4 - gt or eq if waking up from complete hypervisor state loss.
 */
 
ori r15,r15,PNV_CORE_IDLE_LOCK_BIT
@@ -481,7 +481,7 @@ first_thread_in_subcore:
 * If waking up from sleep, subcore state is not lost. Hence
 * skip subcore state restore
 */
-   bne cr4,subcore_state_restored
+   blt cr4,subcore_state_restored
 
/* Restore per-subcore state */
ld  r4,_SDR1(r1)
@@ -526,7 +526,7 @@ timebase_resync:
 * If waking up from sleep, per core state is not lost, skip to
 * clear_lock.
 */
-   bne cr4,clear_lock
+   blt cr4,clear_lock
 
/*
 * First thread in the core to wake up and its waking up with
@@ -557,7 +557,7 @@ common_exit:
 * If waking up from sleep, hypervisor state is not lost. Hence
 * skip hypervisor state restore.
 */
-   bne cr4,hypervisor_state_restored
+   blt cr4,hypervisor_state_restored
 
/* Waking up from winkle */
 
-- 
1.9.4