summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2018-03-22 14:24:06 -0500
committerMatt Spinler <spinler@us.ibm.com>2018-04-13 14:33:41 +0000
commitd26e27748c2b614950d30ca85891de18c364da0a (patch)
tree77604fa31346e01c62af7ded8bfc7ec65954520f
parent1daaf26afe0fe1add45393ef25937bcecf8f2b82 (diff)
downloadphosphor-hwmon-d26e27748c2b614950d30ca85891de18c364da0a.tar.gz
phosphor-hwmon-d26e27748c2b614950d30ca85891de18c364da0a.zip
Store sensor return codes for dbus removal
Add any return codes defined at the device level and/or the sensor within the hwmon device config file for removal of the sensor. The sensor is removed from dbus when any of those return codes given are received by hwmon when doing a read. ex.) Removal return codes 2 & 11 defined at device level apply for all sensors(gpu0 core & mem) whereas removal return code 5 applies to only the the gpu0 core temp sensor. REMOVERCS = "2,11" LABEL_temp1 = "gpu0_core_temp" WARNHI_temp1 = "75000" WARNLO_temp1 = "0" CRITHI_temp1 = "80000" CRITLO_temp1 = "0" REMOVERCS_temp1 = "5" LABEL_temp2 = "gpu0_mem_temp" WARNHI_temp2 = "75000" WARNLO_temp2 = "0" CRITHI_temp2 = "80000" CRITLO_temp2 = "0" Tested: All device sensors contain removal return code defined on the device Each sensor contains removal return codes defined on them Change-Id: Ib0bf1e38ae40aaaea06e93d96322f9499eeefdb1 Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
-rw-r--r--mainloop.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/mainloop.cpp b/mainloop.cpp
index 50eb514..d33ea44 100644
--- a/mainloop.cpp
+++ b/mainloop.cpp
@@ -18,6 +18,7 @@
#include <memory>
#include <cstdlib>
#include <string>
+#include <unordered_set>
#include <phosphor-logging/elog-errors.hpp>
#include "config.h"
@@ -68,6 +69,7 @@ struct valueAdjust
{
double gain = 1.0;
int offset = 0;
+ std::unordered_set<int> rmRCs;
};
// Store the valueAdjust for sensors
@@ -155,6 +157,32 @@ auto getAttributes(const std::string& type, Attributes& attributes)
return true;
}
+void addRemoveRCs(const SensorSet::key_type& sensor,
+ const std::string& rcList)
+{
+ // Convert to a char* for strtok
+ std::vector<char> rmRCs(rcList.c_str(),
+ rcList.c_str() + rcList.size() + 1);
+ auto rmRC = strtok(&rmRCs[0], ", ");
+ while (rmRC != nullptr)
+ {
+ try
+ {
+ sensorAdjusts[sensor].rmRCs.insert(std::stoi(rmRC));
+ }
+ catch (const std::logic_error& le)
+ {
+ // Unable to convert to int, continue to next token
+ std::string name = sensor.first + "_" + sensor.second;
+ log<level::INFO>("Unable to convert sensor removal return code",
+ entry("SENSOR=%s", name.c_str()),
+ entry("RC=%s", rmRC),
+ entry("EXCEPTION=%s", le.what()));
+ }
+ rmRC = strtok(nullptr, ", ");
+ }
+}
+
int64_t adjustValue(const SensorSet::key_type& sensor, int64_t value)
{
// Because read doesn't have an out pointer to store errors.
@@ -191,6 +219,13 @@ auto addValue(const SensorSet::key_type& sensor,
auto& obj = std::get<Object>(info);
auto& objPath = std::get<std::string>(info);
+ auto senRmRCs = getEnv("REMOVERCS", sensor);
+ if (!senRmRCs.empty())
+ {
+ // Add sensor removal return codes defined per sensor
+ addRemoveRCs(sensor, senRmRCs);
+ }
+
int64_t val = 0;
try
{
@@ -368,6 +403,14 @@ void MainLoop::init()
}
}
+ // Get list of return codes for removing sensors on device
+ std::string deviceRmRCs;
+ auto devRmRCs = getenv("REMOVERCS");
+ if (devRmRCs)
+ {
+ deviceRmRCs.assign(devRmRCs);
+ }
+
// Check sysfs for available sensors.
auto sensors = std::make_unique<SensorSet>(_hwmonRoot + '/' + _instance);
@@ -413,6 +456,12 @@ void MainLoop::init()
continue;
}
+ if (!deviceRmRCs.empty())
+ {
+ // Add sensor removal return codes defined at the device level
+ addRemoveRCs(i.first, deviceRmRCs);
+ }
+
std::string objectPath{_root};
objectPath.append(1, '/');
objectPath.append(getNamespace(attrs));
OpenPOWER on IntegriCloud