diff options
Diffstat (limited to 'src/usr/diag/prdf')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C | 21 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C | 11 |
2 files changed, 21 insertions, 11 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C index 77a73e83b..5acfc44f5 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C @@ -210,18 +210,25 @@ uint32_t __checkEcc( ExtensibleChip * i_chip, TdQueue & io_queue, { io_sc.service_data->AddSignatureList( trgt, PRDFSIG_MaintHARD_CTE ); - // Query the per-symbol counters for hard CE symbols and make - // callouts for each failing DIMM. Note that this function creates - // new error logs for each DIMM with a hard CE. - D db = static_cast<D>(i_chip->getDataBundle()); - o_rc = db->getIplCeStats()->calloutHardCes(rank); + // 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 "calloutHardCes(0x%02x) failed", - rank.getKey() ); + PRDF_ERR( PRDF_FUNC "MemUtils::collectCeStats(0x%08x,m%ds%d) " + "failed", i_chip->GetId(), rank.getMaster(), + rank.getSlave() ); break; } + // 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 ); + } + // Add a TPS procedure to the queue. TdEntry * e = new TpsEvent<T>{ i_chip, rank }; io_queue.push( e ); diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C index c699d163b..8525c47f2 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C @@ -82,13 +82,16 @@ uint32_t TpsEvent<TYPE_MCA>::nextStep( STEP_CODE_DATA_STRUCT & io_sc, //phase 1/2 else { - //collect the CE statistics for later analysis use + // PHASE_1: Collect soft/intermittent CE for later analysis use. + // PHASE_2: Callout all hard CEs. McaDataBundle * db = getMcaDataBundle( iv_chip ); - o_rc = db->getIplCeStats()->collectStats( iv_rank ); + o_rc = ( TD_PHASE_1 == iv_phase ) + ? db->getIplCeStats()->collectStats( iv_rank) + : db->getIplCeStats()->calloutHardCes(iv_rank); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "collectStats(m%ds%d) failed on 0x%08x", - iv_rank.getMaster(), iv_rank.getSlave(), + PRDF_ERR( PRDF_FUNC "collectStats/calloutHardCes(0x%02x) " + "failed on 0x%08x", iv_rank.getKey(), iv_chip->getHuid() ); break; } |