[Skiboot] [PATCH v2] Tie tm-suspend fw-feature and opal_reinit_cpus() together

Michael Neuling mikey at neuling.org
Mon Mar 5 11:49:24 AEDT 2018


Currently opal_reinit_cpus(OPAL_REINIT_CPUS_TM_SUSPEND_DISABLED)
always returns OPAL_UNSUPPORTED.

This ties the tm suspend fw-feature to the
opal_reinit_cpus(OPAL_REINIT_CPUS_TM_SUSPEND_DISABLED) so that when tm
suspend is disabled, we correctly report it to the kernel.  For
backwards compatibility, it's assumed tm suspend is available if the
fw-feature is not present.

Currently hostboot will clear fw-feature(TM_SUSPEND_ENABLED) on P9N
DD2.1. P9N DD2.2 will set fw-feature(TM_SUSPEND_ENABLED).  DD2.0 and
below has TM disabled completely (not just suspend).

We are using opal_reinit_cpus() to determine this setting (rather than
the device tree/HDAT) as some future firmware may let us change this
dynamically after boot. That is not the case currently though.

Signed-off-by: Michael Neuling <mikey at neuling.org>
Reviewed-by: Cyril Bur <cyril.bur at au1.ibm.com>
---
v2:
  Update commit message based on Cyril's comments
---
 core/cpu.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/core/cpu.c b/core/cpu.c
index 2eab522553..7a9dbe5d70 100644
--- a/core/cpu.c
+++ b/core/cpu.c
@@ -57,6 +57,7 @@ static bool ipi_enabled;
 static bool pm_enabled;
 static bool current_hile_mode;
 static bool current_radix_mode;
+static bool tm_suspend_enabled;
 
 unsigned long cpu_secondary_start __force_data = 0;
 
@@ -1012,6 +1013,21 @@ static int find_dec_bits(void)
 	return bits;
 }
 
+static void init_tm_suspend_mode_property(void)
+{
+	struct dt_node *node;
+
+	/* If we don't find anything, assume TM suspend is enabled */
+	tm_suspend_enabled = true;
+
+	node = dt_find_by_path(dt_root, "/ibm,opal/fw-features/tm-suspend-mode");
+	if (!node)
+		return;
+
+	if (dt_find_property(node, "disabled"))
+		tm_suspend_enabled = false;
+}
+
 void init_all_cpus(void)
 {
 	struct dt_node *cpus, *cpu;
@@ -1021,6 +1037,8 @@ void init_all_cpus(void)
 	cpus = dt_find_by_path(dt_root, "/cpus");
 	assert(cpus);
 
+	init_tm_suspend_mode_property();
+
 	/* Iterate all CPUs in the device-tree */
 	dt_for_each_child(cpus, cpu) {
 		unsigned int pir, server_no, chip_id;
@@ -1436,11 +1454,10 @@ static int64_t opal_reinit_cpus(uint64_t flags)
 	if (flags & OPAL_REINIT_CPUS_TM_SUSPEND_DISABLED) {
 		flags &= ~OPAL_REINIT_CPUS_TM_SUSPEND_DISABLED;
 
-		/*
-		 * Pending a hostboot change we can't determine the status of
-		 * this, so it always fails.
-		 */
-		rc = OPAL_UNSUPPORTED;
+		if (tm_suspend_enabled)
+			rc = OPAL_UNSUPPORTED;
+		else
+			rc = OPAL_SUCCESS;
 	}
 
 	/* Handle P8 DD1 SLW reinit */
-- 
2.14.1



More information about the Skiboot mailing list