diff mbox series

[V4,4/4] hw/dts: retry special wakeup operation if core still gated

Message ID 1511158285-19572-1-git-send-email-shilpa.bhat@linux.vnet.ibm.com
State Accepted
Headers show
Series Fixes for reading DTS sensors of cores in idle state | expand

Commit Message

Shilpasri G Bhat Nov. 20, 2017, 6:11 a.m. UTC
From: Robert Lippert <rlippert@google.com>

It has been observed that in some cases the special wakeup
operation can "succeed" but the core is still in a gated/offline
state.

Check for this state after attempting to wakeup a core and retry
the wakeup if necessary.

Change-Id: Ia6b1b75dcab590c299bed3ee0a42031f09c39eda
Signed-off-by: Robert Lippert <rlippert@google.com>
---
 hw/dts.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/hw/dts.c b/hw/dts.c
index 72a392b..d881f96 100644
--- a/hw/dts.c
+++ b/hw/dts.c
@@ -236,6 +236,34 @@  static int dts_read_core_temp_p9(uint32_t pir, struct dts *dts)
 	return 0;
 }
 
+static int dts_wakeup_core(struct cpu_thread *cpu)
+{
+	int retries = 10;
+	int rc;
+
+	while (retries-- > 0) {
+		rc = dctl_set_special_wakeup(cpu);
+		if (rc) {
+			prerror("Failed to set special wakeup on %d (%d)\n",
+				cpu->pir, rc);
+			return rc;
+		}
+
+		if (!dctl_core_is_gated(cpu))
+			break;
+
+		prlog(PR_NOTICE, "Retrying special wakeup on %d\n", cpu->pir);
+		rc = dctl_clear_special_wakeup(cpu);
+		if (rc) {
+			prerror("Failed to clear special wakeup on %d (%d)\n",
+				cpu->pir, rc);
+			return rc;
+		}
+	}
+
+	return rc;
+}
+
 static void dts_async_read_temp(struct timer *t __unused, void *data,
 				u64 now __unused)
 {
@@ -243,7 +271,7 @@  static void dts_async_read_temp(struct timer *t __unused, void *data,
 	int rc, swkup_rc;
 	struct cpu_thread *cpu = data;
 
-	swkup_rc = dctl_set_special_wakeup(cpu);
+	swkup_rc = dts_wakeup_core(cpu);
 
 	rc = dts_read_core_temp_p9(cpu->pir, &dts);
 	if (!rc) {