diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C | 3 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H | 4 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C | 34 |
3 files changed, 22 insertions, 19 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C index ebe116431..5e1efccc8 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C @@ -289,6 +289,8 @@ uint32_t checkEccFirs<TYPE_MCA>( ExtensibleChip * i_chip, if ( 0 != mcaeccfir->GetBitFieldJustified(20,8) ) o_eccAttns |= MAINT_MPE; + if ( mcaeccfir->IsBitSet(28) ) o_eccAttns |= MAINT_NCE; + if ( mcaeccfir->IsBitSet(29) ) o_eccAttns |= MAINT_TCE; if ( mcaeccfir->IsBitSet(30) ) o_eccAttns |= MAINT_SCE; if ( mcaeccfir->IsBitSet(31) ) o_eccAttns |= MAINT_MCE; if ( mcaeccfir->IsBitSet(34) ) o_eccAttns |= MAINT_UE; @@ -354,6 +356,7 @@ uint32_t checkEccFirs<TYPE_MBA>( ExtensibleChip * i_chip, if ( 0 != mbseccfir->GetBitFieldJustified(20,8) ) o_eccAttns |= MAINT_MPE; + if ( mbseccfir->IsBitSet(36) ) o_eccAttns |= MAINT_NCE; if ( mbseccfir->IsBitSet(37) ) o_eccAttns |= MAINT_SCE; if ( mbseccfir->IsBitSet(38) ) o_eccAttns |= MAINT_MCE; if ( mbseccfir->IsBitSet(41) ) o_eccAttns |= MAINT_UE; diff --git a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H index 881a5b1fd..c81c6b4a7 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H @@ -126,6 +126,10 @@ enum MaintEccAttns // Nimbus only MAINT_IUE = 0x0080, ///< Intermittent UE MAINT_IMPE = 0x0040, ///< Intermittent chip mark + + // Maintenance CEs + MAINT_NCE = 0x0020, ///< CE + MAINT_TCE = 0x0010, ///< CE on two symbols (Nimbus only) }; /** diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C index 64719bf5f..e6d769b6c 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C @@ -190,28 +190,24 @@ uint32_t __checkEcc( ExtensibleChip * i_chip, TdQueue & io_queue, } } else if ( isMfgCeCheckingEnabled() && - (0 != (eccAttns & MAINT_HARD_NCE_ETE)) ) + (0 != (eccAttns & MAINT_HARD_NCE_ETE)) && + ( (0 != (eccAttns & MAINT_NCE)) || + (0 != (eccAttns & MAINT_TCE)) ) ) { - io_sc.service_data->AddSignatureList( trgt, PRDFSIG_MaintHARD_CTE ); + // NOTE: The MAINT_HARD_NCE_ETE attention is reported on the MCBIST. + // If the command is run in broadcast mode, we may end up + // doing TPS on all four ports when only one port has the CE. + // Therefore, we must check for MAINT_NCE or MAINT_TCE, which + // are found on the MCA, to determine if this MCA need a TPS + // procedure. - // Query the per-symbol counters for the hard CE symbol. - MemUtils::MaintSymbols symData; MemSymbol junk; - o_rc = MemUtils::collectCeStats<T>( i_chip, rank, symData, junk ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "MemUtils::collectCeStats(0x%08x,m%ds%d) " - "failed", i_chip->GetId(), rank.getMaster(), - rank.getSlave() ); - break; - } + io_sc.service_data->AddSignatureList( trgt, PRDFSIG_MaintHARD_CTE ); - // The command will have finished at the end of the rank so there - // may be more than one symbol. Add all to the callout list. - for ( auto & s : symData ) - { - MemoryMru memmru ( trgt, rank, s.symbol ); - io_sc.service_data->SetCallout( memmru ); - } + // NOTE: Normally we would add each symbol in the per-symbol + // counters to the callout list for FFDC, but the results are + // a bit undefined in broadcast mode. Since this should not be + // a predictive error log, it is fine to have no callouts for + // now. // Add a TPS procedure to the queue. TdEntry * e = new TpsEvent<T>{ i_chip, rank }; |