From dfc7ec737bc482bf5f6720b9b239533d9e92616c Mon Sep 17 00:00:00 2001 From: Vishwanatha Subbanna Date: Thu, 7 Sep 2017 18:18:01 +0530 Subject: 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 --- Makefile.am | 1 + occ_manager.cpp | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ occ_manager.hpp | 139 ++++++------------------------------------------------ 3 files changed, 158 insertions(+), 124 deletions(-) create mode 100644 occ_manager.cpp 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 +#include +#include +#include +#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( + bus, + path.c_str())); + + statusObjects.emplace_back( + std::make_unique( + 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( + 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("Invalid update on OCCActive"); + elog(); + } + + 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( + 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 #include -#include #include #include -#include -#include -#include #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( - bus, - path.c_str())); - - statusObjects.emplace_back( - std::make_unique( - 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( - 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("Invalid update on OCCActive"); - elog(); - } - - 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( - bus, - event, - path.c_str())); - } - } + void initStatusObjects(); #endif }; -- cgit v1.2.1