summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--occ_device.cpp16
-rw-r--r--occ_device.hpp58
-rw-r--r--occ_errors.cpp12
-rw-r--r--occ_errors.hpp4
-rw-r--r--occ_presence.cpp2
-rw-r--r--occ_presence.hpp2
-rw-r--r--occ_status.cpp14
-rw-r--r--occ_status.hpp11
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
*
OpenPOWER on IntegriCloud