diff --git a/src/include/usr/diag/prdf/prdfMain_ipl.H b/src/include/usr/diag/prdf/prdfMain_ipl.H index 08b626ce291..396d225c3a3 100644 --- a/src/include/usr/diag/prdf/prdfMain_ipl.H +++ b/src/include/usr/diag/prdf/prdfMain_ipl.H @@ -48,7 +48,7 @@ extern errlHndl_t noLock_initialize(); /** * @brief Restores hardware DRAM repairs to reflect what is stored in VPD. - * @param i_trgt An MBA or MCA target. + * @param i_trgt An MBA, MCA, or OCMB target. * @return Non-SUCCESS if conditions are such that a callout had to be made, * SUCCESS otherwise. */ diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.H b/src/usr/diag/prdf/common/plat/prdfTargetServices.H index 74ccbbc859b..cead140df15 100755 --- a/src/usr/diag/prdf/common/plat/prdfTargetServices.H +++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.H @@ -321,8 +321,8 @@ TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_trgt, /** * @param i_trgt The target MBA, MCA, OCMB_CHIP, or MEM_PORT. * @param i_rank The target rank. - * @param i_port Port select, only needed for MBA. MCA and MEM_PORT are - * targets equivalent to the port already. + * @param i_port Port select, only needed for MBA and OCMB_CHIP. MCA and + * MEM_PORT are targets equivalent to the port already. * @return The DIMM connected to the target and rank on a port. */ TARGETING::TargetHandle_t getConnectedDimm( TARGETING::TargetHandle_t i_trgt, diff --git a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C index 04eff661e5b..3acf7bcb1cd 100644 --- a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C +++ b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C @@ -171,11 +171,7 @@ void commitSoftError( uint32_t i_reasonCode, TargetHandle_t i_trgt, //------------------------------------------------------------------------------ template -bool processRepairedRanks( TargetHandle_t i_trgt, uint8_t i_repairedRankMask ); - -template<> -bool processRepairedRanks( TargetHandle_t i_trgt, - uint8_t i_repairedRankMask ) +bool processRepairedRanks( TargetHandle_t i_trgt, uint8_t i_repairedRankMask ) { #define PRDF_FUNC "[processRepairedRanks] " @@ -194,7 +190,7 @@ bool processRepairedRanks( TargetHandle_t i_trgt, // map value has no significance. std::map calloutList; - ExtensibleChip * mcaChip = (ExtensibleChip *)systemPtr->GetChip(i_trgt); + ExtensibleChip * chip = (ExtensibleChip *)systemPtr->GetChip(i_trgt); for ( uint8_t r = 0; r < MASTER_RANKS_PER_PORT; ++r ) { @@ -206,20 +202,18 @@ bool processRepairedRanks( TargetHandle_t i_trgt, MemRank rank ( r ); MemMark cm; - if ( SUCCESS != MarkStore::readChipMark( mcaChip, rank, - cm ) ) + if ( SUCCESS != MarkStore::readChipMark( chip, rank, cm ) ) { - PRDF_ERR( PRDF_FUNC "readChipMark(0x%08x,0x%02x) " - "failed", mcaChip->getHuid(), rank.getKey() ); + PRDF_ERR( PRDF_FUNC "readChipMark(0x%08x,0x%02x) " + "failed", chip->getHuid(), rank.getKey() ); continue; // skip this rank } MemMark sm; - if ( SUCCESS != MarkStore::readSymbolMark( mcaChip, rank, - sm ) ) + if ( SUCCESS != MarkStore::readSymbolMark( chip, rank, sm ) ) { - PRDF_ERR( PRDF_FUNC "readSymbolMark(0x%08x,0x%02x) " - "failed", mcaChip->getHuid(), rank.getKey() ); + PRDF_ERR( PRDF_FUNC "readSymbolMark(0x%08x,0x%02x) " + "failed", chip->getHuid(), rank.getKey() ); continue; // skip this rank } @@ -229,9 +223,8 @@ bool processRepairedRanks( TargetHandle_t i_trgt, if ( NULL == errl ) { - errl = createErrl( PRDF_DETECTED_FAIL_HARDWARE, - i_trgt, - PRDFSIG_RdrRepairsUsed ); + errl = createErrl( PRDF_DETECTED_FAIL_HARDWARE, + i_trgt, PRDFSIG_RdrRepairsUsed ); } std::vector symList; @@ -261,16 +254,16 @@ bool processRepairedRanks( TargetHandle_t i_trgt, // Callout all DIMMs in the map. for ( auto const & dimm : calloutList ) { - __calloutDimm( errl, i_trgt, dimm.first ); + __calloutDimm( errl, i_trgt, dimm.first ); } // Commit the error log, if needed. - commitErrl( errl, i_trgt ); + commitErrl( errl, i_trgt ); // Commit an additional error log indicating something failed in the // analysis, if needed. - commitSoftError( PRDF_DETECTED_FAIL_SOFTWARE, i_trgt, - PRDFSIG_RdrInternalFail, analysisErrors ); + commitSoftError( PRDF_DETECTED_FAIL_SOFTWARE, i_trgt, + PRDFSIG_RdrInternalFail, analysisErrors ); }while(0); return o_calloutMade; @@ -278,6 +271,14 @@ bool processRepairedRanks( TargetHandle_t i_trgt, #undef PRDF_FUNC } + +template +bool processRepairedRanks( TargetHandle_t i_trgt, + uint8_t i_repairedRankMask ); +template +bool processRepairedRanks( TargetHandle_t i_trgt, + uint8_t i_repairedRankMask ); + //------------------------------------------------------------------------------ template<> @@ -407,10 +408,7 @@ bool processRepairedRanks( TargetHandle_t i_trgt, template -bool processBadDimms( TargetHandle_t i_trgt, uint8_t i_badDimmMask ); - -template<> -bool processBadDimms( TargetHandle_t i_trgt, uint8_t i_badDimmMask ) +bool processBadDimms( TargetHandle_t i_trgt, uint8_t i_badDimmMask ) { #define PRDF_FUNC "[processBadDimms] " @@ -436,29 +434,35 @@ bool processBadDimms( TargetHandle_t i_trgt, uint8_t i_badDimmMask ) { if ( NULL == errl ) { - errl = createErrl( PRDF_DETECTED_FAIL_HARDWARE, - i_trgt, PRDFSIG_RdrRepairUnavail ); + errl = createErrl( PRDF_DETECTED_FAIL_HARDWARE, + i_trgt, PRDFSIG_RdrRepairUnavail ); } - __calloutDimm( errl, i_trgt, dimm ); + __calloutDimm( errl, i_trgt, dimm ); o_calloutMade = true; } } // Commit the error log, if needed. - commitErrl( errl, i_trgt ); + commitErrl( errl, i_trgt ); // Commit an additional error log indicating something failed in the // analysis, if needed. - commitSoftError( PRDF_DETECTED_FAIL_SOFTWARE, i_trgt, - PRDFSIG_RdrInternalFail, analysisErrors ); + commitSoftError( PRDF_DETECTED_FAIL_SOFTWARE, i_trgt, + PRDFSIG_RdrInternalFail, analysisErrors ); return o_calloutMade; #undef PRDF_FUNC } +template +bool processBadDimms( TargetHandle_t i_trgt, uint8_t i_badDimmMask ); +template +bool processBadDimms( TargetHandle_t i_trgt, + uint8_t i_badDimmMask ); + //------------------------------------------------------------------------------ template<> @@ -595,6 +599,25 @@ void deployDramSpares( TargetHandle_t i_trgt, } } +template<> +void deployDramSpares( TargetHandle_t i_trgt, + const std::vector & i_ranks ) +{ + for ( auto & rank : i_ranks ) + { + MemSymbol sym = MemSymbol::fromSymbol( i_trgt, rank, 71 ); + + int32_t l_rc = mssSetSteerMux(i_trgt, rank, sym, false); + if ( SUCCESS != l_rc ) + { + // mssSetSteerMux() will print a trace and commit the error log, + // however, we need to handle the return code or we get a compile + // warning in Hostboot. + continue; + } + } +} + } // end namespace RDR //------------------------------------------------------------------------------ @@ -695,6 +718,8 @@ template uint32_t restoreDramRepairs( TargetHandle_t i_trgt ); template uint32_t restoreDramRepairs( TargetHandle_t i_trgt ); +template +uint32_t restoreDramRepairs( TargetHandle_t i_trgt ); //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C index 204e61ca6d8..756d877c0dd 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C @@ -211,9 +211,9 @@ uint32_t mssRestoreDramRepairs( TargetHandle_t i_target, //------------------------------------------------------------------------------ template<> -uint32_t mssRestoreDramRepairs( TargetHandle_t i_target, - uint8_t & o_repairedRankMask, - uint8_t & o_badDimmMask ) +uint32_t mssRestoreDramRepairs( TargetHandle_t i_target, + uint8_t & o_repairedRankMask, + uint8_t & o_badDimmMask ) { uint32_t o_rc = SUCCESS; @@ -223,7 +223,7 @@ uint32_t mssRestoreDramRepairs( TargetHandle_t i_target, fapi2::buffer tmpRepairedRankMask, tmpBadDimmMask; FAPI_INVOKE_HWP( errl, mss::restore_repairs, - fapi2::Target( i_target ), + fapi2::Target( i_target ), tmpRepairedRankMask, tmpBadDimmMask ); if ( NULL != errl )