summaryrefslogtreecommitdiffstats
path: root/powercap.cpp
diff options
context:
space:
mode:
authorAndrew Geissler <andrewg@us.ibm.com>2017-07-06 12:56:32 -0500
committerAndrew Geissler <andrewg@us.ibm.com>2017-07-17 16:17:44 -0500
commit52cf26a821d914dc073b8d40a98b26cf2c6abe84 (patch)
treeabedcf77cf6886268cf77495df81b04f705e1f6f /powercap.cpp
parent32016d18e1b4ddeb8390ee2032e51582a9bca58c (diff)
downloadopenpower-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.cpp134
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
OpenPOWER on IntegriCloud