Michal Suchanek dc0030
From ec4867355244755fb5c06037ad2fff760701b465 Mon Sep 17 00:00:00 2001
Michal Suchanek dc0030
From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
Michal Suchanek dc0030
Date: Tue, 16 May 2017 14:19:44 +0530
Michal Suchanek dc0030
Subject: [PATCH] powerpc/powernv/idle: Decouple Timebase restore & Per-core
Michal Suchanek dc0030
 SPRs restore
Michal Suchanek dc0030
Michal Suchanek dc0030
References: bsc#1055121
Michal Suchanek dc0030
Patch-mainline: v4.13-rc1
Michal Suchanek dc0030
Git-commit: ec4867355244755fb5c06037ad2fff760701b465
Michal Suchanek dc0030
Michal Suchanek dc0030
On POWER8, in case of
Michal Suchanek dc0030
   -  nap: both timebase and hypervisor state is retained.
Michal Suchanek dc0030
   -  fast-sleep: timebase is lost. But the hypervisor state is retained.
Michal Suchanek dc0030
   -  winkle: timebase and hypervisor state is lost.
Michal Suchanek dc0030
Michal Suchanek dc0030
Hence, the current code for handling exit from a idle state assumes
Michal Suchanek dc0030
that if the timebase value is retained, then so is the hypervisor
Michal Suchanek dc0030
state. Thus, the current code doesn't restore per-core hypervisor
Michal Suchanek dc0030
state in such cases.
Michal Suchanek dc0030
Michal Suchanek dc0030
But that is no longer the case on POWER9 where we do have stop states
Michal Suchanek dc0030
in which timebase value is retained, but the hypervisor state is
Michal Suchanek dc0030
lost. So we have to ensure that the per-core hypervisor state gets
Michal Suchanek dc0030
restored in such cases.
Michal Suchanek dc0030
Michal Suchanek dc0030
Fix this by ensuring that even in the case when timebase is retained,
Michal Suchanek dc0030
we explicitly check if we are waking up from a deep stop that loses
Michal Suchanek dc0030
per-core hypervisor state (indicated by cr4 being eq or gt), and if
Michal Suchanek dc0030
this is the case, we restore the per-core hypervisor state.
Michal Suchanek dc0030
Michal Suchanek dc0030
Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
Michal Suchanek dc0030
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Michal Suchanek dc0030
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek dc0030
---
Michal Suchanek dc0030
 arch/powerpc/kernel/idle_book3s.S | 7 ++++---
Michal Suchanek dc0030
 1 file changed, 4 insertions(+), 3 deletions(-)
Michal Suchanek dc0030
Michal Suchanek dc0030
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S
Michal Suchanek dc0030
index 4898d676dcae..afd029f1039b 100644
Michal Suchanek dc0030
--- a/arch/powerpc/kernel/idle_book3s.S
Michal Suchanek dc0030
+++ b/arch/powerpc/kernel/idle_book3s.S
Michal Suchanek dc0030
@@ -731,13 +731,14 @@ timebase_resync:
Michal Suchanek dc0030
 	 * Use cr3 which indicates that we are waking up with atleast partial
Michal Suchanek dc0030
 	 * hypervisor state loss to determine if TIMEBASE RESYNC is needed.
Michal Suchanek dc0030
 	 */
Michal Suchanek dc0030
-	ble	cr3,clear_lock
Michal Suchanek dc0030
+	ble	cr3,.Ltb_resynced
Michal Suchanek dc0030
 	/* Time base re-sync */
Michal Suchanek dc0030
 	bl	opal_resync_timebase;
Michal Suchanek dc0030
 	/*
Michal Suchanek dc0030
-	 * If waking up from sleep, per core state is not lost, skip to
Michal Suchanek dc0030
-	 * clear_lock.
Michal Suchanek dc0030
+	 * If waking up from sleep (POWER8), per core state
Michal Suchanek dc0030
+	 * is not lost, skip to clear_lock.
Michal Suchanek dc0030
 	 */
Michal Suchanek dc0030
+.Ltb_resynced:
Michal Suchanek dc0030
 	blt	cr4,clear_lock
Michal Suchanek dc0030
 
Michal Suchanek dc0030
 	/*
Michal Suchanek dc0030
-- 
Michal Suchanek dc0030
2.10.2
Michal Suchanek dc0030