diff options
Diffstat (limited to 'src/usr/diag/prdf/common/plat')
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/Mba.rule | 23 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule | 8 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C | 77 |
3 files changed, 98 insertions, 10 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule index 84b292818..3666142aa 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule @@ -418,37 +418,39 @@ rule tmpMbaDdrPhyFir group gMBA attntype CHECK_STOP, RECOVERABLE, UNIT_CS filter singlebit { - (tmpMbaFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| + # MbaCalFir analyzed first to check for RCD parity error before potential + # side effects in MbaFir + (tmpMbaCalFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|11|12|13|14|15|16|17|18|19| 20|21|22|23|24|25|26|27|28|29| 30|31|32|33|34|35|36|37|38|39| 40|41|42|43|44|45|46|47|48|49| 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaFir); + 60|61|62|63 )) ? analyze(gMbaCalFir); - (tmpMbaSecureFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| + (tmpMbaFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|11|12|13|14|15|16|17|18|19| 20|21|22|23|24|25|26|27|28|29| 30|31|32|33|34|35|36|37|38|39| 40|41|42|43|44|45|46|47|48|49| 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaSecureFir); + 60|61|62|63 )) ? analyze(gMbaFir); - (tmpMbaDdrPhyFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| + (tmpMbaSecureFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|11|12|13|14|15|16|17|18|19| 20|21|22|23|24|25|26|27|28|29| 30|31|32|33|34|35|36|37|38|39| 40|41|42|43|44|45|46|47|48|49| 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaDdrPhyFir); + 60|61|62|63 )) ? analyze(gMbaSecureFir); - (tmpMbaCalFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| + (tmpMbaDdrPhyFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|11|12|13|14|15|16|17|18|19| 20|21|22|23|24|25|26|27|28|29| 30|31|32|33|34|35|36|37|38|39| 40|41|42|43|44|45|46|47|48|49| 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaCalFir); + 60|61|62|63 )) ? analyze(gMbaDdrPhyFir); }; ################################################################################ @@ -663,7 +665,10 @@ rule MbaCalFir RECOVERABLE: MBACALFIR & ~MBACALFIR_MASK & ~MBACALFIR_ACT0 & MBACALFIR_ACT1; }; -group gMbaCalFir filter singlebit, secondarybits( 10, 14, 19, 20, 21, 24, 25 ) +# bits 4 and 7 given priority to check for RCD parity error before potential +# side effects in bits 2 and 17 +group gMbaCalFir filter priority( 4, 7 ), + secondarybits( 10, 14, 19, 20, 21, 24, 25 ) { /** MBACALFIR[0] * MBACALFIRQ_MBA_RECOVERABLE_ERROR diff --git a/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule b/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule index 2ce8efa93..3e42220e3 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule @@ -594,7 +594,7 @@ group gMbsFir filter singlebit, secondarybits( 3, 9, 12, 26, 29, 33, 34 ) /** MBSFIR[4] * MBS_FIR_REG_INTERNAL_TIMEOUT */ - (MbsFir, bit(4)) ? SelfMedThr1; + (MbsFir, bit(4)) ? internalTimeout; /** MBSFIR[3,4] * MBS_FIR_REG_EXTERNAL_TIMEOUT @@ -1270,6 +1270,12 @@ actionclass replayTimeOutError try( funccall("handleMcsChnlCs"), clearSecMbsBitsCalloutDmiBusTh1UE ); }; +/** Handles MBACAL parity err if present, else handles MBS Internal Timeout */ +actionclass internalTimeout +{ + try( funccall("handleMbaCalParityErr"), SelfMedThr1); +}; + /** Clear MBS SecondaryBits and calloutDmiBusTh1UE */ actionclass clearSecMbsBitsCalloutDmiBusTh1UE { diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C index 5a51c225d..3e1ede9ac 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C @@ -1172,6 +1172,83 @@ int32_t handleMcsChnlCs( ExtensibleChip * i_membChip, //------------------------------------------------------------------------------ /** + * @brief Handles MBACALFIR RCD Parity error bits, if they exist. + * + * @param i_membChip The Centaur chip. + * @param i_sc ServiceDataCollector. + * + * @return SUCCESS if MBACALFIR Parity error is present and properly + * handled, FAIL otherwise. + */ +int32_t handleMbaCalParityErr( ExtensibleChip * i_membChip, + STEP_CODE_DATA_STRUCT & i_sc ) +{ + #define PRDF_FUNC "[handleMbaCalParityErr] " + + // We will return FAIL from this function if MBACALFIR parity error bits are + // not set. If MBACALFIR parity error bits are set, we will try to analyze + // the MBACALFIR. If MBACALFIR is not analyzed properly, we will return + // FAIL. This will trigger rule code to execute alternate resolution. + + int32_t l_rc; + + CenMembufDataBundle * mbdb = getMembufDataBundle( i_membChip ); + + // We will loop through to check all MBA if necessary until one is found + // with parity error bits set + for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++) + { + l_rc = SUCCESS; + + ExtensibleChip * mbaChip = mbdb->getMbaChip(i); + if ( NULL == mbaChip ) + { + l_rc = FAIL; + continue; + } + + SCAN_COMM_REGISTER_CLASS * mbaCalFir = + mbaChip->getRegister("MBACALFIR"); + SCAN_COMM_REGISTER_CLASS * mbaCalMask = + mbaChip->getRegister("MBACALFIR_MASK"); + + l_rc = mbaCalFir->Read(); + l_rc |= mbaCalMask->Read(); + + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC "MBACALFIR/MBACALFIR_MASK read failed for" + "0x%08x", mbaChip->GetId()); + continue; + } + + // If any of the MBACALFIR parity error bits are set, we will + // analyze the MBA. + // bits 4 and 7 are parity error bits + bool bit4 = mbaCalFir->IsBitSet(4); + bool mask4 = mbaCalMask->IsBitSet(4); + + bool bit7 = mbaCalFir->IsBitSet(7); + bool mask7 = mbaCalMask->IsBitSet(7); + + if ( ( bit4 && !mask4 ) || ( bit7 && !mask7 ) ) + { + l_rc = mbaChip->Analyze( i_sc, + i_sc.service_data->getSecondaryAttnType() ); + if ( SUCCESS == l_rc ) break; + } + + l_rc = FAIL; + } + + return l_rc; + #undef PRDF_FUNC + +} PRDF_PLUGIN_DEFINE( Membuf, handleMbaCalParityErr ); + +//------------------------------------------------------------------------------ + +/** * @brief When not in MNFG mode, clear the service call flag so that * thresholding will still be done, but no visible error log committed. * @param i_chip Centaur chip |