diff options
Diffstat (limited to 'src/usr/diag/prdf/plat')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C | 94 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_ipl.C | 19 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_ipl.H | 9 |
3 files changed, 42 insertions, 80 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C index f4c75efb8..bd8a3fde2 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2017 */ +/* Contributors Listed Below - COPYRIGHT 2016,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -122,22 +122,30 @@ uint32_t VcmEvent<T>::cleanup( STEP_CODE_DATA_STRUCT & io_sc ) //------------------------------------------------------------------------------ -// Avoid linker errors with the template. -template class VcmEvent<TYPE_MCA>; -template class VcmEvent<TYPE_MBA>; +template<TARGETING::TYPE T> +bool __iueCheck( uint32_t i_eccAttns ); -//############################################################################## -// -// Specializations for MCA -// -//############################################################################## +template<> +bool __iueCheck<TYPE_MCA>( uint32_t i_eccAttns ) +{ + return ( 0 != (i_eccAttns & MAINT_IUE) ); +} template<> -uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns, - STEP_CODE_DATA_STRUCT & io_sc, - bool & o_done ) +bool __iueCheck<TYPE_MBA>( uint32_t i_eccAttns ) { - #define PRDF_FUNC "[VcmEvent<TYPE_MCA>::checkEcc] " + // IUES are reported via RCE ETE on Centaur + return ( 0 != (i_eccAttns & MAINT_RCE_ETE) ); +} + +//------------------------------------------------------------------------------ + +template<TARGETING::TYPE T> +uint32_t VcmEvent<T>::checkEcc( const uint32_t & i_eccAttns, + STEP_CODE_DATA_STRUCT & io_sc, + bool & o_done ) +{ + #define PRDF_FUNC "[VcmEvent<T>::checkEcc] " uint32_t o_rc = SUCCESS; @@ -146,7 +154,7 @@ uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns, // IUEs are reported as UEs during read operations. 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_IUE) ) + if ( (i_eccAttns & MAINT_UE) || __iueCheck<T>(i_eccAttns) ) { PRDF_TRAC( PRDF_FUNC "UE Detected: 0x%08x,0x%02x", iv_chip->getHuid(), getKey() ); @@ -159,7 +167,7 @@ uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns, // 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_MCA>( iv_chip, addr ); + o_rc = getMemMaintAddr<T>( iv_chip, addr ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getMemMaintAddr(0x%08x) failed", @@ -167,8 +175,8 @@ uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns, break; } - o_rc = MemEcc::handleMemUe<TYPE_MCA>( iv_chip, addr, - UE_TABLE::SCRUB_UE, io_sc ); + o_rc = MemEcc::handleMemUe<T>( iv_chip, addr, UE_TABLE::SCRUB_UE, + io_sc ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "handleMemUe(0x%08x,0x%02x) failed", @@ -187,55 +195,11 @@ uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns, #undef PRDF_FUNC } -//############################################################################## -// -// Specializations for MBA -// -//############################################################################## - -template<> -uint32_t VcmEvent<TYPE_MBA>::checkEcc( const uint32_t & i_eccAttns, - STEP_CODE_DATA_STRUCT & io_sc, - bool & o_done ) -{ - #define PRDF_FUNC "[VcmEvent<TYPE_MBA>::checkEcc] " - - uint32_t o_rc = SUCCESS; - - do - { - // IUEs (reported via RCE ETE) are reported as UEs during read - // operations. 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) ) - { - PRDF_TRAC( PRDF_FUNC "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_MaintRETRY_CTE ); - // TODO: RTC 157888 - // - Call mssIplUeIsolation() and add all DIMMs with bad bits to the - // callout list. - // - Make the error log predictive. - // - Might be able to tuck this into MemEcc::handleMemUe(). - PRDF_ERR( PRDF_FUNC "function not implemented yet" ); - - // Leave the mark in place and abort this procedure. - o_done = true; - } - - } while (0); - - return o_rc; - - #undef PRDF_FUNC -} - //------------------------------------------------------------------------------ +// Avoid linker errors with the template. +template class VcmEvent<TYPE_MCA>; +template class VcmEvent<TYPE_MBA>; + } // end namespace PRDF diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C index 58c6e63ce..206deb85a 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C @@ -210,20 +210,20 @@ uint32_t mssRestoreDramRepairs<TYPE_MBA>( TargetHandle_t i_target, //------------------------------------------------------------------------------ - -/* TODO RTC 157888 -int32_t mssIplUeIsolation( TargetHandle_t i_mba, const CenRank & i_rank, - CenDqBitmap & o_bitmap ) +template<> +uint32_t mssIplUeIsolation( TargetHandle_t i_mba, const MemRank & i_rank, + MemDqBitmap<DIMMS_PER_RANK::MBA> & o_bitmap ) { #define PRDF_FUNC "[PlatServices::mssIplUeIsolation] " - int32_t o_rc = SUCCESS; + uint32_t o_rc = SUCCESS; - uint8_t data[MBA_DIMMS_PER_RANK][DIMM_DQ_RANK_BITMAP_SIZE]; + uint8_t data[DIMMS_PER_RANK::MBA][DQ_BITMAP::BITMAP_SIZE]; errlHndl_t errl = NULL; - FAPI_INVOKE_HWP( errl, mss_IPL_UE_isolation, getFapiTarget(i_mba), - i_rank.getMaster(), data ); + fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba( i_mba ); + FAPI_INVOKE_HWP( errl, mss_IPL_UE_isolation, fapiMba, i_rank.getMaster(), + data ); if ( NULL != errl ) { PRDF_ERR( PRDF_FUNC "mss_IPL_UE_isolation() failed: MBA=0x%08x " @@ -233,14 +233,13 @@ int32_t mssIplUeIsolation( TargetHandle_t i_mba, const CenRank & i_rank, } else { - o_bitmap = CenDqBitmap ( i_mba, i_rank, data ); + o_bitmap = MemDqBitmap<DIMMS_PER_RANK::MBA>( i_mba, i_rank, data ); } return o_rc; #undef PRDF_FUNC } -*/ //############################################################################## //## Nimbus Maintenance Command wrappers diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H index 5c7a57772..61a5ef422 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H @@ -91,11 +91,10 @@ uint32_t mssRestoreDramRepairs( TARGETING::TargetHandle_t i_target, * @param o_bitmap DQ bitmap container. * @return Non-SUCCESS in internal function fails, SUCCESS otherwise. */ -/* TODO RTC 157888 -int32_t mssIplUeIsolation( TARGETING::TargetHandle_t i_mba, - const CenRank & i_rank, - CenDqBitmap & o_bitmap ); -*/ +template<DIMMS_PER_RANK D> +uint32_t mssIplUeIsolation( TARGETING::TargetHandle_t i_mba, + const MemRank & i_rank, + MemDqBitmap<D> & o_bitmap ); //############################################################################## //## Nimbus/Centaur Maintenance Command wrappers |