summaryrefslogtreecommitdiffstats
path: root/systemintfcmds.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'systemintfcmds.cpp')
-rw-r--r--systemintfcmds.cpp55
1 files changed, 48 insertions, 7 deletions
diff --git a/systemintfcmds.cpp b/systemintfcmds.cpp
index 4964800..00e6c51 100644
--- a/systemintfcmds.cpp
+++ b/systemintfcmds.cpp
@@ -18,6 +18,17 @@ using namespace sdbusplus::xyz::openbmc_project::Control::server;
using cmdManagerPtr = std::unique_ptr<phosphor::host::command::Manager>;
extern cmdManagerPtr& ipmid_get_host_cmd_manager();
+// global enables
+// bit0 - Message Receive Queue enable
+// bit1 - Enable Event Message Buffer Full Interrupt
+// bit2 - Enable Event Message Buffer
+// bit3 - Enable System Event Logging
+// bit4 - reserved
+// bit5-7 - OEM 0~2 enables
+static constexpr uint8_t selEnable = 0x08;
+static constexpr uint8_t recvMsgQueueEnable = 0x01;
+static constexpr uint8_t globalEnablesDefault = selEnable | recvMsgQueueEnable;
+
//-------------------------------------------------------------------
// Called by Host post response from Get_Message_Flags
//-------------------------------------------------------------------
@@ -74,9 +85,9 @@ ipmi_ret_t ipmi_app_get_msg_flags(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
// bit:[1] from LSB : 1b = Event Message Buffer Full.
// Return as 0 if Event Message Buffer is not supported,
// or when the Event Message buffer is disabled.
- // TODO. For now. assume its not disabled and send "0x2" anyway:
+ // For now, it is not supported.
- uint8_t set_event_msg_buffer_full = 0x2;
+ uint8_t set_event_msg_buffer_full = 0x0;
*data_len = sizeof(set_event_msg_buffer_full);
// Pack the actual response
@@ -85,6 +96,23 @@ ipmi_ret_t ipmi_app_get_msg_flags(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
return rc;
}
+ipmi_ret_t ipmi_app_get_bmc_global_enables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
+ ipmi_request_t request,
+ ipmi_response_t response,
+ ipmi_data_len_t data_len,
+ ipmi_context_t context)
+{
+ ipmi_ret_t rc = IPMI_CC_OK;
+ if (0 != *data_len)
+ {
+ *data_len = 0;
+ return IPMI_CC_REQ_DATA_LEN_INVALID;
+ }
+ *data_len = sizeof(globalEnablesDefault);
+ *reinterpret_cast<uint8_t*>(response) = globalEnablesDefault;
+ return rc;
+}
+
ipmi_ret_t ipmi_app_set_bmc_global_enables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_request_t request,
ipmi_response_t response,
@@ -92,13 +120,22 @@ ipmi_ret_t ipmi_app_set_bmc_global_enables(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_context_t context)
{
ipmi_ret_t rc = IPMI_CC_OK;
- *data_len = 0;
- // Event and message logging enabled by default so return for now
-#ifdef __IPMI_DEBUG__
- std::printf("IPMI APP SET BMC GLOBAL ENABLES Ignoring for now\n");
-#endif
+ uint8_t reqMask = *reinterpret_cast<uint8_t*>(request);
+ if (sizeof(reqMask) != *data_len)
+ {
+ *data_len = 0;
+ return IPMI_CC_REQ_DATA_LEN_INVALID;
+ }
+ *data_len = 0;
+ // Recv Message Queue and SEL are enabled by default.
+ // Event Message buffer are disabled by default (not supported).
+ // Any request that try to change the mask will be rejected
+ if (reqMask != (selEnable | recvMsgQueueEnable))
+ {
+ return IPMI_CC_INVALID_FIELD_REQUEST;
+ }
return rc;
}
@@ -131,6 +168,10 @@ void register_netfn_app_functions()
ipmi_register_callback(NETFUN_APP, IPMI_CMD_SET_BMC_GLOBAL_ENABLES, NULL,
ipmi_app_set_bmc_global_enables, SYSTEM_INTERFACE);
+ // <Get BMC Global Enables>
+ ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_BMC_GLOBAL_ENABLES, NULL,
+ ipmi_app_get_bmc_global_enables, SYSTEM_INTERFACE);
+
// <Get Message Flags>
ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_MSG_FLAGS, NULL,
ipmi_app_get_msg_flags, SYSTEM_INTERFACE);
OpenPOWER on IntegriCloud