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);
 }