[Skiboot] [RFC PATCH 5/7] skiboot: Add opal call for nest IMA configuration

Hemant Kumar hemant at linux.vnet.ibm.com
Tue Oct 25 23:45:46 AEDT 2016


Add a new opal call to control the nest IMA counters.
opal_nest_ima_counters_control() is to start and stop OCC
microcode for nest PMU counter collection based on the "operation"
parameter.

Signed-off-by: Hemant Kumar <hemant at linux.vnet.ibm.com>
---
 hw/ima.c           | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/opal-api.h |  3 ++-
 2 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/hw/ima.c b/hw/ima.c
index 7dd8d8c..cce5473 100644
--- a/hw/ima.c
+++ b/hw/ima.c
@@ -139,3 +139,72 @@ void ima_init(void)
 err:
 	free(buf);
 }
+
+/*
+ * opal_nest_ima_counters_control : This call controls the nest IMA counters.
+ *
+ * mode      : For now, this call supports only NEST_IMA_PRODUCTION_MODE.
+ *             This mode can start/stop the PORE SLW IMA engine for nest
+ *             instrumentation from Host OS.
+ * operation : Start(0x0) or Stop(0x1) the engine.
+ *
+ * This call can be extended to include more operations, if needed and the
+ * other two parameters value_1 and value_2 are for the very same purpose.
+ * Right now, they are unused and should be zero.
+ */
+static int64_t opal_nest_ima_counters_control(uint64_t mode,
+					      uint64_t operation,
+					      uint64_t value_1,
+					      uint64_t value_2)
+{
+	struct proc_chip *chip;
+	u64 op;
+	int ret;
+	uint64_t cb_loc;
+	struct ima_chip_cb *cb;
+
+	if ((mode != NEST_IMA_PRODUCTION_MODE) || value_1 || value_2) {
+		ret = OPAL_PARAMETER;
+		goto nest_ret;
+	}
+
+	chip = get_chip(this_cpu()->chip_id);
+
+	/* Fetch the IMA control block structure */
+	cb_loc = chip->homer_base + CB_STRUCT_OFFSET;
+	cb = (struct ima_chip_cb *)cb_loc;
+
+	switch (operation) {
+	case 0:
+		/* Check whether the engine is already stopped */
+		if (cb->ima_chip_run_status == SLW_IMA_PAUSE) {
+			ret = OPAL_SUCCESS;
+			goto nest_ret;
+		}
+
+		op = NEST_IMA_DISABLE;
+		break;
+	case 1:
+		/* Check whether the engine is already running */
+		if (cb->ima_chip_run_status == SLW_IMA_RESUME) {
+			ret = OPAL_SUCCESS;
+			goto nest_ret;
+		}
+
+		op = NEST_IMA_ENABLE;
+		break;
+	default:
+		prerror("IMA: unknown operation for nest ima\n");
+		ret = OPAL_PARAMETER;
+		goto nest_ret;
+	}
+
+	/* Write the command now to the control block */
+	cb->ima_chip_command = op;
+
+	ret = OPAL_SUCCESS;
+nest_ret:
+	return ret;
+}
+
+opal_call(OPAL_NEST_IMA_COUNTERS_CONTROL, opal_nest_ima_counters_control, 4);
diff --git a/include/opal-api.h b/include/opal-api.h
index 05ff51d..cbb5dcf 100644
--- a/include/opal-api.h
+++ b/include/opal-api.h
@@ -181,7 +181,8 @@
 #define OPAL_INT_SET_MFRR			125
 #define OPAL_PCI_TCE_KILL			126
 #define OPAL_NMMU_SET_PTCR			127
-#define OPAL_LAST				127
+#define OPAL_NEST_IMA_COUNTERS_CONTROL		128
+#define OPAL_LAST				128
 
 /* Device tree flags */
 
-- 
2.7.4



More information about the Skiboot mailing list