summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule2
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C25
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C3
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMembufDataBundle.H13
4 files changed, 38 insertions, 5 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule
index 77ac6bae9..003ef4320 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule
+++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule
@@ -1277,7 +1277,7 @@ group gPbCentFir filter singlebit
(PbCentFir, bit(10)) ? forceMpIpl;
/** PBCENTFIR[11]
- * PB_CENT_FIR_SPARE_0
+ * Programming Error
*/
(PbCentFir, bit(11)) ? calloutProcLevel2MedThr1;
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C
index d94582a52..c6a0f1812 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C
@@ -30,6 +30,7 @@
#include <prdfCenMemUtils.H>
#include <prdfExtensibleChip.H>
#include <prdfCenMbaDataBundle.H>
+#include <prdfP8McsDataBundle.H>
#include <prdfPlatServices.H>
#include <prdfCenMembufDataBundle.H>
#include <prdfParserUtils.H>
@@ -373,6 +374,17 @@ int32_t checkMcsChannelFail( ExtensibleChip * i_mcsChip,
io_sc.service_data->SetCauseAttentionType(UNIT_CS);
io_sc.service_data->SetThresholdMaskId(0);
+ // Indicate that cleanup is required.
+ P8McsDataBundle * mcsdb = getMcsDataBundle( i_mcsChip );
+ ExtensibleChip * membChip = mcsdb->getMembChip();
+ if ( NULL == membChip )
+ {
+ PRDF_ERR( PRDF_FUNC"getMembChip() returned NULL" );
+ o_rc = FAIL; break;
+ }
+ CenMembufDataBundle * mbdb = getMembufDataBundle( membChip );
+ mbdb->iv_doChnlFailCleanup = true;
+
} while (0);
if ( SUCCESS != o_rc )
@@ -407,10 +419,13 @@ int32_t chnlCsCleanup( ExtensibleChip *i_mbChip,
(CHECK_STOP == i_sc.service_data->GetAttentionType()) )
break;
+ CenMembufDataBundle * mbdb = getMembufDataBundle( i_mbChip );
+ if ( !mbdb->iv_doChnlFailCleanup )
+ break; // Cleanup has already been done.
+
// Set it as SUE generation point.
i_sc.service_data->SetFlag( ServiceDataCollector::UERE );
- CenMembufDataBundle * mbdb = getMembufDataBundle(i_mbChip);
ExtensibleChip * mcsChip = mbdb->getMcsChip();
if ( NULL == mcsChip )
{
@@ -513,8 +528,14 @@ int32_t chnlCsCleanup( ExtensibleChip *i_mbChip,
}
}
}
- }while(0);
+
+ // Clean up complete an is no longer required.
+ mbdb->iv_doChnlFailCleanup = false;
+
+ } while(0);
+
return o_rc;
+
#undef PRDF_FUNC
}
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
index 98860b224..070a0d40b 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
@@ -267,6 +267,9 @@ int32_t PreAnalysis( ExtensibleChip * i_mbChip, STEP_CODE_DATA_STRUCT & i_sc,
// Set the cause attention type
i_sc.service_data->SetCauseAttentionType(UNIT_CS);
+ // Indicate that cleanup is required.
+ mbdb->iv_doChnlFailCleanup = true;
+
} while (0);
return o_rc;
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembufDataBundle.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembufDataBundle.H
index 163efc7e4..96f6c99c8 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembufDataBundle.H
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembufDataBundle.H
@@ -5,7 +5,9 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -46,7 +48,7 @@ class CenMembufDataBundle : public DataBundle
/** @brief Constructor */
CenMembufDataBundle( ExtensibleChip * i_membChip ) :
iv_membChip(i_membChip), iv_mcsChip(NULL),
- iv_analyzeMba1Starvation(false)
+ iv_analyzeMba1Starvation(false), iv_doChnlFailCleanup(false)
{
for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ )
iv_mbaChips[i] = NULL;
@@ -121,6 +123,13 @@ class CenMembufDataBundle : public DataBundle
// Toggles to solve MBA1 starvation issue
bool iv_analyzeMba1Starvation;
+
+ /** The channel fail cleanup function is called in both the MCS and MEMBUF
+ * PostAnalysis() plugins. It is possible in some cases that both plugins
+ * are called in the same analysis path. In this case the cleanup will be
+ * called twice. To circumvent this we will use this bool to determine if
+ * the cleanup has been done or needs to be done. */
+ bool iv_doChnlFailCleanup;
};
/**
OpenPOWER on IntegriCloud