diff options
-rw-r--r-- | chassishandler.cpp | 71 | ||||
-rw-r--r-- | chassishandler.h | 1 | ||||
-rw-r--r-- | host-ipmid-whitelist.conf | 1 |
3 files changed, 73 insertions, 0 deletions
diff --git a/chassishandler.cpp b/chassishandler.cpp index 0ee593c..2e892b9 100644 --- a/chassishandler.cpp +++ b/chassishandler.cpp @@ -33,6 +33,7 @@ #include <xyz/openbmc_project/Control/Boot/Source/server.hpp> #include <xyz/openbmc_project/Control/Boot/Mode/server.hpp> #include <xyz/openbmc_project/Control/Power/RestorePolicy/server.hpp> +#include <xyz/openbmc_project/State/PowerOnHours/server.hpp> #include "config.h" @@ -79,6 +80,11 @@ constexpr auto SETTINGS_MATCH = "host0"; constexpr auto IP_INTERFACE = "xyz.openbmc_project.Network.IP"; constexpr auto MAC_INTERFACE = "xyz.openbmc_project.Network.MACAddress"; +static constexpr auto chassisStateRoot = "/xyz/openbmc_project/state"; +static constexpr auto chassisPOHStateIntf = + "xyz.openbmc_project.State.PowerOnHours"; +static constexpr auto pOHCounterProperty = "POHCounter"; +static constexpr auto match = "chassis0"; typedef struct { @@ -98,6 +104,15 @@ typedef struct uint8_t front_panel_button_cap_status; }__attribute__((packed)) ipmi_get_chassis_status_t; +/** + * @struct Get POH counter command response data + */ +struct GetPOHCountResponse +{ + uint8_t minPerCount; ///< Minutes per count + uint8_t counterReading[4]; ///< Counter reading +}__attribute__((packed)); + // Phosphor Host State manager namespace State = sdbusplus::xyz::openbmc_project::State::server; @@ -127,6 +142,13 @@ settings::Objects objects(dbus, } // namespace internal } // namespace chassis +namespace poh +{ + +constexpr auto minutesPerCount = 60; + +} // namespace poh + //TODO : Can remove the below function as we have // new functions which uses sdbusplus. // @@ -581,6 +603,23 @@ int setHostNetworkData(set_sys_boot_options_t* reqptr) return 0; } +uint32_t getPOHCounter() +{ + sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()}; + + auto chassisStateObj = ipmi::getDbusObject(bus, chassisPOHStateIntf, + chassisStateRoot, match); + + auto service = ipmi::getService(bus, chassisPOHStateIntf, + chassisStateObj.first); + + auto propValue = ipmi::getDbusProperty(bus, service, chassisStateObj.first, + chassisPOHStateIntf, + pOHCounterProperty); + + return propValue.get<uint32_t>(); +} + ipmi_ret_t ipmi_chassis_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request, ipmi_response_t response, @@ -1505,6 +1544,35 @@ ipmi_ret_t ipmi_chassis_set_sys_boot_options(ipmi_netfn_t netfn, ipmi_cmd_t cmd, return rc; } +ipmi_ret_t ipmiGetPOHCounter(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; + + auto resptr = reinterpret_cast<GetPOHCountResponse*>(response); + + try + { + auto pohCounter = getPOHCounter(); + resptr->counterReading[0] = pohCounter; + resptr->counterReading[1] = pohCounter >> 8; + resptr->counterReading[2] = pohCounter >> 16; + resptr->counterReading[3] = pohCounter >> 24; + } + catch (std::exception& e) + { + log<level::ERR>(e.what()); + return IPMI_CC_UNSPECIFIED_ERROR; + } + + resptr->minPerCount = poh::minutesPerCount; + *data_len = sizeof(GetPOHCountResponse); + + return rc; +} + void register_netfn_chassis_functions() { // <Wildcard Command> @@ -1534,4 +1602,7 @@ void register_netfn_chassis_functions() // <Set System Boot Options> ipmi_register_callback(NETFUN_CHASSIS, IPMI_CMD_SET_SYS_BOOT_OPTIONS, NULL, ipmi_chassis_set_sys_boot_options, PRIVILEGE_OPERATOR); + // <Get POH Counter> + ipmi_register_callback(NETFUN_CHASSIS, IPMI_CMD_GET_POH_COUNTER, NULL, + ipmiGetPOHCounter, PRIVILEGE_USER); } diff --git a/chassishandler.h b/chassishandler.h index c0e82a1..8643ae4 100644 --- a/chassishandler.h +++ b/chassishandler.h @@ -16,6 +16,7 @@ enum ipmi_netfn_app_cmds // Get capability bits IPMI_CMD_SET_SYS_BOOT_OPTIONS = 0x08, IPMI_CMD_GET_SYS_BOOT_OPTIONS = 0x09, + IPMI_CMD_GET_POH_COUNTER = 0x0F, }; // Command specific completion codes diff --git a/host-ipmid-whitelist.conf b/host-ipmid-whitelist.conf index 0111b9b..a95e99e 100644 --- a/host-ipmid-whitelist.conf +++ b/host-ipmid-whitelist.conf @@ -4,6 +4,7 @@ 0x00:0x02 //<Chassis>:<Chassis Control> 0x00:0x08 //<Chassis>:<Set System Boot Options> 0x00:0x09 //<Chassis>:<Get System Boot Options> +0x00:0x0F //<Chassis>:<Get POH Counter Command> 0x04:0x2D //<Sensor/Event>:<Get Sensor Reading> 0x04:0x2F //<Sensor/Event>:<Get Sensor Type> 0x04:0x30 //<Sensor/Event>:<Set Sensor Reading and Event Status> |