From 8d15fb490ea7db36ffacfe3dfaa5d8feb2a4ff0c Mon Sep 17 00:00:00 2001 From: Nan Li Date: Tue, 16 Aug 2016 22:29:40 +0800 Subject: Add IPMI Get-Chassis-Capabilities command * Implement response to separately commented fields. * Add to the whitelist. Note: some hardcoded fields need future work. Resolve openbmc/openbmc#438. Change-Id: Ica9a55a14987ddc6b9984c7d3dcb143416ee7e37 Signed-off-by: Nan Li --- chassishandler.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++ chassishandler.h | 1 + host-ipmid-whitelist.conf | 3 ++- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/chassishandler.cpp b/chassishandler.cpp index c6753e8..0b503c7 100644 --- a/chassishandler.cpp +++ b/chassishandler.cpp @@ -55,6 +55,16 @@ const char *settings_object_name = "/org/openbmc/settings/host0"; const char *settings_intf_name = "org.freedesktop.DBus.Properties"; const char *host_intf_name = "org.openbmc.settings.Host"; +typedef struct +{ + uint8_t cap_flags; + uint8_t fru_info_dev_addr; + uint8_t sdr_dev_addr; + uint8_t sel_dev_addr; + uint8_t system_management_dev_addr; + uint8_t bridge_dev_addr; +}__attribute__((packed)) ipmi_chassis_cap_t; + int dbus_get_property(const char *name, char **buf) { sd_bus_error error = SD_BUS_ERROR_NULL; @@ -496,6 +506,52 @@ ipmi_ret_t ipmi_chassis_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd, return rc; } +ipmi_ret_t ipmi_get_chassis_cap(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) +{ + // sd_bus error + ipmi_ret_t rc = IPMI_CC_OK; + + ipmi_chassis_cap_t chassis_cap{}; + + *data_len = sizeof(ipmi_chassis_cap_t); + + // TODO: need future work. Get those flag from MRW. + + // capabilities flags + // [7..4] - reserved + // [3] – 1b = provides power interlock (IPM 1.5) + // [2] – 1b = provides Diagnostic Interrupt (FP NMI) + // [1] – 1b = provides “Front Panel Lockout” (indicates that the chassis has capabilities + // to lock out external power control and reset button or front panel interfaces + // and/or detect tampering with those interfaces). + // [0] -1b = Chassis provides intrusion (physical security) sensor. + // set to default value 0x0. + chassis_cap.cap_flags = 0x0; + + // Since we do not have a separate SDR Device/SEL Device/ FRU repository. + // The 20h was given as those 5 device addresses. + // Chassis FRU info Device Address + chassis_cap.fru_info_dev_addr = 0x20; + + // Chassis SDR Device Address + chassis_cap.sdr_dev_addr = 0x20; + + // Chassis SEL Device Address + chassis_cap.sel_dev_addr = 0x20; + + // Chassis System Management Device Address + chassis_cap.system_management_dev_addr = 0x20; + + // Chassis Bridge Device Address. + chassis_cap.bridge_dev_addr = 0x20; + + memcpy(response, &chassis_cap, *data_len); + + return rc; +} + //------------------------------------------------------------ // Calls into Chassis Control Dbus object to do the power off //------------------------------------------------------------ @@ -804,6 +860,9 @@ void register_netfn_chassis_functions() printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_CHASSIS, IPMI_CMD_WILDCARD); ipmi_register_callback(NETFUN_CHASSIS, IPMI_CMD_WILDCARD, NULL, ipmi_chassis_wildcard); + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_CHASSIS, IPMI_CMD_GET_CHASSIS_CAP); + ipmi_register_callback(NETFUN_CHASSIS, IPMI_CMD_GET_CHASSIS_CAP, NULL, ipmi_get_chassis_cap); + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_CHASSIS, IPMI_CMD_GET_SYS_BOOT_OPTIONS); ipmi_register_callback(NETFUN_CHASSIS, IPMI_CMD_GET_SYS_BOOT_OPTIONS, NULL, ipmi_chassis_get_sys_boot_options); diff --git a/chassishandler.h b/chassishandler.h index e47b4a1..b290f21 100644 --- a/chassishandler.h +++ b/chassishandler.h @@ -7,6 +7,7 @@ // IPMI commands for Chassis net functions. enum ipmi_netfn_app_cmds { + IPMI_CMD_GET_CHASSIS_CAP = 0x00, // Chassis Control IPMI_CMD_CHASSIS_CONTROL = 0x02, // Get capability bits diff --git a/host-ipmid-whitelist.conf b/host-ipmid-whitelist.conf index bd02898..dc7964e 100644 --- a/host-ipmid-whitelist.conf +++ b/host-ipmid-whitelist.conf @@ -1,4 +1,5 @@ -#: +#:: 0x00:0x02 //: 0x00:0x08 //: 0x00:0x09 //: -- cgit v1.2.1