diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2018-11-20 15:18:06 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-12-04 14:41:32 -0600 |
commit | 8dec4a446e3ac19822db5bbdec55e4424a3beb55 (patch) | |
tree | 57b05c8d73fe95fa66f83eacc3d43a420c235217 /src/usr/fapi2 | |
parent | d77c897c25401e1a3c4c20ab174861e2ddbb9574 (diff) | |
download | talos-hostboot-8dec4a446e3ac19822db5bbdec55e4424a3beb55.tar.gz talos-hostboot-8dec4a446e3ac19822db5bbdec55e4424a3beb55.zip |
Row Repair VPD minor improvements
Change-Id: Ib6a1a7e4da9833ea47672e235a297c8d49a2a89e
RTC: 199027
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/68973
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
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>
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Diffstat (limited to 'src/usr/fapi2')
-rw-r--r-- | src/usr/fapi2/attribute_service.C | 274 |
1 files changed, 107 insertions, 167 deletions
diff --git a/src/usr/fapi2/attribute_service.C b/src/usr/fapi2/attribute_service.C index 59383fd55..c46c4497b 100644 --- a/src/usr/fapi2/attribute_service.C +++ b/src/usr/fapi2/attribute_service.C @@ -1562,43 +1562,36 @@ fapi_try_exit: ReturnCode __isX4Dram( const Target<TARGET_TYPE_DIMM>& i_fapiDimm, bool & o_isX4Dram ) { - fapi2::ReturnCode l_rc; + o_isX4Dram = false; - do + TARGETING::ATTR_MODEL_type procType = __getChipModel(); + + // Get if drams are x4 or x8 + if ( TARGETING::MODEL_NIMBUS == procType ) { - TARGETING::ATTR_MODEL_type procType = __getChipModel(); + // Nimbus only supports x4 DRAMs + o_isX4Dram = true; + } + else if ( TARGETING::MODEL_CUMULUS == procType ) + { + // Get the MBA + Target<TARGET_TYPE_MBA> l_fapiMba = + i_fapiDimm.getParent<TARGET_TYPE_MBA>(); - // Get if drams are x4 or x8 - if ( TARGETING::MODEL_NIMBUS == procType ) - { - // Nimbus only supports x4 DRAMs - o_isX4Dram = true; - } - else if ( TARGETING::MODEL_CUMULUS == procType ) - { - // Get the MBA - Target<TARGET_TYPE_MBA> l_fapiMba = - i_fapiDimm.getParent<TARGET_TYPE_MBA>(); - TARGETING::TargetHandle_t l_mbaTrgt = nullptr; - errlHndl_t l_errl = getTargetingTarget( l_fapiMba, l_mbaTrgt ); - if ( l_errl ) - { - FAPI_ERR( "__isX4Dram: Error from " - "getTargetingTarget getting MBA." ); - l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl)); - break; - } - o_isX4Dram = ( TARGETING::CEN_EFF_DRAM_WIDTH_X4 == - l_mbaTrgt->getAttr<TARGETING::ATTR_CEN_EFF_DRAM_WIDTH>() ); - } - else - { - FAPI_ERR( "__isX4Dram: Invalid procType" ); - assert(false); - } - }while(0); + uint8_t l_dramWidth; + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_WIDTH, l_fapiMba, + l_dramWidth) ); + o_isX4Dram = ( fapi2::ENUM_ATTR_CEN_EFF_DRAM_WIDTH_X4 == l_dramWidth ); + } + else + { + // TODO RTC 201603 - generic/axone case + FAPI_ERR( "__isX4Dram: Invalid procType" ); + assert(false); + } - return l_rc; +fapi_try_exit: + return fapi2::current_err; } //****************************************************************************** // fapi2::platAttrSvc::__dramToDq function @@ -1606,25 +1599,17 @@ ReturnCode __isX4Dram( const Target<TARGET_TYPE_DIMM>& i_fapiDimm, ReturnCode __dramToDq( const Target<TARGET_TYPE_DIMM>& i_fapiDimm, uint8_t i_dram, uint8_t & o_dq ) { - fapi2::ReturnCode l_rc; + o_dq = 0; - do - { - // Convert dram pos to symbol - // Get if drams are x4 or x8 - bool l_isX4 = false; - l_rc = __isX4Dram( i_fapiDimm, l_isX4 ); - if ( l_rc ) - { - FAPI_ERR( "__dramToDq: Error from __isX4Dram." ); - break; - } - - o_dq = i_dram * ( l_isX4 ? 4 : 8 ); + // Convert dram pos to symbol + // Get if drams are x4 or x8 + bool l_isX4 = false; + FAPI_TRY( __isX4Dram(i_fapiDimm, l_isX4) ); - }while(0); + o_dq = i_dram * ( l_isX4 ? 4 : 8 ); - return l_rc; +fapi_try_exit: + return fapi2::current_err; } //****************************************************************************** @@ -1633,25 +1618,17 @@ ReturnCode __dramToDq( const Target<TARGET_TYPE_DIMM>& i_fapiDimm, ReturnCode __dqToDram( const Target<TARGET_TYPE_DIMM>& i_fapiDimm, uint8_t i_dq, uint8_t & o_dram ) { - fapi2::ReturnCode l_rc; - - do - { - // Convert symbol to dram pos - // Get if drams are x4 or x8 - bool l_isX4 = false; - l_rc = __isX4Dram( i_fapiDimm, l_isX4 ); - if ( l_rc ) - { - FAPI_ERR( "__dqToDram: Error from __isX4Dram." ); - break; - } + o_dram = 0; - o_dram = i_dq / ( l_isX4 ? 4 : 8 ); + // Convert symbol to dram pos + // Get if drams are x4 or x8 + bool l_isX4 = false; + FAPI_TRY( __isX4Dram(i_fapiDimm, l_isX4) ); - }while(0); + o_dram = i_dq / ( l_isX4 ? 4 : 8 ); - return l_rc; +fapi_try_exit: + return fapi2::current_err; } //****************************************************************************** @@ -1662,102 +1639,57 @@ ReturnCode __rowRepairTranslateDramPos( bool i_mcLogicalToDimmDq, ATTR_ROW_REPAIR_DATA_Type & io_translatedData ) { - fapi2::ReturnCode l_rc; - errlHndl_t l_errl = nullptr; wiringData l_wiringData; uint64_t l_allMnfgFlags; uint8_t l_ps = 0; - do + // Get the wiring data and port select for translation. + FAPI_TRY( __badDqBitmapGetHelperAttrs(i_fapiDimm, l_wiringData, + l_allMnfgFlags, l_ps) ); + + // Loop through each rank. + for ( uint8_t rank = 0; rank < mss::MAX_RANK_PER_DIMM; rank++ ) { - // Get targeting target for the dimm - TARGETING::TargetHandle_t l_dimm = nullptr; - l_errl = getTargetingTarget( i_fapiDimm, l_dimm ); - if ( l_errl ) - { - FAPI_ERR( "__rowRepairTranslateDramPos: Error from " - "getTargetingTarget" ); - l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl)); - break; - } + // The first 5 bits of the stored row repair are the dram position + // that needs to be translated. The next three are the slave rank. + uint8_t l_dramPosAndSrank = io_translatedData[rank][0]; + uint8_t l_dramPos = (l_dramPosAndSrank >> 3) & 0x1f; + uint8_t l_srank = l_dramPosAndSrank & 0x07; - // Get the wiring data and port select for translation. - l_rc = __badDqBitmapGetHelperAttrs( i_fapiDimm, l_wiringData, - l_allMnfgFlags, l_ps ); - if ( l_rc ) - { - FAPI_ERR( "__rowRepairTranslateDramPos: Error from " - "__badDqBitmapGetHelperAttrs." ); - break; - } + // The last bit of the row repair stores the validity bit + bool l_valid = io_translatedData[rank][mss::ROW_REPAIR_BYTE_COUNT-1] + & 0x01; - // Loop through each rank. - for ( uint8_t rank = 0; rank < mss::MAX_RANK_PER_DIMM; rank++ ) - { - // The first 5 bits of the stored row repair are the dram position - // that needs to be translated. The next three are the slave rank. - uint8_t l_dramPosAndSrank = io_translatedData[rank][0]; - uint8_t l_dramPos = (l_dramPosAndSrank >> 3) & 0x1f; - uint8_t l_srank = l_dramPosAndSrank & 0x07; - - // The last bit of the row repair stores the validity bit - bool l_valid = io_translatedData[rank][mss::ROW_REPAIR_BYTE_COUNT-1] - & 0x01; - - // If the row repair isn't valid, no need to translate anything - if ( !l_valid ) continue; - - uint8_t l_dq = 0; - l_rc = __dramToDq( i_fapiDimm, l_dramPos, l_dq ); - if ( l_rc ) - { - FAPI_ERR( "__rowRepairTranslateDramPos: Error from " - "__dramToDq" ); - break; - } + // If the row repair isn't valid, no need to translate anything + if ( !l_valid ) continue; - uint8_t l_translatedDq = 0; + uint8_t l_dq = 0; + FAPI_TRY( __dramToDq(i_fapiDimm, l_dramPos, l_dq) ); - if ( i_mcLogicalToDimmDq ) - { - l_rc = __mcLogicalToDimmDqHelper( i_fapiDimm, l_wiringData, - l_ps, l_dq, l_translatedDq ); - if ( l_rc ) - { - FAPI_ERR( "__rowRepairTranslateDramPos: Error from " - "__mcLogicalToDimmDqHelper" ); - break; - } - } - else - { - l_rc = __dimmDqToMcLogicalHelper( i_fapiDimm, l_wiringData, - l_ps, l_dq, l_translatedDq ); - if ( l_rc ) - { - FAPI_ERR( "__rowRepairTranslateDramPos: Error from " - "__dimmDqToMcLogicalHelper" ); - break; - } - } + uint8_t l_translatedDq = 0; - uint8_t l_translatedDram = 0; - l_rc = __dqToDram( i_fapiDimm, l_translatedDq, l_translatedDram ); - if ( l_rc ) - { - FAPI_ERR( "__rowRepairTranslateDramPos: Error from " - "__dqToDram" ); - break; - } + if ( i_mcLogicalToDimmDq ) + { + FAPI_TRY( __mcLogicalToDimmDqHelper(i_fapiDimm, l_wiringData, + l_ps, l_dq, l_translatedDq) ); + } + else + { + FAPI_TRY( __dimmDqToMcLogicalHelper(i_fapiDimm, l_wiringData, + l_ps, l_dq, l_translatedDq) ); + } - uint8_t l_updatedData = (l_translatedDram << 3) | l_srank; + uint8_t l_translatedDram = 0; + FAPI_TRY( __dqToDram(i_fapiDimm, l_translatedDq, l_translatedDram) ); - io_translatedData[rank][0] = l_updatedData; + uint8_t l_updatedData = (l_translatedDram << 3) | l_srank; - } - }while(0); + io_translatedData[rank][0] = l_updatedData; + } + +fapi_try_exit: + return fapi2::current_err; - return l_rc; } //****************************************************************************** @@ -1766,6 +1698,8 @@ ReturnCode __rowRepairTranslateDramPos( ReturnCode getRowRepairData( const Target<TARGET_TYPE_ALL>& i_fapiTarget, ATTR_ROW_REPAIR_DATA_Type (&o_data) ) { + FAPI_INF(">>getRowRepairData: Getting row repair data"); + fapi2::ReturnCode l_rc; errlHndl_t l_errl = nullptr; uint8_t * l_data = @@ -1815,25 +1749,27 @@ ReturnCode getRowRepairData( const Target<TARGET_TYPE_ALL>& i_fapiTarget, sizeof(ATTR_ROW_REPAIR_DATA_Type) ); // Translate the DRAM position in the row repair data - l_rc = __rowRepairTranslateDramPos( l_fapiDimm, false, - o_data ); - if ( l_rc ) - { - FAPI_ERR( "getRowRepairData: Error from " - "__rowRepairTranslateDramPos" ); - break; - } + FAPI_TRY( __rowRepairTranslateDramPos(l_fapiDimm, false, o_data ) ); } }while(0); +fapi_try_exit: + + FAPI_INF("<<getRowRepairData: Finished getting row repair data"); + if ( l_data != nullptr ) { free( l_data ); l_data = nullptr; } - return l_rc; + if ( l_rc ) + { + return l_rc; + } + + return fapi2::current_err; } //****************************************************************************** @@ -1842,6 +1778,8 @@ ReturnCode getRowRepairData( const Target<TARGET_TYPE_ALL>& i_fapiTarget, ReturnCode setRowRepairData( const Target<TARGET_TYPE_ALL>& i_fapiTarget, ATTR_ROW_REPAIR_DATA_Type (&i_data) ) { + FAPI_INF(">>setRowRepairData: Setting row repair data"); + fapi2::ReturnCode l_rc; errlHndl_t l_errl = nullptr; uint8_t * l_data = @@ -1885,15 +1823,8 @@ ReturnCode setRowRepairData( const Target<TARGET_TYPE_ALL>& i_fapiTarget, // Translate the input data ATTR_ROW_REPAIR_DATA_Type l_translatedData; memcpy( &l_translatedData, i_data, sizeof(ATTR_ROW_REPAIR_DATA_Type) ); - l_rc = __rowRepairTranslateDramPos( l_fapiDimm, true, - l_translatedData ); - if ( l_rc ) - { - FAPI_ERR( "setRowRepairData: Error from " - "__rowRepairTranslateDramPos" ); - break; - } - + FAPI_TRY( __rowRepairTranslateDramPos(l_fapiDimm, true, + l_translatedData) ); // Update the row repair data memcpy( &l_spdData.iv_rowRepairData, l_translatedData, sizeof(ATTR_ROW_REPAIR_DATA_Type) ); @@ -1904,20 +1835,29 @@ ReturnCode setRowRepairData( const Target<TARGET_TYPE_ALL>& i_fapiTarget, if ( l_errl ) { FAPI_ERR( "setRowRepairData: Failed to call deviceWrite to set " - "l_data." ); + "l_spdData." ); l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl)); break; } }while(0); +fapi_try_exit: + + FAPI_INF("<<setRowRepairData: Finished setting row repair data"); + if ( l_data != nullptr ) { free( l_data ); l_data = nullptr; } - return l_rc; + if ( l_rc ) + { + return l_rc; + } + + return fapi2::current_err; } //****************************************************************************** |