summaryrefslogtreecommitdiffstats
path: root/control
diff options
context:
space:
mode:
Diffstat (limited to 'control')
-rw-r--r--control/actions.hpp3
-rw-r--r--control/zone.cpp33
-rw-r--r--control/zone.hpp13
3 files changed, 43 insertions, 6 deletions
diff --git a/control/actions.hpp b/control/actions.hpp
index 60b5484..d4dedba 100644
--- a/control/actions.hpp
+++ b/control/actions.hpp
@@ -250,7 +250,8 @@ auto set_net_increase_speed(T&& state, uint64_t speedDelta)
}
}
);
- // TODO Do a request speed change for target speed update
+ // Request speed change for target speed update
+ zone.requestSpeedIncrease(netDelta);
};
}
diff --git a/control/zone.cpp b/control/zone.cpp
index d569aa8..5ed0c3a 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -110,11 +110,6 @@ void Zone::setSpeed(uint64_t speed)
{
speed = _floorSpeed;
}
- //TODO openbmc/openbmc#1626 Move to control algorithm function
- if (speed > _ceilingSpeed)
- {
- speed = _ceilingSpeed;
- }
fan->setSpeed(speed);
}
}
@@ -136,6 +131,34 @@ void Zone::setActiveAllow(const Group* group, bool isActiveAllow)
}
}
+void Zone::requestSpeedIncrease(uint64_t targetDelta)
+{
+ // Only increase speed when delta is higher than
+ // the current increase delta for the zone and currently under ceiling
+ if (targetDelta > _incSpeedDelta &&
+ _targetSpeed < _ceilingSpeed)
+ {
+ _targetSpeed = (targetDelta - _incSpeedDelta) + _targetSpeed;
+ _incSpeedDelta = targetDelta;
+ //TODO openbmc/openbmc#1625 Cancel current timer countdown
+ //TODO Floor speed above target, update target to floor speed
+ if (_targetSpeed < _floorSpeed)
+ {
+ _targetSpeed = _floorSpeed;
+ }
+ // Target speed can not go above a defined ceiling speed
+ if (_targetSpeed > _ceilingSpeed)
+ {
+ _targetSpeed = _ceilingSpeed;
+ }
+
+ setSpeed(_targetSpeed);
+ //TODO openbmc/openbmc#1625 Start timer countdown for fan speed increase
+ }
+ //TODO openbmc/openbmc#1625 Clear increase delta when timer expires
+ _incSpeedDelta = 0;
+}
+
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 20b9ac9..cc05959 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -178,6 +178,14 @@ class Zone
return _incSpeedDelta;
};
+ /**
+ * @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 requestSpeedIncrease(uint64_t targetDelta);
+
private:
/**
@@ -226,6 +234,11 @@ class Zone
bool _isActive = true;
/**
+ * Target speed for this zone
+ */
+ uint64_t _targetSpeed = _fullSpeed;
+
+ /**
* Speed increase delta
*/
uint64_t _incSpeedDelta = 0;
OpenPOWER on IntegriCloud