[Skiboot] [PATCH 4/4] ipmi: Message Linux to perform graceful shutdown

Joel Stanley joel at jms.id.au
Thu Feb 5 14:10:05 AEDT 2015


This sends the previously unused OPAL_MSG_SHUTDOWN using opal_queue_msg
to initiate a graceful shutdown.

The message provides a single parameter indicating weather the shutdown
is will result in a power-off, or a reboot.

Signed-off-by: Joel Stanley <joel at jms.id.au>
---
 doc/opal-api/opal-messages.txt | 57 ++++++++++++++++++++++++++++++++++++++++++
 hw/ipmi/ipmi-sel.c             | 22 ++++++++++++++++
 include/opal.h                 |  2 +-
 3 files changed, 80 insertions(+), 1 deletion(-)
 create mode 100644 doc/opal-api/opal-messages.txt

diff --git a/doc/opal-api/opal-messages.txt b/doc/opal-api/opal-messages.txt
new file mode 100644
index 0000000..df10236
--- /dev/null
+++ b/doc/opal-api/opal-messages.txt
@@ -0,0 +1,57 @@
+OAPL_MESSAGE
+============
+
+The host OS can use OPAL_GET_MSG to retrive messages queued by OPAL. The
+messages are defined by enum OpalMessageType.
+
+OPAL_MSG_ASYNC_COMP
+-------------------
+
+params[0] = token
+params[1] = rc
+
+Additional parameters are function-specific.
+
+OPAL_MSG_MEM_ERR
+----------------
+
+OPAL_MSG_EPOW
+-------------
+
+OPAL_MSG_SHUTDOWN
+-----------------
+
+Used by OPAL to inform the host OS it must imitate a graceful shutdown. Uses
+the first parameter to indicate weather the system is going down for shutdown
+or a reboot.
+
+params[0] = 0x01 reboot, 0x00 shutdown
+
+OPAL_MSG_HMI_EVT
+----------------
+
+Sends the OPAL HMI Event to the host OS
+
+TODO: Describe what HMI is
+
+struct OpalHMIEvent {
+        uint8_t         version;        /* 0x00 */
+        uint8_t         severity;       /* 0x01 */
+        uint8_t         type;           /* 0x02 */
+        uint8_t         disposition;    /* 0x03 */
+        uint8_t         reserved_1[4];  /* 0x04 */
+
+        uint64_t        hmer;
+        /* TFMR register. Valid only for TFAC and TFMR_PARITY error type. */
+        uint64_t        tfmr;
+};
+
+
+OPAL_MSG_DPO
+------------
+
+Used for delayed power off, where OPAL can inform a host OS that it intends to
+perform a shutdown in the future.
+
+The host OS can use the separate API OPAL_GET_DPO_STATUS to query OPAL for the
+number of seconds before a forced shutdown will occur.
diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c
index 3d4fbf7..1f4ad11 100644
--- a/hw/ipmi/ipmi-sel.c
+++ b/hw/ipmi/ipmi-sel.c
@@ -21,6 +21,7 @@
 #include <lock.h>
 #include <errorlog.h>
 #include <pel.h>
+#include <opal-msg.h>
 
 /* OEM SEL fields */
 #define SEL_OEM_ID_0		0x55
@@ -34,6 +35,9 @@
 #define CMD_AMI_POWER		0x04
 #define CMD_AMI_PNOR_ACCESS	0x07
 
+#define SOFT_OFF	        0x00
+#define SOFT_REBOOT	        0x01
+
 struct oem_sel {
 	/* SEL header */
 	uint8_t id[2];
@@ -173,6 +177,23 @@ int ipmi_elog_commit(struct errorlog *elog_buf)
 	return 0;
 }
 
+static void sel_power(uint8_t power)
+{
+	switch (power) {
+	case SOFT_OFF:
+		prlog(PR_NOTICE, "IPMI: soft shutdown requested\n");
+		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF);
+		break;
+	case SOFT_REBOOT:
+		prlog(PR_NOTICE, "IPMI: soft reboot rqeuested\n");
+		opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT);
+		break;
+	default:
+		prlog(PR_WARNING, "IPMI: requested bad power state: %02x\n",
+		      power);
+	}
+}
+
 static void dump_sel(struct oem_sel *sel)
 {
 	const int level = PR_DEBUG;
@@ -218,6 +239,7 @@ void ipmi_parse_sel(struct ipmi_msg *msg)
 
 	switch (sel.cmd) {
 	case CMD_AMI_POWER:
+		sel_power(sel.data[0]);
 		break;
 	case CMD_AMI_PNOR_ACCESS:
 		break;
diff --git a/include/opal.h b/include/opal.h
index 6c9b13a..679a0d9 100644
--- a/include/opal.h
+++ b/include/opal.h
@@ -395,7 +395,7 @@ enum OpalMessageType {
 					 */
 	OPAL_MSG_MEM_ERR,
 	OPAL_MSG_EPOW,
-	OPAL_MSG_SHUTDOWN,
+	OPAL_MSG_SHUTDOWN,		/* params[0] = 1 reboot, 0 shutdown */
 	OPAL_MSG_HMI_EVT,
 	OPAL_MSG_DPO,
 	OPAL_MSG_TYPE_MAX,
-- 
2.1.4



More information about the Skiboot mailing list