diff options
Diffstat (limited to 'src/usr')
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C | 39 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H | 3 |
2 files changed, 42 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C index 9fd6324b6..18cc52c6d 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C @@ -173,6 +173,24 @@ uint32_t maskMemPort<TYPE_MCA>( ExtensibleChip * i_chip ) c->setAllBits(); d->setAllBits(); e->setAllBits(); + // We don't want to mask the IUE bits in the MCAECCFIR if they are on + // so if we trigger a port fail that causes a checkstop we have + // something to blame it on. + SCAN_COMM_REGISTER_CLASS * mcaeccfir = i_chip->getRegister("MCAECCFIR"); + + o_rc = mcaeccfir->Read(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Read() Failed on MCAECCFIR: i_chip=0x%08x", + i_chip->getHuid() ); + break; + } + + if ( mcaeccfir->IsBitSet(17) ) + e->ClearBit(17); + if ( mcaeccfir->IsBitSet(37) ) + e->ClearBit(37); + o_rc = c->Write() | d->Write() | e->Write(); if ( SUCCESS != o_rc ) { @@ -256,6 +274,9 @@ uint32_t iuePortFail<TYPE_MCA>( ExtensibleChip * i_chip, { resetTh.second.reset(); } + + db->iv_iuePortFail = true; + break; } } @@ -751,6 +772,24 @@ uint32_t handleMemIue( ExtensibleChip * i_chip, const MemRank & i_rank, // Get the data bundle from chip. D db = static_cast<D>( i_chip->getDataBundle() ); + // If we have already caused a port fail, mask the IUE bits. + if ( true == db->iv_iuePortFail ) + { + SCAN_COMM_REGISTER_CLASS * mask_or = + i_chip->getRegister("MCAECCFIR_MASK_OR"); + + mask_or->SetBit(17); + mask_or->SetBit(37); + + o_rc = mask_or->Write(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Write() failed on 0x%08x", + i_chip->getHuid() ); + break; + } + } + // Get the DIMM select. uint8_t ds = i_rank.getDimmSlct(); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H b/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H index a43486fdf..4d3c4fa02 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H @@ -190,6 +190,9 @@ class McaDataBundle : public DataBundle /** Threshold table for IUEs. Threshold per DIMM */ std::map<uint8_t, TimeBasedThreshold> iv_iueTh; + /** Bool to indicate if we've triggered a port fail because of IUEs. */ + bool iv_iuePortFail = false; + #endif #ifdef __HOSTBOOT_RUNTIME |