Set failsafePwm by pid configuration
<motivation>
Current phosphor-pid-control service supports one zone with
one failsafepwm. However, for some platforms there are
different pluggable cards in a zone. Different combinations
may require different failsafe pwm settings. Why not just
use one zone failsafepwm for all the combinations? because if
we take power consumption or acoustic into consideration,
we will find that not all the cases need the same high
failsafepwm. Each case just need high enough failsafepwm
to cool down the system in that condition.
For example
case1: zone0 : gpuA card + motherboard in zone0
=>requires failsafepwm = 80
case2: zone1 : gpuB card + motherboard in zone0
=>requires failsafepwm = 60
In order to solve the problem described above , we propose
the design that. Each pidloop has its own failsafepwm.
The final failsafepwm will be calculated during building
zone process. The detailed design concept is described in
design concept section.
<design concept>
a zone has several pid loops, each one has its own pid
failsafe pwm defined in its configuration.
The calculation flow goes as below:
1.Take failsafepwm of the pidloops and the zone from the configuration
files, if any is missing , set it to zero.
2.Take max value of (zone failsafepwm and pid loops failsafepwm).
3.If the max value from 'step 2' is zero indicates none of failsafepwm
is configured, set it to default setting 100%.
<note>
1.this is intended for dbus configuration method, since one zone
may have different pidloops from different pluggable boards
entity json, but this design also works for static configuration
method, therefore, the zone with different boards will need
different failsafepwm.
2.keep it back compatible with original design , also take zone
failsafepwm into calculation.
Working example as below
Case1
Zone0:
zone0 pidloop failsafepwm = 60
gpuA pidloop failsafepwm = 70
Motherboard failsafepwm = 40
=>final failsafepwm = 70
Case2
Zone0:
zone0 pidloop failsafepwm = 60
gpuB pidloop failsafepwm = 80
Motherboard failsafepwm = 40
=>final failsafepwm = 80
Change-Id: I5aa1c6a7108f4520f41de5d8eba3075d021bbe79
Signed-off-by: ykchiu <Chiu.YK@inventec.com>
diff --git a/pid/zone.cpp b/pid/zone.cpp
index b76fdec..a8c388a 100644
--- a/pid/zone.cpp
+++ b/pid/zone.cpp
@@ -405,6 +405,8 @@
// Start all sensors in fail-safe mode.
_failSafeSensors.insert(t);
}
+ // Initialize Pid FailSafePercent
+ initPidFailSafePercent();
}
void DbusPidZone::dumpCache(void)
@@ -484,4 +486,34 @@
return _pidsControlProcess[name]->enabled();
}
+void DbusPidZone::initPidFailSafePercent(void)
+{
+ // Currently, find the max failsafe percent pwm settings from zone and
+ // controller, and assign it to zone failsafe percent.
+
+ _failSafePercent = _zoneFailSafePercent;
+ std::cerr << "zone: Zone" << _zoneId
+ << " zoneFailSafePercent: " << _zoneFailSafePercent << "\n";
+
+ for (const auto& [name, value] : _pidsFailSafePercent)
+ {
+ _failSafePercent = std::max(_failSafePercent, value);
+ std::cerr << "pid: " << name << " failSafePercent: " << value << "\n";
+ }
+
+ // when the final failsafe percent is zero , it indicate no failsafe
+ // percent is configured , set it to 100% as the default setting.
+ if (_failSafePercent == 0)
+ {
+ _failSafePercent = 100;
+ }
+ std::cerr << "Final zone" << _zoneId
+ << " failSafePercent: " << _failSafePercent << "\n";
+}
+
+void DbusPidZone::addPidFailSafePercent(std::string name, double percent)
+{
+ _pidsFailSafePercent[name] = percent;
+}
+
} // namespace pid_control