diff options
-rw-r--r-- | Redfish.md | 2 | ||||
-rw-r--r-- | redfish-core/lib/power_supply.hpp | 85 |
2 files changed, 87 insertions, 0 deletions
diff --git a/Redfish.md b/Redfish.md index ca33c81cb8..347048dd5f 100644 --- a/Redfish.md +++ b/Redfish.md @@ -379,6 +379,8 @@ Fields common to all schemas ##### PowerSupply +- EfficiencyRatings + - EfficiencyPercent - FirmwareVersion - Location - Manufacturer diff --git a/redfish-core/lib/power_supply.hpp b/redfish-core/lib/power_supply.hpp index 4a766d358a..09f731b54e 100644 --- a/redfish-core/lib/power_supply.hpp +++ b/redfish-core/lib/power_supply.hpp @@ -365,6 +365,89 @@ inline void }); } +inline void handleGetEfficiencyResponse( + const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const boost::system::error_code& ec, uint32_t value) +{ + if (ec) + { + if (ec.value() != EBADR) + { + BMCWEB_LOG_ERROR << "DBUS response error for DeratingFactor " + << ec.value(); + messages::internalError(asyncResp->res); + } + return; + } + // The PDI default value is 0, if it hasn't been set leave off + if (value == 0) + { + return; + } + + nlohmann::json::array_t efficiencyRatings; + nlohmann::json::object_t efficiencyPercent; + efficiencyPercent["EfficiencyPercent"] = value; + efficiencyRatings.emplace_back(std::move(efficiencyPercent)); + asyncResp->res.jsonValue["EfficiencyRatings"] = + std::move(efficiencyRatings); +} + +inline void handlePowerSupplyAttributesSubTreeResponse( + const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const boost::system::error_code& ec, + const dbus::utility::MapperGetSubTreeResponse& subtree) +{ + if (ec) + { + if (ec.value() != EBADR) + { + BMCWEB_LOG_ERROR << "DBUS response error for EfficiencyPercent " + << ec.value(); + messages::internalError(asyncResp->res); + } + return; + } + + if (subtree.empty()) + { + BMCWEB_LOG_DEBUG << "Can't find Power Supply Attributes!"; + return; + } + + if (subtree.size() != 1) + { + BMCWEB_LOG_ERROR + << "Unexpected number of paths returned by getSubTree: " + << subtree.size(); + messages::internalError(asyncResp->res); + return; + } + + const auto& [path, serviceMap] = *subtree.begin(); + const auto& [service, interfaces] = *serviceMap.begin(); + sdbusplus::asio::getProperty<uint32_t>( + *crow::connections::systemBus, service, path, + "xyz.openbmc_project.Control.PowerSupplyAttributes", "DeratingFactor", + [asyncResp](const boost::system::error_code& ec1, uint32_t value) { + handleGetEfficiencyResponse(asyncResp, ec1, value); + }); +} + +inline void + getEfficiencyPercent(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) +{ + constexpr std::array<std::string_view, 1> efficiencyIntf = { + "xyz.openbmc_project.Control.PowerSupplyAttributes"}; + + dbus::utility::getSubTree( + "/xyz/openbmc_project", 0, efficiencyIntf, + [asyncResp](const boost::system::error_code& ec, + const dbus::utility::MapperGetSubTreeResponse& subtree) { + handlePowerSupplyAttributesSubTreeResponse(asyncResp, ec, subtree); + }); +} + inline void doPowerSupplyGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const std::string& chassisId, @@ -417,6 +500,8 @@ inline void getPowerSupplyLocation(asyncResp, object.begin()->first, powerSupplyPath); }); + + getEfficiencyPercent(asyncResp); }); } |