[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