diff options
author | Eddie James <eajames@us.ibm.com> | 2017-09-14 13:17:17 -0500 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2017-12-12 04:48:00 +0000 |
commit | 482e31ff8e43e0fefbd697b1985795c4d35eec74 (patch) | |
tree | 9db1fcac3446e4d6221b8609e92f68a57d4bb0a0 | |
parent | 30417a15fa35e26d5127f12e0a85c3fe74eff0d0 (diff) | |
download | openpower-occ-control-482e31ff8e43e0fefbd697b1985795c4d35eec74.tar.gz openpower-occ-control-482e31ff8e43e0fefbd697b1985795c4d35eec74.zip |
Add watches for throttling reported by the OCC
Add Error objects to watch the sysfs entries provided by the OCC hwmon
driver that report various types of throttling. Also needed to add a
boolean input to the Error callback interface.
Resolves openbmc/openbmc#1821
Change-Id: I4425770a92ace0f73024b3dc4c577ce46957a62a
Signed-off-by: Eddie James <eajames@us.ibm.com>
-rw-r--r-- | occ_device.cpp | 16 | ||||
-rw-r--r-- | occ_device.hpp | 58 | ||||
-rw-r--r-- | occ_errors.cpp | 12 | ||||
-rw-r--r-- | occ_errors.hpp | 4 | ||||
-rw-r--r-- | occ_presence.cpp | 2 | ||||
-rw-r--r-- | occ_presence.hpp | 2 | ||||
-rw-r--r-- | occ_status.cpp | 14 | ||||
-rw-r--r-- | occ_status.hpp | 11 |
8 files changed, 95 insertions, 24 deletions
diff --git a/occ_device.cpp b/occ_device.cpp index 8129502..b100d46 100644 --- a/occ_device.cpp +++ b/occ_device.cpp @@ -1,5 +1,6 @@ #include <iostream> #include "occ_device.hpp" +#include "occ_status.hpp" namespace open_power { @@ -25,5 +26,20 @@ bool Device::master() const return (master != 0); } +void Device::throttleProcTempCallback(bool error) +{ + statusObject.throttleProcTemp(error); +} + +void Device::throttleProcPowerCallback(bool error) +{ + statusObject.throttleProcPower(error); +} + +void Device::throttleMemTempCallback(bool error) +{ + statusObject.throttleMemTemp(error); +} + } // namespace occ } // namespace open_power diff --git a/occ_device.hpp b/occ_device.hpp index 7ffb0ef..fd30641 100644 --- a/occ_device.hpp +++ b/occ_device.hpp @@ -13,6 +13,7 @@ namespace occ { class Manager; +class Status; namespace fs = std::experimental::filesystem; /** @class Device @@ -38,18 +39,38 @@ class Device Device(EventPtr& event, const std::string& name, const Manager& manager, - std::function<void()> callBack = nullptr) : + Status& status, + std::function<void(bool)> callBack = nullptr) : #ifdef I2C_OCC config(name), #else config(name + '-' + "dev0"), #endif errorFile(fs::path(config) / "occ_error"), + statusObject(status), error(event, errorFile, callBack), presence(event, fs::path(config) / "occs_present", manager, - callBack) + callBack), + throttleProcTemp( + event, + fs::path(config) / "occ_dvfs_ot", + std::bind(std::mem_fn(&Device::throttleProcTempCallback), + this, + std::placeholders::_1)), + throttleProcPower( + event, + fs::path(config) / "occ_dvfs_power", + std::bind(std::mem_fn(&Device::throttleProcPowerCallback), + this, + std::placeholders::_1)), + throttleMemTemp( + event, + fs::path(config) / "occ_mem_throttle", + std::bind(std::mem_fn(&Device::throttleMemTempCallback), + this, + std::placeholders::_1)) { // Nothing to do here } @@ -89,6 +110,9 @@ class Device presence.addWatch(); } + throttleProcTemp.addWatch(); + throttleProcPower.addWatch(); + throttleMemTemp.addWatch(); error.addWatch(); } @@ -98,6 +122,10 @@ class Device // we can always safely remove watch even if we don't add it presence.removeWatch(); error.removeWatch(); + error.removeWatch(); + throttleMemTemp.removeWatch(); + throttleProcPower.removeWatch(); + throttleProcTemp.removeWatch(); } private: @@ -118,12 +146,20 @@ class Device */ static fs::path unBindPath; + /** Store the associated Status instance */ + Status& statusObject; + /** Abstraction of error monitoring */ Error error; /** Abstraction of OCC presence monitoring */ Presence presence; + /** Error instances for watching for throttling events */ + Error throttleProcTemp; + Error throttleProcPower; + Error throttleMemTemp; + /** @brief file writer to achieve bind and unbind * * @param[in] filename - Name of file to be written @@ -141,6 +177,24 @@ class Device /** @brief Returns if device represents the master OCC */ bool master() const; + + /** @brief callback for the proc temp throttle event + * + * @param[in] error - True if an error is reported, false otherwise + */ + void throttleProcTempCallback(bool error); + + /** @brief callback for the proc power throttle event + * + * @param[in] error - True if an error is reported, false otherwise + */ + void throttleProcPowerCallback(bool error); + + /** @brief callback for the proc temp throttle event + * + * @param[in] error - True if an error is reported, false otherwise + */ + void throttleMemTempCallback(bool error); }; } // namespace occ diff --git a/occ_errors.cpp b/occ_errors.cpp index fc24310..ee41db9 100644 --- a/occ_errors.cpp +++ b/occ_errors.cpp @@ -117,18 +117,10 @@ void Error::analyzeEvent() // A non-zero data indicates an error condition // Let the caller take appropriate action on this auto data = readFile(len); - log<level::INFO>("Error file updated", - entry("ERROR=%s", data.c_str())); - if (data.empty() || - data.front() == NO_ERROR) - { - return; - } - - // This must be an error + bool error = !(data.empty() || data.front() == NO_ERROR); if (callBack) { - callBack(); + callBack(error); } return; } diff --git a/occ_errors.hpp b/occ_errors.hpp index 070e72c..12ae925 100644 --- a/occ_errors.hpp +++ b/occ_errors.hpp @@ -32,7 +32,7 @@ class Error */ Error(EventPtr& event, const fs::path& file, - std::function<void()> callBack = nullptr) : + std::function<void(bool)> callBack = nullptr) : event(event), file(fs::path(DEV_PATH) / file), callBack(callBack) @@ -97,7 +97,7 @@ class Error const fs::path file; /** @brief Optional function to call on error scenario */ - std::function<void()> callBack; + std::function<void(bool)> callBack; /** @brief Reads file data * diff --git a/occ_presence.cpp b/occ_presence.cpp index f91521a..23fece0 100644 --- a/occ_presence.cpp +++ b/occ_presence.cpp @@ -48,7 +48,7 @@ void Presence::analyzeEvent() entry("OCC_OCCS=%d", occsPresent))); if (callBack) { - callBack(); + callBack(true); } } } diff --git a/occ_presence.hpp b/occ_presence.hpp index 321dacb..e0bd3ad 100644 --- a/occ_presence.hpp +++ b/occ_presence.hpp @@ -30,7 +30,7 @@ class Presence : public Error Presence(EventPtr& event, const fs::path& file, const Manager& mgr, - std::function<void()> callBack = nullptr) : + std::function<void(bool)> callBack = nullptr) : Error(event, file, callBack), manager(mgr) { diff --git a/occ_status.cpp b/occ_status.cpp index 36520b5..8867276 100644 --- a/occ_status.cpp +++ b/occ_status.cpp @@ -63,13 +63,17 @@ bool Status::occActive(bool value) } // Callback handler when a device error is reported. -void Status::deviceErrorHandler() +void Status::deviceErrorHandler(bool error) { - // This would deem OCC inactive - this->occActive(false); + // Make sure we have an error + if (error) + { + // This would deem OCC inactive + this->occActive(false); - // Reset the OCC - this->resetOCC(); + // Reset the OCC + this->resetOCC(); + } } // Sends message to host control command handler to reset OCC diff --git a/occ_status.hpp b/occ_status.hpp index 55ee539..60134fb 100644 --- a/occ_status.hpp +++ b/occ_status.hpp @@ -70,7 +70,9 @@ class Status : public Interface name + std::to_string(instance + 1), #endif manager, - std::bind(&Status::deviceErrorHandler, this)), + *this, + std::bind(std::mem_fn(&Status::deviceErrorHandler), this, + std::placeholders::_1)), hostControlSignal( bus, sdbusRule::type::signal() + @@ -151,8 +153,11 @@ class Status : public Interface **/ sdbusplus::bus::match_t hostControlSignal; - /** @brief Callback handler when device errors are detected */ - void deviceErrorHandler(); + /** @brief Callback handler when device errors are detected + * + * @param[in] error - True if an error is reported, false otherwise + */ + void deviceErrorHandler(bool error); /** @brief Callback function on host control signals * |