diff mbox

[2/4] ipmi: Set BMC Global Enables to enable notifications

Message ID 1423105805-3816-3-git-send-email-joel@jms.id.au
State Accepted
Headers show

Commit Message

Joel Stanley Feb. 5, 2015, 3:10 a.m. UTC
For OEM events including graceful power down and BMC PNOR access we want
to receive notification whenever a message is ready to be read from the
BMC. This requires the Event Message Buffer flag to be enabled.

This is the equivalent of doing mc setenables event_msg=on with
ipmitool, except the message must come from the BT interface in order to
have permission to modify the flags.

Signed-off-by: Joel Stanley <joel@jms.id.au>
---
 include/ipmi.h            |  2 ++
 platforms/astbmc/common.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)
diff mbox

Patch

diff --git a/include/ipmi.h b/include/ipmi.h
index 740b82a..b22db1b 100644
--- a/include/ipmi.h
+++ b/include/ipmi.h
@@ -101,6 +101,8 @@ 
 #define IPMI_CHASSIS_CONTROL		IPMI_CODE(IPMI_NETFN_CHASSIS, 0x02)
 #define IPMI_SET_POWER_STATE		IPMI_CODE(IPMI_NETFN_APP, 0x06)
 #define IPMI_GET_POWER_STATE		IPMI_CODE(IPMI_NETFN_APP, 0x07)
+#define IPMI_SET_ENABLES		IPMI_CODE(IPMI_NETFN_APP, 0x2E)
+#define IPMI_GET_ENABLES		IPMI_CODE(IPMI_NETFN_APP, 0x2F)
 #define IPMI_CLEAR_MESSAGE_FLAGS	IPMI_CODE(IPMI_NETFN_APP, 0x30)
 #define IPMI_GET_MESSAGE_FLAGS		IPMI_CODE(IPMI_NETFN_APP, 0x31)
 #define IPMI_GET_MESSAGE		IPMI_CODE(IPMI_NETFN_APP, 0x33)
diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c
index f9c988d..fc4c776 100644
--- a/platforms/astbmc/common.c
+++ b/platforms/astbmc/common.c
@@ -44,6 +44,51 @@  void astbmc_ext_irq(unsigned int chip_id __unused)
 	bt_irq();
 }
 
+static void astbmc_ipmi_error(struct ipmi_msg *msg)
+{
+        prlog(PR_DEBUG, "ASTBMC: error sending msg. cc = %02x\n", msg->cc);
+
+        ipmi_free_msg(msg);
+}
+
+static void astbmc_ipmi_setenables(void)
+{
+        struct ipmi_msg *msg;
+
+        struct {
+                uint8_t oem2_en : 1;
+                uint8_t oem1_en : 1;
+                uint8_t oem0_en : 1;
+                uint8_t reserved : 1;
+                uint8_t sel_en : 1;
+                uint8_t msgbuf_en : 1;
+                uint8_t msgbuf_full_int_en : 1;
+                uint8_t rxmsg_queue_int_en : 1;
+        } data;
+
+        memset(&data, 0, sizeof(data));
+
+        /* The spec says we need to read-modify-write to not clobber
+         * the state of the other flags. These are set on by the bmc */
+        data.rxmsg_queue_int_en = 1;
+        data.sel_en = 1;
+
+        /* These are the ones we want to set on */
+        data.msgbuf_en = 1;
+
+        msg = ipmi_mkmsg_simple(IPMI_SET_ENABLES, &data, sizeof(data));
+        if (!msg) {
+                prlog(PR_ERR, "ASTBMC: failed to set enables\n");
+                return;
+        }
+
+        msg->error = astbmc_ipmi_error;
+
+        ipmi_queue_msg(msg);
+
+}
+
+
 void astbmc_init(void)
 {
 	/* Initialize PNOR/NVRAM */
@@ -59,6 +104,9 @@  void astbmc_init(void)
 	/* As soon as IPMI is up, inform BMC we are in "S0" */
 	ipmi_set_power_state(IPMI_PWR_SYS_S0_WORKING, IPMI_PWR_NOCHANGE);
 
+        /* Enable IPMI OEM message interrupts */
+        astbmc_ipmi_setenables();
+
 	/* Setup UART console for use by Linux via OPAL API */
 	if (!dummy_console_enabled())
 		uart_setup_opal_console();