diff options
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; }; /** |