[Skiboot] [PATCH v10 09/11] skiboot: Add opal call to enable/disable Nest IMC

Madhavan Srinivasan maddy at linux.vnet.ibm.com
Thu May 4 14:42:12 AEST 2017


From: Anju T Sudhakar <anju at linux.vnet.ibm.com>

Add new opal calls to init, start and stop the Nest IMC microcode
running in the OCC complex. Code to check the status from the
control block structure before starting or stopping the Nest engine.

Signed-off-by: Hemant Kumar <hemant at linux.vnet.ibm.com>
Signed-off-by: Anju T Sudhakar <anju at linux.vnet.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy at linux.vnet.ibm.com>
---
 hw/imc.c           | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/opal-api.h | 11 +++++++-
 2 files changed, 91 insertions(+), 1 deletion(-)

diff --git a/hw/imc.c b/hw/imc.c
index ee2baad1ea1b..67f199c04949 100644
--- a/hw/imc.c
+++ b/hw/imc.c
@@ -280,3 +280,84 @@ err:
 	prerror("IMC Devices not added\n");
 	free(imc_catalog_buf);
 }
+
+/*
+ * opal_imc_counters_init : This call initialize the IMC engine.
+ *
+ * This call is not being used in case of NEST IMC.
+ * Additional arguments will be added to this call in the following patch.
+ */
+static int64_t opal_imc_counters_init(uint32_t type)
+{
+	if (type == OPAL_IMC_COUNTERS_NEST)
+		prerror("IMC: unknown operation for nest imc\n");
+
+	return OPAL_SUCCESS;
+}
+opal_call(OPAL_IMC_COUNTERS_INIT, opal_imc_counters_init, 1);
+
+/* opal_imc_counters_control_start: This call starts the nest imc engine. */
+static int64_t opal_imc_counters_start(uint32_t type)
+{
+	u64 op, status;
+	struct imc_chip_cb *cb;
+	int ret = OPAL_SUCCESS;
+
+	switch (type) {
+	case OPAL_IMC_COUNTERS_NEST:
+		/* Fetch the IMC control block structure */
+		cb = get_imc_cb();
+		status = be64_to_cpu(cb->imc_chip_run_status);
+
+		/* Check whether the engine is already running */
+		if (status == NEST_IMC_RUNNING)
+			return ret;
+
+		/* Set the run command */
+		op = NEST_IMC_ENABLE;
+
+		/* Write the command to the control block now */
+		cb->imc_chip_command = op;
+
+		break;
+	default:
+		prerror("IMC: Unknown Domain \n");
+		return OPAL_PARAMETER;
+	}
+
+	return ret;
+}
+opal_call(OPAL_IMC_COUNTERS_START, opal_imc_counters_start, 1);
+
+/* opal_imc_counters_control_stop: This call stops the nest imc engine. */
+static int64_t opal_imc_counters_stop(uint32_t type)
+{
+	u64 op, status;
+	struct imc_chip_cb *cb;
+	int ret = OPAL_SUCCESS;
+
+	switch (type) {
+	case OPAL_IMC_COUNTERS_NEST:
+		/* Fetch the IMC control block structure */
+		cb = get_imc_cb();
+		status = be64_to_cpu(cb->imc_chip_run_status);
+
+		/* Check whether the engine is already stopped */
+		if (status == NEST_IMC_PAUSE)
+			return ret;
+
+		/* Set the run command */
+		op = NEST_IMC_DISABLE;
+
+		/* Write the command to the control block now */
+		cb->imc_chip_command = op;
+
+		break;
+	default:
+		prerror("IMC: Unknown Domain \n");
+		return OPAL_PARAMETER;
+	}
+
+	return ret;
+}
+opal_call(OPAL_IMC_COUNTERS_STOP, opal_imc_counters_stop, 1);
diff --git a/include/opal-api.h b/include/opal-api.h
index 80033c6fa77f..e22358a1bbab 100644
--- a/include/opal-api.h
+++ b/include/opal-api.h
@@ -204,7 +204,10 @@
 #define OPAL_NPU_INIT_CONTEXT			146
 #define OPAL_NPU_DESTROY_CONTEXT		147
 #define OPAL_NPU_MAP_LPAR			148
-#define OPAL_LAST				148
+#define OPAL_IMC_COUNTERS_INIT			149
+#define OPAL_IMC_COUNTERS_START			150
+#define OPAL_IMC_COUNTERS_STOP			151
+#define OPAL_LAST				151
 
 /* Device tree flags */
 
@@ -1215,6 +1218,12 @@ enum {
 	XIVE_DUMP_EMU_STATE	= 5,
 };
 
+/* Operation argument to IMC Microcode */
+enum {
+	OPAL_IMC_COUNTERS_NEST = 1,
+};
+
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __OPAL_API_H */
-- 
2.7.4



More information about the Skiboot mailing list