aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Stanley <joel@jms.id.au>2015-02-05 13:40:05 +1030
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-02-09 14:19:44 +1100
commite8ffc3caadf6e5ddbcd0910ae239eb1be0fdb381 (patch)
treeaf051f0c47e70b3eae331618f4b96bde07875349
parent77e4b445025b05d4da12862e34a47519d0a64868 (diff)
downloadskiboot-e8ffc3caadf6e5ddbcd0910ae239eb1be0fdb381.zip
skiboot-e8ffc3caadf6e5ddbcd0910ae239eb1be0fdb381.tar.gz
skiboot-e8ffc3caadf6e5ddbcd0910ae239eb1be0fdb381.tar.bz2
ipmi: Message Linux to perform graceful shutdown
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@jms.id.au> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--doc/opal-api/opal-messages.txt57
-rw-r--r--hw/ipmi/ipmi-sel.c22
-rw-r--r--include/opal.h2
3 files changed, 80 insertions, 1 deletions
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 4c66bd1..2fbb45d 100644
--- a/hw/ipmi/ipmi-sel.c
+++ b/hw/ipmi/ipmi-sel.c
@@ -23,6 +23,7 @@
#include <lock.h>
#include <errorlog.h>
#include <pel.h>
+#include <opal-msg.h>
/* OEM SEL fields */
#define SEL_OEM_ID_0 0x55
@@ -36,6 +37,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];
@@ -175,6 +179,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;
@@ -220,6 +241,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 2da0929..10e2bc6 100644
--- a/include/opal.h
+++ b/include/opal.h
@@ -400,7 +400,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,