|
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 |
|