summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishwanatha Subbanna <vishwa@linux.vnet.ibm.com>2017-09-07 18:18:01 +0530
committerVishwanatha Subbanna <vishwa@linux.vnet.ibm.com>2017-09-26 16:22:36 +0530
commitdfc7ec737bc482bf5f6720b9b239533d9e92616c (patch)
tree2d5eb482f04d40c7ca830cd0e1ffe03f85d07799
parentb57f151092ae04ca2849851ac406624b87666e8c (diff)
downloadopenpower-occ-control-dfc7ec737bc482bf5f6720b9b239533d9e92616c.zip
openpower-occ-control-dfc7ec737bc482bf5f6720b9b239533d9e92616c.tar.gz
Split occ_manager.hpp into header and source files
occ_manager.hpp is growing and hence this commit splits into header and source files Change-Id: I3203520c50910d39055fea98b770de55796bb074 Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
-rw-r--r--Makefile.am1
-rw-r--r--occ_manager.cpp142
-rw-r--r--occ_manager.hpp139
3 files changed, 158 insertions, 124 deletions
diff --git a/Makefile.am b/Makefile.am
index 0a2d05a..a2b263e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -17,6 +17,7 @@ openpower_occ_control_SOURCES = \
libocc_control_la_SOURCES = \
occ_pass_through.cpp \
+ occ_manager.cpp \
occ_status.cpp \
occ_device.cpp \
occ_errors.cpp \
diff --git a/occ_manager.cpp b/occ_manager.cpp
new file mode 100644
index 0000000..09cefcc
--- /dev/null
+++ b/occ_manager.cpp
@@ -0,0 +1,142 @@
+#include <experimental/filesystem>
+#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+#include "occ_finder.hpp"
+#include "occ_manager.hpp"
+#include "i2c_occ.hpp"
+#include "utils.hpp"
+#include "config.h"
+
+namespace open_power
+{
+namespace occ
+{
+
+void Manager::findAndCreateObjects()
+{
+ // Check if CPU inventory exists already.
+ auto occs = open_power::occ::finder::get(bus);
+ if (occs.empty())
+ {
+ // Need to watch for CPU inventory creation.
+ for (auto id = 0; id < MAX_CPUS; ++id)
+ {
+ auto path = std::string(CPU_PATH) + std::to_string(id);
+ cpuMatches.emplace_back(
+ bus,
+ sdbusRule::interfacesAdded() +
+ sdbusRule::argNpath(0, path),
+ std::bind(std::mem_fn(&Manager::cpuCreated),
+ this, std::placeholders::_1));
+ }
+ }
+ else
+ {
+ for (const auto& occ : occs)
+ {
+ // CPU inventory exists already, OCC objects can be created.
+ createObjects(occ);
+ }
+ }
+}
+
+int Manager::cpuCreated(sdbusplus::message::message& msg)
+{
+ namespace fs = std::experimental::filesystem;
+
+ sdbusplus::message::object_path o;
+ msg.read(o);
+ fs::path cpuPath(std::string(std::move(o)));
+
+ auto name = cpuPath.filename().string();
+ auto index = name.find(CPU_NAME);
+ name.replace(index, std::strlen(CPU_NAME), OCC_NAME);
+
+ createObjects(name);
+
+ return 0;
+}
+
+void Manager::createObjects(const std::string& occ)
+{
+ auto path = fs::path(OCC_CONTROL_ROOT) / occ;
+
+ passThroughObjects.emplace_back(
+ std::make_unique<PassThrough>(
+ bus,
+ path.c_str()));
+
+ statusObjects.emplace_back(
+ std::make_unique<Status>(
+ bus,
+ event,
+ path.c_str(),
+ std::bind(std::mem_fn(&Manager::statusCallBack),
+ this, std::placeholders::_1)));
+
+ // Create the power cap monitor object for master occ (0)
+ if (!pcap)
+ {
+ pcap = std::make_unique<open_power::occ::powercap::PowerCap>(
+ bus,
+ *statusObjects.front());
+ }
+}
+
+void Manager::statusCallBack(bool status)
+{
+ using namespace phosphor::logging;
+ using InternalFailure = sdbusplus::xyz::openbmc_project::Common::
+ Error::InternalFailure;
+
+ // At this time, it won't happen but keeping it
+ // here just in case something changes in the future
+ if ((activeCount == 0) && (!status))
+ {
+ log<level::ERR>("Invalid update on OCCActive");
+ elog<InternalFailure>();
+ }
+
+ activeCount += status ? 1 : -1;
+
+ // If all the OCCs are bound, then start error detection
+ if (activeCount == statusObjects.size())
+ {
+ for (const auto& occ: statusObjects)
+ {
+ occ->addErrorWatch();
+ }
+ }
+ else if (!status)
+ {
+ // If some OCCs are not bound yet, those will be a NO-OP
+ for (const auto& occ: statusObjects)
+ {
+ occ->removeErrorWatch();
+ }
+ }
+}
+
+#ifdef I2C_OCC
+void Manager::initStatusObjects()
+{
+ // Make sure we have a valid path string
+ static_assert(sizeof(DEV_PATH) != 0);
+
+ auto deviceNames = i2c_occ::getOccHwmonDevices(DEV_PATH);
+ for (auto& name : deviceNames)
+ {
+ i2c_occ::i2cToDbus(name);
+ auto path = fs::path(OCC_CONTROL_ROOT) / name;
+ statusObjects.emplace_back(
+ std::make_unique<Status>(
+ bus,
+ event,
+ path.c_str()));
+ }
+}
+#endif
+
+} // namespace occ
+} // namespace open_power
diff --git a/occ_manager.hpp b/occ_manager.hpp
index 0d32241..1aaffc8 100644
--- a/occ_manager.hpp
+++ b/occ_manager.hpp
@@ -2,17 +2,11 @@
#include <cstring>
#include <vector>
-#include <experimental/filesystem>
#include <functional>
#include <sdbusplus/bus.hpp>
-#include <phosphor-logging/log.hpp>
-#include <phosphor-logging/elog.hpp>
-#include <powercap.hpp>
#include "occ_pass_through.hpp"
#include "occ_status.hpp"
-#include "occ_finder.hpp"
-#include "config.h"
-#include "i2c_occ.hpp"
+#include "powercap.hpp"
namespace sdbusRule = sdbusplus::bus::match::rules;
namespace open_power
@@ -48,36 +42,17 @@ struct Manager
// I2C OCC status objects are initialized directly
initStatusObjects();
#else
-
- // Check if CPU inventory exists already.
- auto occs = open_power::occ::finder::get(bus);
- if (occs.empty())
- {
- // Need to watch for CPU inventory creation.
- for (auto id = 0; id < MAX_CPUS; ++id)
- {
- auto path = std::string(CPU_PATH) + std::to_string(id);
- cpuMatches.emplace_back(
- bus,
- sdbusRule::interfacesAdded() +
- sdbusRule::argNpath(0, path),
- std::bind(std::mem_fn(&Manager::cpuCreated),
- this, std::placeholders::_1));
- }
- }
- else
- {
- for (const auto& occ : occs)
- {
- // CPU inventory exists already, OCC objects can be created.
- createObjects(occ);
- }
- }
+ findAndCreateObjects();
#endif
}
-
private:
+ /** @brief Checks if the CPU inventory is present and if so, creates
+ * the occ D-Bus objects. Else, registers a handler to be
+ * called when inventory is created.
+ */
+ void findAndCreateObjects();
+
/** @brief Callback that responds to cpu creation in the inventory -
* by creating the needed objects.
*
@@ -85,52 +60,13 @@ struct Manager
*
* @returns 0 to indicate success
*/
- int cpuCreated(sdbusplus::message::message& msg)
- {
- namespace fs = std::experimental::filesystem;
-
- sdbusplus::message::object_path o;
- msg.read(o);
- fs::path cpuPath(std::string(std::move(o)));
-
- auto name = cpuPath.filename().string();
- auto index = name.find(CPU_NAME);
- name.replace(index, std::strlen(CPU_NAME), OCC_NAME);
-
- createObjects(name);
-
- return 0;
- }
+ int cpuCreated(sdbusplus::message::message& msg);
/** @brief Create child OCC objects.
*
* @param[in] occ - the occ name, such as occ0.
*/
- void createObjects(const std::string& occ)
- {
- auto path = fs::path(OCC_CONTROL_ROOT) / occ;
-
- passThroughObjects.emplace_back(
- std::make_unique<PassThrough>(
- bus,
- path.c_str()));
-
- statusObjects.emplace_back(
- std::make_unique<Status>(
- bus,
- event,
- path.c_str(),
- std::bind(std::mem_fn(&Manager::statusCallBack),
- this, std::placeholders::_1)));
-
- // Create the power cap monitor object for master occ (0)
- if (!pcap)
- {
- pcap = std::make_unique<open_power::occ::powercap::PowerCap>(
- bus,
- *statusObjects.front());
- }
- }
+ void createObjects(const std::string& occ);
/** @brief Callback handler invoked by Status object when the OccActive
* property is changed. This is needed to make sure that the
@@ -141,39 +77,10 @@ struct Manager
*
* @param[in] status - OccActive status
*/
- void statusCallBack(bool status)
- {
- using namespace phosphor::logging;
- using InternalFailure = sdbusplus::xyz::openbmc_project::Common::
- Error::InternalFailure;
-
- // At this time, it won't happen but keeping it
- // here just in case something changes in the future
- if ((activeCount == 0) && (!status))
- {
- log<level::ERR>("Invalid update on OCCActive");
- elog<InternalFailure>();
- }
-
- activeCount += status ? 1 : -1;
-
- // If all the OCCs are bound, then start error detection
- if (activeCount == statusObjects.size())
- {
- for (const auto& occ: statusObjects)
- {
- occ->addErrorWatch();
- }
- }
- else if (!status)
- {
- // If some OCCs are not bound yet, those will be a NO-OP
- for (const auto& occ: statusObjects)
- {
- occ->removeErrorWatch();
- }
- }
- }
+ void statusCallBack(bool status);
+
+ /** @brief Sends a Heartbeat command to host control command handler */
+ void sendHeartBeat();
/** @brief reference to the bus */
sdbusplus::bus::bus& bus;
@@ -202,23 +109,7 @@ struct Manager
* It iterates in /sys/bus/i2c/devices, finds all occ hwmon devices
* and creates status objects.
*/
- void initStatusObjects()
- {
- // Make sure we have a valid path string
- static_assert(sizeof(DEV_PATH) != 0);
-
- auto deviceNames = i2c_occ::getOccHwmonDevices(DEV_PATH);
- for (auto& name : deviceNames)
- {
- i2c_occ::i2cToDbus(name);
- auto path = fs::path(OCC_CONTROL_ROOT) / name;
- statusObjects.emplace_back(
- std::make_unique<Status>(
- bus,
- event,
- path.c_str()));
- }
- }
+ void initStatusObjects();
#endif
};
OpenPOWER on IntegriCloud