psu-ng: PGOOD_DEGLITCH_LIMIT of five
Turns out that the (IBM) power supplies take up to around 3 seconds to
get the PGOOD# bit in STATUS_WORD set to the good (0) state after the
input power is within range. Adjust the de-glitch value to avoid logging
PGOOD errors for the power supplies, as they mostly ride through the
momentary drops in the input power.
Use PGOOD_DEGLITCH_LIMIT instead of DEGLITCH_LIMIT for the pgoodFault.
Tested:
Rainier 2S4U
1. Drop outlet power for 0.5 seconds, verify no 110015F1.
2. Drop outlet power for 1 second, verify no 110015F1.
3. Drop outlet power for 1.5 seconds, verify no 110015F1.
Rainier 2S2U
1. Drop outlet power for 1 second, verify no 110015F1.
2. Drop outlet power for 5 seconds, verify 110015F0 (VIN_UV) IS logged.
3. Drop outlet power for 1.5 seconds, verify no 110015F1.
Everest (powersupply0 unplugged, powersupply3 missing)
1. Drop outlet power for 0.5 seconds, verify no 110015F1.
2. Drop outlet power for 1 second, verify no 110015F1.
3. Drop outlet power for 1.5 seconds, verify no 110015F1.
4. Drop outlet power for 3 seconds, verify 110015F0 IS logged.
5. Drop all outlet power for 5 seconds, verify 110000AC.
Change-Id: I6ba12209e6c84548fec036101ca02d857ed900f6
Signed-off-by: Brandon Wyman <bjwyman@gmail.com>
diff --git a/phosphor-power-supply/power_supply.cpp b/phosphor-power-supply/power_supply.cpp
index 9aa2719..8321a8a 100644
--- a/phosphor-power-supply/power_supply.cpp
+++ b/phosphor-power-supply/power_supply.cpp
@@ -401,7 +401,7 @@
if ((statusWord & phosphor::pmbus::status_word::POWER_GOOD_NEGATED) ||
(statusWord & phosphor::pmbus::status_word::UNIT_IS_OFF))
{
- if (pgoodFault < DEGLITCH_LIMIT)
+ if (pgoodFault < PGOOD_DEGLITCH_LIMIT)
{
if (statusWord != statusWordOld)
{
diff --git a/phosphor-power-supply/power_supply.hpp b/phosphor-power-supply/power_supply.hpp
index 48c0b5d..218e2d5 100644
--- a/phosphor-power-supply/power_supply.hpp
+++ b/phosphor-power-supply/power_supply.hpp
@@ -39,6 +39,7 @@
constexpr auto LOG_LIMIT = 3;
constexpr auto DEGLITCH_LIMIT = 3;
+constexpr auto PGOOD_DEGLITCH_LIMIT = 5;
/**
* @class PowerSupply
@@ -256,7 +257,8 @@
(ioutOCFault >= DEGLITCH_LIMIT) ||
(voutUVFault >= DEGLITCH_LIMIT) ||
(fanFault >= DEGLITCH_LIMIT) || (tempFault >= DEGLITCH_LIMIT) ||
- (pgoodFault >= DEGLITCH_LIMIT) || (mfrFault >= DEGLITCH_LIMIT));
+ (pgoodFault >= PGOOD_DEGLITCH_LIMIT) ||
+ (mfrFault >= DEGLITCH_LIMIT));
}
/**
@@ -345,7 +347,7 @@
*/
bool hasPgoodFault() const
{
- return (pgoodFault >= DEGLITCH_LIMIT);
+ return (pgoodFault >= PGOOD_DEGLITCH_LIMIT);
}
/**
diff --git a/phosphor-power-supply/test/power_supply_tests.cpp b/phosphor-power-supply/test/power_supply_tests.cpp
index 1e47b9c..278326d 100644
--- a/phosphor-power-supply/test/power_supply_tests.cpp
+++ b/phosphor-power-supply/test/power_supply_tests.cpp
@@ -696,7 +696,7 @@
// POWER_GOOD# inactive, and OFF bit on.
expectations.statusWordValue =
((status_word::POWER_GOOD_NEGATED) | (status_word::UNIT_IS_OFF));
- for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ for (auto x = 1; x <= PGOOD_DEGLITCH_LIMIT; x++)
{
// STATUS_INPUT, STATUS_MFR, STATUS_CML, STATUS_VOUT, and
// STATUS_TEMPERATURE: Don't care if bits set or not (defaults).
@@ -706,7 +706,7 @@
.WillOnce(Return("124000"));
psu2.analyze();
EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.isFaulted(), x >= PGOOD_DEGLITCH_LIMIT);
EXPECT_EQ(psu2.hasInputFault(), false);
EXPECT_EQ(psu2.hasMFRFault(), false);
EXPECT_EQ(psu2.hasVINUVFault(), false);
@@ -716,7 +716,7 @@
EXPECT_EQ(psu2.hasIoutOCFault(), false);
EXPECT_EQ(psu2.hasFanFault(), false);
EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasPgoodFault(), x >= PGOOD_DEGLITCH_LIMIT);
}
}
@@ -844,7 +844,7 @@
// STATUS_TEMPERATURE with bits on.
expectations.statusTempValue = 0xFF;
- for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ for (auto x = 1; x <= PGOOD_DEGLITCH_LIMIT; x++)
{
setPMBusExpectations(mockPMBus, expectations);
EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
@@ -859,7 +859,8 @@
// Cannot have VOUT_OV_FAULT and VOUT_UV_FAULT.
// Rely on HasVoutUVFault() to verify this sets and clears.
EXPECT_EQ(psu.hasVoutUVFault(), false);
- // All faults are deglitched up to DEGLITCH_LIMIT
+ // pgoodFault at PGOOD_DEGLITCH_LIMIT, all other faults are deglitched
+ // up to DEGLITCH_LIMIT
EXPECT_EQ(psu.isFaulted(), x >= DEGLITCH_LIMIT);
EXPECT_EQ(psu.hasInputFault(), x >= DEGLITCH_LIMIT);
EXPECT_EQ(psu.hasMFRFault(), x >= DEGLITCH_LIMIT);
@@ -869,7 +870,7 @@
EXPECT_EQ(psu.hasIoutOCFault(), x >= DEGLITCH_LIMIT);
EXPECT_EQ(psu.hasFanFault(), x >= DEGLITCH_LIMIT);
EXPECT_EQ(psu.hasTempFault(), x >= DEGLITCH_LIMIT);
- EXPECT_EQ(psu.hasPgoodFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasPgoodFault(), x >= PGOOD_DEGLITCH_LIMIT);
EXPECT_EQ(psu.hasPSKillFault(), x >= DEGLITCH_LIMIT);
EXPECT_EQ(psu.hasPS12VcsFault(), x >= DEGLITCH_LIMIT);
EXPECT_EQ(psu.hasPSCS12VFault(), x >= DEGLITCH_LIMIT);
@@ -918,7 +919,7 @@
// STATUS_TEMPERATURE with bits on.
expectations.statusTempValue = 0xFF;
- // All faults degltiched now. Check for false before limit above.
+ // All faults deglitched now. Check for false before limit above.
for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
{
setPMBusExpectations(mockPMBus, expectations);
@@ -946,7 +947,8 @@
EXPECT_EQ(psu.hasVoutUVFault(), false);
EXPECT_EQ(psu.hasFanFault(), true);
EXPECT_EQ(psu.hasTempFault(), true);
- EXPECT_EQ(psu.hasPgoodFault(), true);
+ // No PGOOD fault, as less than PGOOD_DEGLITCH_LIMIT
+ EXPECT_EQ(psu.hasPgoodFault(), false);
EXPECT_EQ(psu.hasPSKillFault(), true);
EXPECT_EQ(psu.hasPS12VcsFault(), true);
EXPECT_EQ(psu.hasPSCS12VFault(), true);
@@ -977,7 +979,8 @@
EXPECT_EQ(psu.hasVoutUVFault(), false);
EXPECT_EQ(psu.hasFanFault(), true);
EXPECT_EQ(psu.hasTempFault(), true);
- EXPECT_EQ(psu.hasPgoodFault(), true);
+ // No PGOOD fault, as less than PGOOD_DEGLITCH_LIMIT
+ EXPECT_EQ(psu.hasPgoodFault(), false);
EXPECT_EQ(psu.hasPSKillFault(), true);
EXPECT_EQ(psu.hasPS12VcsFault(), true);
EXPECT_EQ(psu.hasPSCS12VFault(), true);
@@ -1670,21 +1673,35 @@
.Times(1)
.WillOnce(Return("207400"));
psu.analyze();
- // Expect false until reaches DEGLITCH_LIMIT
+ // Expect false until reaches PGOOD_DEGLITCH_LIMIT @ 1
EXPECT_EQ(psu.hasPgoodFault(), false);
setPMBusExpectations(mockPMBus, expectations);
EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
.Times(1)
.WillOnce(Return("207500"));
psu.analyze();
- // Expect false until reaches DEGLITCH_LIMIT
+ // Expect false until reaches PGOOD_DEGLITCH_LIMIT @ 2
EXPECT_EQ(psu.hasPgoodFault(), false);
setPMBusExpectations(mockPMBus, expectations);
EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
.Times(1)
.WillOnce(Return("207600"));
psu.analyze();
- // DEGLITCH_LIMIT reached, expect true.
+ // Expect false until reaches PGOOD_DEGLITCH_LIMIT @ 3
+ EXPECT_EQ(psu.hasPgoodFault(), false);
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("207700"));
+ psu.analyze();
+ // Expect false until reaches PGOOD_DEGLITCH_LIMIT @ 4
+ EXPECT_EQ(psu.hasPgoodFault(), false);
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("207800"));
+ psu.analyze();
+ // Expect true. PGOOD_DEGLITCH_LIMIT @ 5
EXPECT_EQ(psu.hasPgoodFault(), true);
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
@@ -1716,6 +1733,18 @@
.Times(1)
.WillOnce(Return("208300"));
psu.analyze();
+ EXPECT_EQ(psu.hasPgoodFault(), false);
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("208400"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasPgoodFault(), false);
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("208500"));
+ psu.analyze();
EXPECT_EQ(psu.hasPgoodFault(), true);
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
@@ -1723,7 +1752,7 @@
// Call to analyze will trigger read of "in1_input" to check voltage.
EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
.Times(1)
- .WillOnce(Return("208400"));
+ .WillOnce(Return("208000"));
psu.analyze();
EXPECT_EQ(psu.hasPgoodFault(), false);
}