diff options
Diffstat (limited to 'control')
-rw-r--r-- | control/actions.hpp | 52 | ||||
-rw-r--r-- | control/zone.cpp | 35 | ||||
-rw-r--r-- | control/zone.hpp | 23 |
3 files changed, 105 insertions, 5 deletions
diff --git a/control/actions.hpp b/control/actions.hpp index d4dedba..325cbbd 100644 --- a/control/actions.hpp +++ b/control/actions.hpp @@ -255,6 +255,58 @@ auto set_net_increase_speed(T&& state, uint64_t speedDelta) }; } +/** + * @brief An action to set the speed decrease delta and request speed change + * @details Provides the ability to determine what the net decrease delta each + * zone's fan speeds should be updated by from their current target speed, and + * request that speed change occur on the next decrease interval. + * + * @param[in] state - State to compare the group's property value to + * @param[in] speedDelta - Speed delta of the group + * + * @return Lambda function + * A lambda function that determines the net decrease delta and requests + * a new target speed with that decrease for the zone. + */ +template <typename T> +auto set_net_decrease_speed(T&& state, uint64_t speedDelta) +{ + return [speedDelta, + state = std::forward<T>(state)](auto& zone, auto& group) + { + auto netDelta = zone.getDecSpeedDelta(); + std::for_each( + group.begin(), + group.end(), + [&zone, &state, &speedDelta, &netDelta](auto const& entry) + { + T value = zone.template getPropertyValue<T>( + entry.first, + std::get<intfPos>(entry.second), + std::get<propPos>(entry.second)); + // TODO openbmc/phosphor-fan-presence#7 - Support possible + // state types for comparison + if (value < state) + { + if (netDelta == 0) + { + netDelta = (state - value) * speedDelta; + } + else + { + // Decrease is the difference times + // the given speed delta + netDelta = std::min(netDelta, + (state - value) * speedDelta); + } + } + } + ); + // Request speed decrease to occur on decrease interval + zone.requestSpeedDecrease(netDelta); + }; +} + } // namespace action } // namespace control } // namespace fan diff --git a/control/zone.cpp b/control/zone.cpp index 5ed0c3a..1ca0b81 100644 --- a/control/zone.cpp +++ b/control/zone.cpp @@ -97,6 +97,7 @@ Zone::Zone(Mode mode, std::get<actionPos>(event)(*this, std::get<groupPos>(event)); } + //TODO openbmc/openbmc#1625 Start timer for fan speed decreases } } @@ -105,11 +106,6 @@ void Zone::setSpeed(uint64_t speed) { for (auto& fan : _fans) { - //TODO openbmc/openbmc#1626 Move to control algorithm function - if (speed < _floorSpeed) - { - speed = _floorSpeed; - } fan->setSpeed(speed); } } @@ -159,6 +155,35 @@ void Zone::requestSpeedIncrease(uint64_t targetDelta) _incSpeedDelta = 0; } +void Zone::requestSpeedDecrease(uint64_t targetDelta) +{ + // Only decrease the lowest target delta requested + if (_decSpeedDelta == 0 || targetDelta < _decSpeedDelta) + { + _decSpeedDelta = targetDelta; + } + + //TODO openbmc/openbmc#1625 Set decrease target speed when timer expires + // Only decrease speeds when no requested increases exist + if (_incSpeedDelta == 0) + { + // Target speed can not go below the defined floor speed + if ((_targetSpeed < _decSpeedDelta) || + (_targetSpeed - _decSpeedDelta < _floorSpeed)) + { + _targetSpeed = _floorSpeed; + } + else + { + _targetSpeed = _targetSpeed - _decSpeedDelta; + } + setSpeed(_targetSpeed); + } + // Clear decrease delta when timer expires + _decSpeedDelta = 0; + //TODO openbmc/openbmc#1625 Restart decrease timer +} + void Zone::getProperty(sdbusplus::bus::bus& bus, const std::string& path, const std::string& iface, diff --git a/control/zone.hpp b/control/zone.hpp index cc05959..f445472 100644 --- a/control/zone.hpp +++ b/control/zone.hpp @@ -179,6 +179,16 @@ class Zone }; /** + * @brief Get the decrease speed delta + * + * @return - The current decrease speed delta + */ + inline auto& getDecSpeedDelta() const + { + return _decSpeedDelta; + }; + + /** * @brief Calculate the requested target speed from the given delta * and increase the fan speeds, not going above the ceiling. * @@ -186,6 +196,14 @@ class Zone */ void requestSpeedIncrease(uint64_t targetDelta); + /** + * @brief Calculate the requested target speed from the given delta + * and increase the fan speeds, not going above the ceiling. + * + * @param[in] targetDelta - The delta to increase the target speed by + */ + void requestSpeedDecrease(uint64_t targetDelta); + private: /** @@ -244,6 +262,11 @@ class Zone uint64_t _incSpeedDelta = 0; /** + * Speed decrease delta + */ + uint64_t _decSpeedDelta = 0; + + /** * The vector of fans in this zone */ std::vector<std::unique_ptr<Fan>> _fans; |