diff options
author | Andrew Geissler <andrewg@us.ibm.com> | 2017-07-06 12:56:32 -0500 |
---|---|---|
committer | Andrew Geissler <andrewg@us.ibm.com> | 2017-07-17 16:17:44 -0500 |
commit | 52cf26a821d914dc073b8d40a98b26cf2c6abe84 (patch) | |
tree | abedcf77cf6886268cf77495df81b04f705e1f6f /powercap.cpp | |
parent | 32016d18e1b4ddeb8390ee2032e51582a9bca58c (diff) | |
download | openpower-occ-control-52cf26a821d914dc073b8d40a98b26cf2c6abe84.tar.gz openpower-occ-control-52cf26a821d914dc073b8d40a98b26cf2c6abe84.zip |
Create pcap object and log monitored events
Change-Id: I2d7b3a449e2c9c1d5a0627161f8e85dcaca1e087
Signed-off-by: Andrew Geissler <andrewg@us.ibm.com>
Diffstat (limited to 'powercap.cpp')
-rw-r--r-- | powercap.cpp | 134 |
1 files changed, 132 insertions, 2 deletions
diff --git a/powercap.cpp b/powercap.cpp index 2d5362d..2ecad0c 100644 --- a/powercap.cpp +++ b/powercap.cpp @@ -8,18 +8,148 @@ namespace occ namespace powercap { +constexpr auto PCAP_PATH = "/xyz/openbmc_project/control/host0/power_cap"; +constexpr auto PCAP_INTERFACE = "xyz.openbmc_project.Control.Power.Cap"; + +constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper"; +constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper"; +constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper"; + +constexpr auto POWER_CAP_PROP = "PowerCap"; +constexpr auto POWER_CAP_ENABLE_PROP = "PowerCapEnable"; + using namespace phosphor::logging; +std::string PowerCap::getService(std::string path, + std::string interface) +{ + auto mapper = bus.new_method_call(MAPPER_BUSNAME, + MAPPER_PATH, + MAPPER_INTERFACE, + "GetObject"); + + mapper.append(path, std::vector<std::string>({interface})); + auto mapperResponseMsg = bus.call(mapper); + + if (mapperResponseMsg.is_method_error()) + { + log<level::ERR>("Error in mapper call", + entry("PATH=%s", path.c_str()), + entry("INTERFACE=%s", interface.c_str())); + // TODO openbmc/openbmc#851 - Once available, throw returned error + throw std::runtime_error("Error in mapper call"); + } + + std::map<std::string, std::vector<std::string>> mapperResponse; + mapperResponseMsg.read(mapperResponse); + if (mapperResponse.empty()) + { + log<level::ERR>("Error reading mapper response", + entry("PATH=%s", path.c_str()), + entry("INTERFACE=%s", interface.c_str())); + // TODO openbmc/openbmc#1712 - Handle empty mapper resp. consistently + throw std::runtime_error("Error reading mapper response"); + } + + return mapperResponse.begin()->first; +} + +uint32_t PowerCap::getPcap() +{ + auto settingService = getService(PCAP_PATH,PCAP_INTERFACE); + + auto method = this->bus.new_method_call(settingService.c_str(), + PCAP_PATH, + "org.freedesktop.DBus.Properties", + "Get"); + + method.append(PCAP_INTERFACE, POWER_CAP_PROP); + auto reply = this->bus.call(method); + + if (reply.is_method_error()) + { + log<level::ERR>("Error in getPcap prop"); + return 0; + } + sdbusplus::message::variant<uint32_t> pcap; + reply.read(pcap); + + return pcap.get<uint32_t>(); +} + +bool PowerCap::getPcapEnabled() +{ + auto settingService = getService(PCAP_PATH,PCAP_INTERFACE); + + auto method = this->bus.new_method_call(settingService.c_str(), + PCAP_PATH, + "org.freedesktop.DBus.Properties", + "Get"); + + method.append(PCAP_INTERFACE, POWER_CAP_ENABLE_PROP); + auto reply = this->bus.call(method); + + if (reply.is_method_error()) + { + log<level::ERR>("Error in getPcapEnabled prop"); + return 0; + } + sdbusplus::message::variant<bool> pcapEnabled; + reply.read(pcapEnabled); + + return pcapEnabled.get<bool>(); +} void PowerCap::pcapChanged(sdbusplus::message::message& msg) { - log<level::DEBUG>("Power Cap Change Detected"); if (!occStatus.occActive()) { // Nothing to do return; } - // TODO - Process this change + + uint32_t pcap = 0; + bool pcapEnabled = false; + + std::string msgSensor; + std::map<std::string, sdbusplus::message::variant<uint32_t, bool>> msgData; + msg.read(msgSensor, msgData); + + // Retrieve which property changed via the msg and read the other one + auto valPropMap = msgData.find(POWER_CAP_PROP); + if (valPropMap != msgData.end()) + { + pcap = sdbusplus::message::variant_ns::get<uint32_t>( + valPropMap->second); + pcapEnabled = getPcapEnabled(); + } + else + { + valPropMap = msgData.find(POWER_CAP_ENABLE_PROP); + if (valPropMap != msgData.end()) + { + pcapEnabled = sdbusplus::message::variant_ns::get<bool>( + valPropMap->second); + pcap = getPcap(); + } + else + { + log<level::INFO>("Unknown power cap property changed"); + return; + } + } + + log<level::INFO>("Power Cap Property Change", + entry("PCAP=%u",pcap), + entry("PCAP_ENABLED=%u",pcapEnabled)); + + // Determine desired action to write to occ + // TODO + + // Write action to occ + // TODO + + return; } } // namespace open_power |