aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Neuling <mikey@neuling.org>2018-03-05 11:49:24 +1100
committerStewart Smith <stewart@linux.vnet.ibm.com>2018-03-04 21:23:05 -0600
commitee7497e443923d548362b8b5b8ef8d05f1164363 (patch)
tree08a64c34093edbfc54470b1a9ad7f47e122cf472
parented756fa3e23b21161fd62085849a80c85194c5f4 (diff)
downloadskiboot-ee7497e443923d548362b8b5b8ef8d05f1164363.zip
skiboot-ee7497e443923d548362b8b5b8ef8d05f1164363.tar.gz
skiboot-ee7497e443923d548362b8b5b8ef8d05f1164363.tar.bz2
Tie tm-suspend fw-feature and opal_reinit_cpus() together
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@neuling.org> Reviewed-by: Cyril Bur <cyril.bur@au1.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com> (cherry picked from commit 730bccbbb6154bd9bf7e98d3fcb121521f325996) Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--core/cpu.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/core/cpu.c b/core/cpu.c
index 2eab522..7a9dbe5 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 */