diff options
author | Joel Stanley <joel@jms.id.au> | 2015-02-05 13:40:05 +1030 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2015-02-09 14:19:44 +1100 |
commit | e8ffc3caadf6e5ddbcd0910ae239eb1be0fdb381 (patch) | |
tree | af051f0c47e70b3eae331618f4b96bde07875349 | |
parent | 77e4b445025b05d4da12862e34a47519d0a64868 (diff) | |
download | skiboot-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.txt | 57 | ||||
-rw-r--r-- | hw/ipmi/ipmi-sel.c | 22 | ||||
-rw-r--r-- | include/opal.h | 2 |
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, |