[Skiboot] [RFC PATCH v2 7/8] occ: Disable OCC on UV systems

Ryan Grimm grimm at linux.ibm.com
Fri Sep 20 23:58:22 AEST 2019


On Ultravisor enabled system, temporarily disable OCC irq paths for
shared memory updates when OCC is up, so as to boot the system.

We also disable the OPAL-OCC command response interface which is
required for Sensors. This will be enabled at a later point when we
can read the OCC Common area residing in secure memory region.

Disable stop levels if they are enabled in the SPIRA.

Skip pstates_init and occ_sensor_init as well.

Signed-off-by: Shilpasri G Bhat <shilpa.bhat at linux.vnet.ibm.com>
Signed-off-by: Gautham R. Shenoy <ego at linux.vnet.ibm.com>
Signed-off-by: Ryan Grimm <grimm at linux.ibm.com>
---
 hdata/spira.c   |  4 ++++
 hw/occ-sensor.c |  6 ++++++
 hw/occ.c        | 25 ++++++++++++++++++++++++-
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/hdata/spira.c b/hdata/spira.c
index f6003ea0..5c65b139 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -1281,6 +1281,10 @@ static void add_stop_levels(void)
 	if (proc_gen < proc_gen_p9)
 		return;
 
+	if (is_msr_bit_set(MSR_S)) {
+		prlog(PR_INFO, "SPIRA: Skipping stop levels because S BIT set\n");
+	}
+
 	/*
 	 * OPAL only exports a single set of flags to indicate the supported
 	 * STOP modes while the HDAT descibes the support top levels *per chip*
diff --git a/hw/occ-sensor.c b/hw/occ-sensor.c
index d06ca725..a0f47610 100644
--- a/hw/occ-sensor.c
+++ b/hw/occ-sensor.c
@@ -12,6 +12,7 @@
 #include <device.h>
 #include <cpu.h>
 #include <occ.h>
+#include <ultravisor.h>
 
 enum sensor_attr {
 	SENSOR_SAMPLE,
@@ -492,6 +493,11 @@ bool occ_sensors_init(void)
 	int occ_num = 0, i;
 	bool has_gpu = false;
 
+	if (is_uv_present()) {
+		prlog(PR_DEBUG, "UV HACK: Skipping %s because MSR_S set\n", __func__);
+		return false;
+	}
+
 	/* OCC inband sensors is only supported in P9 */
 	if (proc_gen != proc_gen_p9)
 		return false;
diff --git a/hw/occ.c b/hw/occ.c
index db2744ff..35582c89 100644
--- a/hw/occ.c
+++ b/hw/occ.c
@@ -872,6 +872,11 @@ static void occ_throttle_poll(void *data __unused)
 	struct opal_occ_msg occ_msg;
 	int rc;
 
+	if (is_uv_present()) {
+		prlog(PR_DEBUG, "OCC: %s currently unsupported on ultravisor\n", __func__);
+		return;
+	}
+
 	if (!try_lock(&occ_lock))
 		return;
 	if (occ_reset) {
@@ -1185,6 +1190,11 @@ static void handle_occ_rsp(uint32_t chip_id)
 	struct opal_command_buffer *cmd;
 	struct occ_response_buffer *rsp;
 
+	if (is_uv_present()) {
+		prlog(PR_DEBUG, "OCC: %s currently unsupported on ultravisor\n", __func__);
+		return;
+	}
+
 	chip = get_chip_cmd_interface(chip_id);
 	if (!chip)
 		return;
@@ -1719,6 +1729,11 @@ void occ_pstates_init(void)
 	u8 domain_runs_at;
 	static bool occ_pstates_initialized;
 
+	if (is_msr_bit_set(MSR_S)) {
+		prlog(PR_DEBUG, "UV HACK: Skipping %s because UV is present\n", __func__);
+		return;
+	}
+
 	/* OCC is supported in P8 and P9 */
 	if (proc_gen < proc_gen_p8)
 		return;
@@ -1810,9 +1825,17 @@ void occ_pstates_init(void)
 	/* Add opal_poller to poll OCC throttle status of each chip */
 	for_each_chip(chip)
 		chip->throttle = 0;
-	opal_add_poller(occ_throttle_poll, NULL);
 	occ_pstates_initialized = true;
 
+	/*
+	 * On Ultravisor systems, we don't yet support
+	 * OCC Poller and OPAL-OCC command-response interface.
+	 */
+	if (is_uv_present()) {
+		prlog(PR_DEBUG, "OCC: Skipping throttle-poll,CMD-RSP interface on UV\n");
+		return;
+	}
+	opal_add_poller(occ_throttle_poll, NULL);
 	/* Init OPAL-OCC command-response interface */
 	occ_cmd_interface_init();
 
-- 
2.21.0



More information about the Skiboot mailing list