diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2018-05-21 21:09:56 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-05-30 11:34:54 -0400 |
commit | b869f42b77f42f47bd6c5e45ca9c61da29b0ccbd (patch) | |
tree | 5fcc21f628173239487cc8cf7474fbc6c8142a3f /src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C | |
parent | 6b6f1ef8f53fbd871cca4aa2ba18da14a7badbe9 (diff) | |
download | talos-hostboot-b869f42b77f42f47bd6c5e45ca9c61da29b0ccbd.tar.gz talos-hostboot-b869f42b77f42f47bd6c5e45ca9c61da29b0ccbd.zip |
PRD: ECC analysis and command handling for DRAM sparing
Change-Id: I031abe95c8bcbbce26ee5b064aca7ba95f19d924
RTC: 193444
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59164
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Matt Derksen <mderkse1@us.ibm.com>
Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59514
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C | 174 |
1 files changed, 153 insertions, 21 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C index 63fea6ea8..a7de2d38c 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C @@ -26,6 +26,7 @@ /** @file prdfMemDsd_ipl.C */ // Platform includes +#include <prdfCenMbaExtraSig.H> #include <prdfMemDqBitmap.H> #include <prdfMemDsd.H> @@ -38,54 +39,155 @@ using namespace PlatServices; //############################################################################## // -// Generic template functions +// Specializations for MBA // //############################################################################## -template<TARGETING::TYPE T> -uint32_t DsdEvent<T>::analyzePhase( STEP_CODE_DATA_STRUCT & io_sc, - bool & o_done ) +template<> +uint32_t DsdEvent<TYPE_MBA>::checkEcc( const uint32_t & i_eccAttns, + STEP_CODE_DATA_STRUCT & io_sc, + bool & o_done ) { - #define PRDF_FUNC "[DsdEvent::analyzePhase] " + #define PRDF_FUNC "[DsdEvent<TYPE_MBA>::checkEcc] " uint32_t o_rc = SUCCESS; do { - if ( TD_PHASE_0 == iv_phase ) + // IUEs are reported as UEs during read operations (via RCE ETE on + // Centaur). Therefore, we will treat IUEs like UEs for these scrub + // operations simply to maintain consistency during all of Memory + // Diagnostics. + if ( (i_eccAttns & MAINT_UE) || (i_eccAttns & MAINT_RCE_ETE) ) { - // Before starting the next command, set iv_mark in the steer mux. - /* TODO: RTC 189221 - o_rc = setSteerMux<T>( iv_chip, iv_rank, iv_mark ); + PRDF_TRAC( "[DsdEvent] UE Detected: 0x%08x,0x%02x", + iv_chip->getHuid(), getKey() ); + + io_sc.service_data->setSignature( iv_chip->getHuid(), + (i_eccAttns & MAINT_UE) + ? PRDFSIG_MaintUE + : PRDFSIG_MaintIUE ); + + // At this point we don't actually have an address for the UE. The + // best we can do is get the address in which the command stopped. + MemAddr addr; + o_rc = getMemMaintAddr<TYPE_MBA>( iv_chip, addr ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC "setSteerMux(0x%08x,0x%2x) failed", + PRDF_ERR( PRDF_FUNC "getMemMaintAddr(0x%08x) failed", + iv_chip->getHuid() ); + break; + } + + o_rc = MemEcc::handleMemUe<TYPE_MBA>( iv_chip, addr, + UE_TABLE::SCRUB_UE, io_sc ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "handleMemUe(0x%08x,0x%02x) failed", iv_chip->getHuid(), getKey() ); break; } + + // Leave the mark in place and abort this procedure. + o_done = true; break; + } + + } while (0); + + return o_rc; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +template<> +uint32_t DsdEvent<TYPE_MBA>::verifySpare( const uint32_t & i_eccAttns, + STEP_CODE_DATA_STRUCT & io_sc, + bool & o_done ) +{ + #define PRDF_FUNC "[DsdEvent<TYPE_MBA>::verifySpare] " + + uint32_t o_rc = SUCCESS; + + do + { + if ( TD_PHASE_2 != iv_phase ) break; // nothing to do + + if ( i_eccAttns & MAINT_MCE ) + { + PRDF_TRAC( "[DsdEvent] DRAM spare is bad: 0x%08x,0x%02x", + iv_chip->getHuid(), getKey() ); + + io_sc.service_data->setSignature( iv_chip->getHuid(), + PRDFSIG_DsdBadSpare ); + + // Make the error log predictive. + io_sc.service_data->setServiceCall(); + + // Set the bad spare in the VPD. At this point, the chip mark + // should have already been set in the VPD because it was recently + // verified. + + /* TODO: RTC 189221 + CenDqBitmap bitmap; + o_rc = getBadDqBitmap( iv_mbaTrgt, iv_rank, bitmap ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed" ); + break; + } + if ( iv_eccSpare ) + { + bitmap.setEccSpare(); + } + else + { + o_rc = bitmap.setDramSpare( iv_mark.getCM().getPortSlct() ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "setDramSpare() failed" ); + break; + } + } + + o_rc = setBadDqBitmap( iv_mbaTrgt, iv_rank, bitmap ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "setBadDqBitmap() failed" ); + break; + } */ + } + else + { + PRDF_TRAC( "[DsdEvent] DRAM spare applied successfully: " + "0x%08x,0x%02x", iv_chip->getHuid(), getKey() ); - break; // Nothing to analyze yet. + io_sc.service_data->setSignature( iv_chip->getHuid(), + PRDFSIG_DsdDramSpared ); + + // Remove the chip mark. + o_rc = MarkStore::clearChipMark<TYPE_MBA>( iv_chip, iv_rank ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "clearChipMark(0x%08x,0x%02x) failed", + iv_chip->getHuid(), getKey() ); + break; + } } - // TODO: RTC 189221 finish supporting this function. + // At this point the procedure is complete. + o_done = true; } while (0); - // TODO: RTC 189221 remove once function is supported - PRDF_ERR( PRDF_FUNC "not supported yet" ); - o_done = true; // to ensure nothing else gets executed - return o_rc; #undef PRDF_FUNC } -//############################################################################## -// -// Specializations for MBA -// -//############################################################################## +//------------------------------------------------------------------------------ template<> uint32_t DsdEvent<TYPE_MBA>::startCmd() @@ -130,5 +232,35 @@ uint32_t DsdEvent<TYPE_MBA>::startCmd() //------------------------------------------------------------------------------ +template<> +uint32_t DsdEvent<TYPE_MBA>::startNextPhase( STEP_CODE_DATA_STRUCT & io_sc ) +{ + uint32_t signature = 0; + + switch ( iv_phase ) + { + case TD_PHASE_0: + iv_phase = TD_PHASE_1; + signature = PRDFSIG_StartDsdPhase1; + break; + + case TD_PHASE_1: + iv_phase = TD_PHASE_2; + signature = PRDFSIG_StartDsdPhase2; + break; + + default: PRDF_ASSERT( false ); // invalid phase + } + + PRDF_TRAC( "[DsdEvent] Starting DSD Phase %d: 0x%08x,0x%02x", + iv_phase, iv_chip->getHuid(), getKey() ); + + io_sc.service_data->AddSignatureList( iv_chip->getTrgt(), signature ); + + return startCmd(); +} + +//------------------------------------------------------------------------------ + } // end namespace PRDF |