From 1f31c03d0a05dc18467f995e7220232a4a51e938 Mon Sep 17 00:00:00 2001 From: Raptor Engineering Development Team Date: Sun, 21 Jan 2018 19:50:17 -0600 Subject: Allow override of deviation with absolute minimum RPM If the devation is less than zero, treat as an absolute minimum RPM value --- monitor/fan.cpp | 32 +++++++++++++++++++++----------- monitor/fan.hpp | 5 +++++ monitor/gen-fan-monitor-defs.py | 2 +- monitor/types.hpp | 2 +- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/monitor/fan.cpp b/monitor/fan.cpp index 39b32bb..e608d76 100644 --- a/monitor/fan.cpp +++ b/monitor/fan.cpp @@ -36,7 +36,8 @@ Fan::Fan(Mode mode, const FanDefinition& def) : _bus(bus), _name(std::get(def)), - _deviation(std::get(def)), + _deviation((std::get(def) < 0)?abs(std::get(def)):std::get(def)), + _deviationIsMinRPM((std::get(def) < 0)?true:false), _numSensorFailsForNonFunc(std::get(def)), _trustManager(trust) { @@ -168,17 +169,26 @@ bool Fan::outOfRange(const TachSensor& sensor) auto factor = sensor.getFactor(); auto offset = sensor.getOffset(); - uint64_t min = target * (100 - _deviation) / 100; - uint64_t max = target * (100 + _deviation) / 100; - - // TODO: openbmc/openbmc#2937 enhance this function - // either by making it virtual, or by predefining different - // outOfRange ops and selecting by yaml config - min = min * factor + offset; - max = max * factor + offset; - if ((actual < min) || (actual > max)) + if (_deviationIsMinRPM) { - return true; + if (actual < _deviation) + { + return true; + } + } + else { + uint64_t min = target * (100 - _deviation) / 100; + uint64_t max = target * (100 + _deviation) / 100; + + // TODO: openbmc/openbmc#2937 enhance this function + // either by making it virtual, or by predefining different + // outOfRange ops and selecting by yaml config + min = min * factor + offset; + max = max * factor + offset; + if ((actual < min) || (actual > max)) + { + return true; + } } return false; diff --git a/monitor/fan.hpp b/monitor/fan.hpp index fb87b66..48c6df0 100644 --- a/monitor/fan.hpp +++ b/monitor/fan.hpp @@ -175,6 +175,11 @@ class Fan */ const size_t _deviation; + /** + * @brief True if deviation indicates minimum absolute RPM + */ + bool _deviationIsMinRPM; + /** * The number of sensors that must be nonfunctional at the * same time in order for the fan to be set to nonfunctional diff --git a/monitor/gen-fan-monitor-defs.py b/monitor/gen-fan-monitor-defs.py index 83dcbc0..6c1f1b0 100755 --- a/monitor/gen-fan-monitor-defs.py +++ b/monitor/gen-fan-monitor-defs.py @@ -103,7 +103,7 @@ if __name__ == '__main__': #Do some minor input validation for fan in monitor_data.get('fans', {}): - if ((fan['deviation'] < 0) or (fan['deviation'] > 100)): + if (fan['deviation'] > 100): sys.exit("Invalid deviation value " + str(fan['deviation'])) output_file = os.path.join(args.output_dir, "fan_monitor_defs.cpp") diff --git a/monitor/types.hpp b/monitor/types.hpp index 3d8306d..dbac9a0 100644 --- a/monitor/types.hpp +++ b/monitor/types.hpp @@ -37,7 +37,7 @@ constexpr auto sensorListField = 5; using FanDefinition = std::tuple>; -- cgit v1.2.1