summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2017-06-22 11:23:30 -0500
committerMatthew Barth <msbarth@us.ibm.com>2017-07-06 17:11:00 -0500
commit240397b9b80437db77d8d01db2b187d02ef415f7 (patch)
treeff16b6ef8983899c02974c3b12454e133e2118b4
parent246235237c92bd6a55487bdd9fdc6b4b11466a7e (diff)
downloadphosphor-fan-presence-240397b9b80437db77d8d01db2b187d02ef415f7.tar.gz
phosphor-fan-presence-240397b9b80437db77d8d01db2b187d02ef415f7.zip
Process speed increase requests
Speed increases are made providing a target speed delta. The increase is made when the delta is higher than the current increase that may be occurring. When no increase is currently happening, the increase delta requested is accepted. All resulting target increases will not go above a defined ceiling speed. Change-Id: Ia19c71a023cf5b897d5ba92974ff98451f34d5a3 Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
-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