diff options
author | Lei YU <mine260309@gmail.com> | 2018-01-26 17:14:00 +0800 |
---|---|---|
committer | Lei YU <mine260309@gmail.com> | 2018-02-26 10:34:14 +0800 |
commit | 8e5d197b840d4498dcb714b60cc1d38202a7a7a7 (patch) | |
tree | c08a4579fea557beda1f80023298eab22cf7e0ce | |
parent | 0a9fe160d600ece0c5797741042d0e6f975ab101 (diff) | |
download | phosphor-fan-presence-8e5d197b840d4498dcb714b60cc1d38202a7a7a7.tar.gz phosphor-fan-presence-8e5d197b840d4498dcb714b60cc1d38202a7a7a7.zip |
Add factor and offset for fan monitor
For fans controlled via pwm, the fan target and speed are different,
where the fan target is pwm and the speed is rpm.
Usually it is a linear mapping from pwm to rpm.
So this commit defines the optional configs, factor and offset for
calculating the expected fan speed from target, e.g.
- name: fan0
has_target: true
factor: 21
offset: 1600
The fan monitor service will calculate expected fan speed as:
target * factor + offset
The default value is 1 for factor and 0 for offset if they are not
defined.
Tested: Use this config together with the following commit's changes,
test on Romulus and ensures the fan monitor works OK;
Without this config, fan monitor always mark fans as
non-functional due to the fan speed does not match the pwm
value.
Change-Id: If5e25368b4530df7a7face9377efb58804db21df
Signed-off-by: Lei YU <mine260309@gmail.com>
-rw-r--r-- | monitor/example/monitor.yaml | 6 | ||||
-rw-r--r-- | monitor/fan.cpp | 9 | ||||
-rwxr-xr-x | monitor/gen-fan-monitor-defs.py | 7 | ||||
-rw-r--r-- | monitor/tach_sensor.cpp | 4 | ||||
-rw-r--r-- | monitor/tach_sensor.hpp | 30 | ||||
-rw-r--r-- | monitor/types.hpp | 4 |
6 files changed, 58 insertions, 2 deletions
diff --git a/monitor/example/monitor.yaml b/monitor/example/monitor.yaml index 67feaab..1692800 100644 --- a/monitor/example/monitor.yaml +++ b/monitor/example/monitor.yaml @@ -19,6 +19,12 @@ # - name [The name of the fan sensor] # has_target [true|false If this sensor has a Target property for # setting a fan speed (otherwise just for reads)] +# factor [The factor to multiply with target to calculate the expected +# fan speed. Default is 1 for fan speed target; +# Customized value for pwm target] +# offset [The offset to add to calculate the expected fan speed. +# Default is 0 for fan speed target; +# Customized value for pwm target] # #sensor_trust_groups: # - class: [Group class name diff --git a/monitor/fan.cpp b/monitor/fan.cpp index b1aa233..81d27e0 100644 --- a/monitor/fan.cpp +++ b/monitor/fan.cpp @@ -53,6 +53,8 @@ Fan::Fan(Mode mode, *this, std::get<sensorNameField>(s), std::get<hasTargetField>(s), + std::get<factorField>(s), + std::get<offsetField>(s), std::get<timeoutField>(def), events)); @@ -172,10 +174,17 @@ bool Fan::outOfRange(const TachSensor& sensor) { auto actual = static_cast<uint64_t>(sensor.getInput()); auto target = sensor.getTarget(); + 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)) { return true; diff --git a/monitor/gen-fan-monitor-defs.py b/monitor/gen-fan-monitor-defs.py index 1590484..48cf7ec 100755 --- a/monitor/gen-fan-monitor-defs.py +++ b/monitor/gen-fan-monitor-defs.py @@ -36,8 +36,13 @@ const std::vector<FanDefinition> fanDefinitions <% #has_target is a bool, and we need a true instead of True has_target = str(sensor['has_target']).lower() + factor = sensor.get('factor', 1) + offset = sensor.get('offset', 0) %> \ - SensorDefinition{"${sensor['name']}", ${has_target}}, + SensorDefinition{"${sensor['name']}", + ${has_target}, + ${factor}, + ${offset}}, %endfor }, }, diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp index 22875a2..47f4d91 100644 --- a/monitor/tach_sensor.cpp +++ b/monitor/tach_sensor.cpp @@ -69,6 +69,8 @@ TachSensor::TachSensor(Mode mode, Fan& fan, const std::string& id, bool hasTarget, + size_t factor, + size_t offset, size_t timeout, phosphor::fan::event::EventPtr& events) : _bus(bus), @@ -76,6 +78,8 @@ TachSensor::TachSensor(Mode mode, _name(FAN_SENSOR_PATH + id), _invName(path(fan.getName()) / id), _hasTarget(hasTarget), + _factor(factor), + _offset(offset), _timeout(timeout), _timer(events, [this, &fan](){ fan.timerExpired(*this); }) { diff --git a/monitor/tach_sensor.hpp b/monitor/tach_sensor.hpp index dd89bbf..50951cd 100644 --- a/monitor/tach_sensor.hpp +++ b/monitor/tach_sensor.hpp @@ -62,6 +62,8 @@ class TachSensor * @param[in] id - the id of the sensor * @param[in] hasTarget - if the sensor supports * setting the speed + * @param[in] factor - the factor of the sensor target + * @param[in] offset - the offset of the sensor target * @param[in] timeout - Normal timeout value to use * @param[in] events - sd_event pointer */ @@ -70,6 +72,8 @@ class TachSensor Fan& fan, const std::string& id, bool hasTarget, + size_t factor, + size_t offset, size_t timeout, phosphor::fan::event::EventPtr& events); @@ -95,6 +99,22 @@ class TachSensor } /** + * @brief Returns the factor of the sensor target + */ + inline size_t getFactor() const + { + return _factor; + } + + /** + * @brief Returns the offset of the sensor target + */ + inline size_t getOffset() const + { + return _offset; + } + + /** * Returns true if the hardware behind this * sensor is considered working OK/functional. */ @@ -217,6 +237,16 @@ class TachSensor const bool _hasTarget; /** + * @brief The factor of target to get fan rpm + */ + const size_t _factor; + + /** + * @brief The offset of target to get fan rpm + */ + const size_t _offset; + + /** * @brief The input speed, from the Value dbus property */ int64_t _tachInput = 0; diff --git a/monitor/types.hpp b/monitor/types.hpp index 795db00..5993c53 100644 --- a/monitor/types.hpp +++ b/monitor/types.hpp @@ -18,8 +18,10 @@ using CreateGroupFunction = constexpr auto sensorNameField = 0; constexpr auto hasTargetField = 1; +constexpr auto factorField = 2; +constexpr auto offsetField = 3; -using SensorDefinition = std::tuple<std::string, bool>; +using SensorDefinition = std::tuple<std::string, bool, size_t, size_t>; constexpr auto fanNameField = 0; constexpr auto timeoutField = 1; |