diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C index bff7d612eae..e0bcd5bb663 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -269,6 +269,23 @@ uint32_t getMemMaintAddr( ExtensibleChip * i_chip, //------------------------------------------------------------------------------ +template<> +uint32_t getMemMaintAddr( ExtensibleChip * i_chip, MemAddr & o_addr ) +{ + #define PRDF_FUNC "[getMemMaintAddr] " + + // Check parameters + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MCA == i_chip->getType() ); + + ExtensibleChip * mcbChip = getConnectedParent( i_chip, TYPE_MCBIST ); + + return getMemMaintAddr( mcbChip, o_addr ); + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ template<> uint32_t getMemMaintAddr( ExtensibleChip * i_chip, MemAddr & o_addr ) { diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C index a43f5013145..1cf7ab1af24 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C @@ -43,6 +43,85 @@ namespace MemEcc //------------------------------------------------------------------------------ +#ifdef __HOSTBOOT_MODULE + +uint32_t maskMemPort( ExtensibleChip * i_chip ) +{ + #define PRDF_FUNC "[MemEcc::maskMemPort] " + + PRDF_ASSERT( TYPE_MCA == i_chip->getType() ); + + SCAN_COMM_REGISTER_CLASS * c = i_chip->getRegister("MCACALFIR_MASK_OR"); + SCAN_COMM_REGISTER_CLASS * d = i_chip->getRegister("DDRPHYFIR_MASK_OR"); + SCAN_COMM_REGISTER_CLASS * e = i_chip->getRegister("MCAECCFIR_MASK_OR"); + + c->setAllBits(); d->setAllBits(); e->setAllBits(); + + return ( c->Write() | d->Write() | e->Write() ); + + #undef PRDF_FUNC +} + +#endif // __HOSTBOOT_MODULE + +//------------------------------------------------------------------------------ + +#ifdef __HOSTBOOT_RUNTIME + +uint32_t iuePortFail(ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc) +{ + #define PRDF_FUNC "[MemEcc::iuePortFail] " + + PRDF_ASSERT( TYPE_MCA == i_chip->getType() ); + + uint32_t o_rc = SUCCESS; + + do + { + McaDataBundle * db = getMcaDataBundle( i_chip ); + + // If threshold reached + if ( db->iv_iueTh.thReached(io_sc) ) + { + // trigger a port fail + // set FARB0[59] - MBA_FARB0Q_CFG_INJECT_PARITY_ERR_CONSTANT and + // FARB0[40] - MBA_FARB0Q_CFG_INJECT_PARITY_ERR_ADDR5 + SCAN_COMM_REGISTER_CLASS * farb0 = i_chip->getRegister("FARB0"); + + o_rc = farb0->Read(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Read() FARB0 failed: i_chip=0x%08x", + i_chip->getHuid() ); + break; + } + + farb0->SetBit(59); + farb0->SetBit(40); + + o_rc = farb0->Write(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Write() FARB0 failed: i_chip=0x%08x", + i_chip->getHuid() ); + break; + } + + // reset threshold to prevent issuing multiple port failures on the + // same port + db->iv_iueTh.reset(); + } + }while(0); + + return o_rc; + + #undef PRDF_FUNC +} + +#endif // __HOSTBOOT_RUNTIME + +//------------------------------------------------------------------------------ + template<> void calloutMemUe( ExtensibleChip * i_chip, const MemRank & i_rank, STEP_CODE_DATA_STRUCT & io_sc ) @@ -561,6 +640,185 @@ uint32_t analyzeFetchUe( ExtensibleChip * i_chip, //------------------------------------------------------------------------------ +#ifdef __HOSTBOOT_MODULE + +template +uint32_t __analyzeIue( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc, + MemAddr i_addr ) +{ + #define PRDF_FUNC "[MemEcc::__analyzeIue] " + + PRDF_ASSERT( T == i_chip->getType() ); + uint32_t o_rc = SUCCESS; + + do + { + // get data bundle from chip + D db = static_cast( i_chip->getDataBundle() ); + + // get the rank + MemRank rank = i_addr.getRank(); + + TargetHandle_t trgt = i_chip->getTrgt(); + + // Add the DIMM to the callout list + MemoryMru memmru(trgt, rank, MemoryMruData::CALLOUT_RANK); + io_sc.service_data->SetCallout( memmru ); + + // increment the threshold - check if at threshold + if ( db->iv_iueTh.inc(io_sc) ) + { + // Make the error log predictive + io_sc.service_data->setServiceCall(); + + #ifdef __HOSTBOOT_RUNTIME + + /* TODO RTC 136129 + // Dynamically deallocate the rank. + uint32_t dealloc_rc = MemDealloc::rank( i_chip, rank ); + if ( SUCCESS != dealloc_rc ) + { + PRDF_ERR( PRDF_FUNC "MemDealloc::rank() failed: i_chip=0x%08x " + "rank=m%ds%d", i_chip->getHuid(), rank.getMaster(), + rank.getSlave() ); + o_rc = dealloc_rc; break; + } + */ + + #endif // __HOSTBOOT_RUNTIME + + // mask off the entire port to avoid collateral + o_rc = maskMemPort( i_chip ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "MemEcc::maskMemPort failed: i_chip=0x%08x", + i_chip->getHuid() ); + break; + } + + // Port fail will be triggered in PostAnalysis after the error log + // has been committed. + } + + }while(0); + + return o_rc; + + #undef PRDF_FUNC +} + +// To resolve template linker errors. +template +uint32_t __analyzeIue(ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc, + MemAddr i_addr ); + +#endif // __HOSTBOOT_MODULE + +//------------------------------------------------------------------------------ + +template +uint32_t analyzeMainlineIue( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + #define PRDF_FUNC "[MemEcc::analyzeMainlineIue] " + + PRDF_ASSERT( T == i_chip->getType() ); + uint32_t o_rc = SUCCESS; + + #ifdef __HOSTBOOT_MODULE + + do + { + + // get the address of the failure + MemAddr addr; + + // Use the address in MBRCER. This address also traps IRCDs, but it is + // not likely that we will have two independent failure modes at the + // same time. So we just assume the address is correct. + o_rc = getMemReadAddr( i_chip, MemAddr::READ_RCE_ADDR, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getMemReadAddr(0x%08x, READ_RCE_ADDR) failed", + i_chip->getHuid() ); + break; + } + + o_rc = __analyzeIue( i_chip, io_sc, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "__analyzeIue failed. Chip HUID: 0x%08x", + i_chip->getHuid() ); + break; + } + + }while(0); + + #endif + + return o_rc; + + #undef PRDF_FUNC + +} + +// To resolve template linker errors. +template +uint32_t analyzeMainlineIue( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ); + +//------------------------------------------------------------------------------ + +template +uint32_t analyzeMaintIue( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + #define PRDF_FUNC "[MemEcc::analyzeMaintIue] " + + PRDF_ASSERT( T == i_chip->getType() ); + uint32_t o_rc = SUCCESS; + + #ifdef __HOSTBOOT_MODULE + + do + { + MemAddr addr; + + // Use the current address in the MCBMCAT + o_rc = getMemMaintAddr( i_chip, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getMemMaintAddr(0x%08x) failed", + i_chip->getHuid() ); + break; + } + + o_rc = __analyzeIue( i_chip, io_sc, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "__analyzeIue failed. Chip HUID: " + "0x%08x", i_chip->getHuid() ); + break; + } + + }while(0); + + #endif + + return o_rc; + + #undef PRDF_FUNC + +} + +// To resolve template linker errors. +template +uint32_t analyzeMaintIue(ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ); + +//------------------------------------------------------------------------------ + } // end namespace MemEcc } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H index 1ed11fdccca..4855abeb6e6 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H @@ -99,8 +99,48 @@ template uint32_t analyzeFetchUe( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc ); +/** + * @brief Analyzes a fetch mainline IUE attention. + * @param i_chip MCA or MBA. + * @param io_sc The step code data struct. + * @return Non-SUCCESS if an interal function fails, SUCCESS otherwise. + */ +template +uint32_t analyzeMainlineIue( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ); + + +/** + * @brief Analyzes a fetch maint IUE attention. + * @param i_chip MCA or MBA. + * @param io_sc The step code data struct. + * @return Non-SUCCESS if an interal function fails, SUCCESS otherwise. + */ +template +uint32_t analyzeMaintIue( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ); + +#ifdef __HOSTBOOT_RUNTIME + +/** + * @brief Will trigger a port fail if the number of IUEs is over threshold + * @param i_chip MCA chip + * @param io_sc The step code data struct. + * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise + */ +uint32_t iuePortFail(ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc); + +#endif // __HOSTBOOT_RUNTIME + #ifdef __HOSTBOOT_MODULE +/** + * @brief Will mask off the entire mem port + * @param i_chip MCA chip + * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise + */ +uint32_t maskMemPort( ExtensibleChip * i_chip ); + template uint32_t addVcmEvent( ExtensibleChip * i_chip, const MemRank & i_rank, const MemMark & i_mark, STEP_CODE_DATA_STRUCT & io_sc ); diff --git a/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C b/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C index f3c0b097d49..6a064bf87e4 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C @@ -61,25 +61,6 @@ int32_t Initialize( ExtensibleChip * i_chip ) } PRDF_PLUGIN_DEFINE( p9_mca, Initialize ); -/** - * @brief Plugin function called after analysis is complete but before PRD - * exits. - * @param i_chip An MCA chip. - * @param io_sc The step code data struct. - * @note This is especially useful for any analysis that still needs to be - * done after the framework clears the FIR bits that were at attention. - * @return SUCCESS. - */ -int32_t PostAnalysis( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc ) -{ - #define PRDF_FUNC "[p9_mca::PostAnalysis] " - - return SUCCESS; // Always return SUCCESS for this plugin. - - #undef PRDF_FUNC -} -PRDF_PLUGIN_DEFINE( p9_mca, PostAnalysis ); - //############################################################################## // // DDRPHYFIR @@ -161,46 +142,6 @@ int32_t mcaUeAlgorithm( ExtensibleChip * i_chip, } PRDF_PLUGIN_DEFINE( p9_mca, mcaUeAlgorithm ); -//############################################################################## -// -// MCACALFIR -// -//############################################################################## - -/** - * @brief MCACALFIR[13] - Persistent RCD error, port failed. - * @param i_chip MCA chip. - * @param io_sc The step code data struct. - * @return SUCCESS - */ -int32_t MemPortFailure( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) -{ - #define PRDF_FUNC "[p9_mca::MemPortFailure] " - - if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) - { - // The port is dead mask off the entire port. - - SCAN_COMM_REGISTER_CLASS * c = i_chip->getRegister("MCACALFIR_MASK_OR"); - SCAN_COMM_REGISTER_CLASS * d = i_chip->getRegister("DDRPHYFIR_MASK_OR"); - SCAN_COMM_REGISTER_CLASS * e = i_chip->getRegister("MCAECCFIR_MASK_OR"); - - c->setAllBits(); d->setAllBits(); e->setAllBits(); - - if ( SUCCESS != (c->Write() | d->Write() | e->Write()) ) - { - PRDF_ERR( PRDF_FUNC "Write() failed: i_chip=0x%08x", - i_chip->getHuid() ); - } - } - - return SUCCESS; // nothing to return to rule code - - #undef PRDF_FUNC -} -PRDF_PLUGIN_DEFINE( p9_mca, MemPortFailure ); - //############################################################################## // // MCAECCFIR @@ -284,6 +225,38 @@ PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeFetchUe ); //------------------------------------------------------------------------------ +/** + * @brief MCAECCFIR[17] - Mainline read IUE. + * @param i_chip MCA chip. + * @param io_sc The step code data struct. + * @return SUCCESS + */ +int32_t AnalyzeMainlineIue( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + MemEcc::analyzeMainlineIue( i_chip, io_sc ); + return SUCCESS; // nothing to return to rule code +} +PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeMainlineIue ); + +//------------------------------------------------------------------------------ + +/** + * @brief MCAECCFIR[37] - Maint IUE. + * @param i_chip MCA chip. + * @param io_sc The step code data struct. + * @return SUCCESS + */ +int32_t AnalyzeMaintIue( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + MemEcc::analyzeMaintIue( i_chip, io_sc ); + return SUCCESS; // nothing to return to rule code +} +PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeMaintIue ); + +//------------------------------------------------------------------------------ + } // end namespace p9_mca } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plat/p9/p9_mca.rule b/src/usr/diag/prdf/common/plat/p9/p9_mca.rule index 9946489d33a..4f54882b044 100644 --- a/src/usr/diag/prdf/common/plat/p9/p9_mca.rule +++ b/src/usr/diag/prdf/common/plat/p9/p9_mca.rule @@ -324,7 +324,7 @@ rule rMCAECCFIR MCAECCFIR & ~MCAECCFIR_MASK & MCAECCFIR_ACT0 & MCAECCFIR_ACT1; }; -group gMCAECCFIR filter singlebit, cs_root_cause( 14 ) +group gMCAECCFIR filter singlebit, cs_root_cause( 14, 17, 37 ) { /** MCAECCFIR[0] * Mainline read MPE on rank 0 diff --git a/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule b/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule index 746ca2e7314..d3ebc436e4b 100644 --- a/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule +++ b/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule @@ -77,9 +77,24 @@ actionclass rcd_parity_error funccall("RcdParityError"); # Run TPS on TH for all MCA ranks }; -actionclass mainline_iue_handling { TBDDefaultCallout; }; # TODO RTC 165383 +/** Handle Mainline IUEs */ +actionclass mainline_iue_handling +{ + SUEGenerationPoint; + # Thresholding done in the plugin + funccall("AnalyzeMainlineIue"); +}; + actionclass mainline_impe_handling { TBDDefaultCallout; }; # TODO RTC 165384 -actionclass maintenance_iue_handling { TBDDefaultCallout; }; # TODO RTC 165383 + +/** Handle Maintenance IUEs */ +actionclass maintenance_iue_handling +{ + SUEGenerationPoint; + # Thresholding done in the plugin + funccall("AnalyzeMaintIue"); +}; + actionclass maintenance_impe_handling { TBDDefaultCallout; }; # TODO RTC 165384 /** MCA/UE algroithm, threshold 5 per day */ diff --git a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C index cda2226c7ea..8872a420930 100644 --- a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C +++ b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C @@ -29,6 +29,7 @@ #include // Platform includes +#include #include #include #include @@ -47,6 +48,48 @@ using namespace PlatServices; namespace p9_mca { +//############################################################################## +// +// Special plugins +// +//############################################################################## + +/** + * @brief Plugin function called after analysis is complete but before PRD + * exits. + * @param i_chip An MCA chip. + * @param io_sc The step code data struct. + * @note This is especially useful for any analysis that still needs to be + * done after the framework clears the FIR bits that were at attention. + * @return SUCCESS. + */ +int32_t PostAnalysis( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc ) +{ + #define PRDF_FUNC "[p9_mca::PostAnalysis] " + + #ifdef __HOSTBOOT_RUNTIME + + + // If the IUE threshold in our data bundle has been reached, we trigger + // a port fail. Once we trigger the port fail, the system may crash + // right away. Since PRD is running in the hypervisor, it is possible we + // may not get the error log. To better our chances, we trigger the port + // fail here after the error log has been committed. + if ( SUCCESS != MemEcc::iuePortFail(i_chip, io_sc) ) + { + PRDF_ERR( PRDF_FUNC "iuePortFail failed: i_chip=0x%08x", + i_chip->getHuid() ); + } + + #endif // __HOSTBOOT_RUNTIME + + return SUCCESS; // Always return SUCCESS for this plugin. + + #undef PRDF_FUNC +} +PRDF_PLUGIN_DEFINE( p9_mca, PostAnalysis ); + + //############################################################################## // // MCACALFIR @@ -135,6 +178,37 @@ int32_t RcdParityError( ExtensibleChip * i_mcaChip, } PRDF_PLUGIN_DEFINE( p9_mca, RcdParityError ); +//------------------------------------------------------------------------------ + +/** + * @brief MCACALFIR[13] - Persistent RCD error, port failed. + * @param i_chip MCA chip. + * @param io_sc The step code data struct. + * @return SUCCESS + */ +int32_t MemPortFailure( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + #define PRDF_FUNC "[p9_mca::MemPortFailure] " + + if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) + { + // The port is dead mask off the entire port. + uint32_t l_rc = MemEcc::maskMemPort( i_chip ); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC "MemEcc::maskMemPort failed: i_chip=0x%08x", + i_chip->getHuid() ); + } + + } + + return SUCCESS; // nothing to return to rule code + + #undef PRDF_FUNC +} +PRDF_PLUGIN_DEFINE( p9_mca, MemPortFailure ); + } // end namespace p9_mca } // end namespace PRDF diff --git a/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C b/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C index 4aa49f5d2dd..4a80c2203a4 100644 --- a/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C +++ b/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C @@ -34,9 +34,13 @@ #include // Platform includes +#include #include #include #include +#include + +using namespace TARGETING; namespace PRDF { @@ -78,6 +82,47 @@ int32_t PostAnalysis( ExtensibleChip * i_mcbChip, { #define PRDF_FUNC "[p9_mcbist::PostAnalysis] " + + #ifdef __HOSTBOOT_RUNTIME + + // Maintenance IUEs in mnfg mode do not use MCAECCFIR[37], instead we stop + // background scrub on RCE ETEs with a threshold of 1 and the IUE is handled + // via command complete attention. Similar to our normal IUE handling, we + // want to trigger a port fail after the error log has been committed. See + // the comments in PostAnalysis in prdfP9Mca.C for a full explanation of why + // we trigger the port fail here + + // if in mnfg mode + if ( mfgMode() ) + { + ExtensibleChipList mcaList = getConnected( i_mcbChip, TYPE_MCA ); + // loop through all MCAs + for ( auto & mca : mcaList ) + { + uint32_t l_rc = SUCCESS; + uint32_t eccAttns; + l_rc = checkEccFirs( mca, eccAttns ); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC "checkEccFirs(0x%08x) failed", + mca->getHuid() ); + break; + } + + // if there's an IUE and we've reached threshold trigger a port fail + if ( eccAttns & MAINT_IUE ) + { + if ( SUCCESS != MemEcc::iuePortFail(mca, io_sc) ) + { + PRDF_ERR( PRDF_FUNC "iuePortFail failed: i_mcbChip=" + "0x%08x", i_mcbChip->getHuid() ); + } + } + } + } + + #endif // __HOSTBOOT_RUNTIME + return SUCCESS; // Always return SUCCESS for this plugin. #undef PRDF_FUNC @@ -136,14 +181,14 @@ int32_t CmdCompleteDd1Workaround( ExtensibleChip * i_mcbChip, #ifndef __HOSTBOOT_RUNTIME - TARGETING::TargetHandle_t mcbTrgt = i_mcbChip->getTrgt(); + TargetHandle_t mcbTrgt = i_mcbChip->getTrgt(); // This workaround should only be seen during super fast MCBIST commands, // which are only run during Memory Diagnostics. Also, the workaround only // applies to P9 Nimbus DD1.0. PRDF_ASSERT( isInMdiaMode() ); - PRDF_ASSERT( (TARGETING::MODEL_NIMBUS == getChipModel(mcbTrgt)) && - (0x10 == getChipLevel(mcbTrgt)) ); + PRDF_ASSERT( (MODEL_NIMBUS == getChipModel(mcbTrgt)) && + (0x10 == getChipLevel(mcbTrgt)) ); int32_t l_rc = SUCCESS; // For local rc handling.