diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2018-02-09 13:15:41 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-02-16 12:29:59 -0500 |
commit | 21d980956449cb113ff1f12f46b26563ae1d146a (patch) | |
tree | d200c6146016f5eefbd0e0b6eca2627adc11122b /src/usr/fapi2 | |
parent | f81091a35f5d113f8f03a569c4d553a1a6d50e44 (diff) | |
download | talos-hostboot-21d980956449cb113ff1f12f46b26563ae1d146a.tar.gz talos-hostboot-21d980956449cb113ff1f12f46b26563ae1d146a.zip |
Reenable reconfig loop for new bad dq data
Change-Id: I47ae857062ffe7861d8b130b29dfc7b6baa4249e
CQ: SW417224
Backport: release-fips910
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/53944
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-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>
Reviewed-by: Benjamin J. Weisenbeck <bweisenb@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 | 80 |
1 files changed, 48 insertions, 32 deletions
diff --git a/src/usr/fapi2/attribute_service.C b/src/usr/fapi2/attribute_service.C index e6138f706..71bce3e8e 100644 --- a/src/usr/fapi2/attribute_service.C +++ b/src/usr/fapi2/attribute_service.C @@ -1271,6 +1271,27 @@ ReturnCode fapiAttrGetBadDqBitmap( (l_spdData.iv_version != DIMM_BAD_DQ_VERSION) ) { FAPI_INF( "fapiAttrGetBadDqBitmap: SPD DQ not initialized." ); + + // We still set the ECC and spare bytes in the output data to + // avoid issues in the setter when SPD DQ is not initialized. + // Set bits for any unconnected DQs. + // First, check ECC. + l_errl = __dimmUpdateDqBitmapEccByte( l_dimmTarget, o_data ); + if ( l_errl ) + { + FAPI_ERR( "fapiAttrGetBadDqBitmap: Error getting ECC data" ); + l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl)); + break; + } + + // Check spare DRAM. + l_rc = __dimmUpdateDqBitmapSpareByte( l_dimmTarget, o_data ); + if ( l_rc ) + { + FAPI_ERR( "fapiAttrGetBadDqBitmap: Error getting spare DRAM " + "data" ); + break; + } } else { @@ -1386,6 +1407,23 @@ ReturnCode fapiAttrSetBadDqBitmap( // Flag to set if the discrepancies are found bool mfgModeBadBitsPresent = false; + uint8_t l_tmpData[mss::MAX_RANK_PER_DIMM][mss::BAD_DQ_BYTE_COUNT]; + memcpy( &l_tmpData, &i_data, sizeof(i_data) ); + l_errl = __dimmUpdateDqBitmapEccByte( l_dimmTarget, l_tmpData ); + if ( l_errl ) + { + FAPI_ERR( "fapiAttrSetBadDqBitmap: Error getting ECC data." ); + l_rc.setPlatDataPtr(reinterpret_cast<void *>(l_errl)); + break; + } + + l_rc = __dimmUpdateDqBitmapSpareByte( l_dimmTarget, l_tmpData ); + if ( l_rc ) + { + FAPI_ERR("fapiAttrSetBadDqBitmap: Error getting spare DRAM data."); + break; + } + // Check if Bad DQ bit set // Loop through all ranks for ( uint8_t i = 0; i < mss::MAX_RANK_PER_DIMM; i++ ) @@ -1393,7 +1431,7 @@ ReturnCode fapiAttrSetBadDqBitmap( // Loop through all DQs for (uint8_t j = 0; j < mss::BAD_DQ_BYTE_COUNT; j++) { - if ( i_data[i][j] != l_prev_data[i][j] ) + if ( l_tmpData[i][j] != l_prev_data[i][j] ) { badDqSet = true; break; @@ -1422,18 +1460,15 @@ ReturnCode fapiAttrSetBadDqBitmap( l_reconfigAttr |= fapi2::ENUM_ATTR_RECONFIGURE_LOOP_BAD_DQ_BIT_SET; #ifndef CONFIG_VPD_GETMACRO_USE_EFF_ATTR - // TODO RTC 164707 - // Restore DRAM Repairs not finished yet so commenting out the - // reconfig loop for now. - //l_rc = FAPI_ATTR_SET( fapi2::ATTR_RECONFIGURE_LOOP, - // fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), - // l_reconfigAttr ); - //if ( l_rc ) - //{ - // FAPI_ERR( "fapiAttrSetBadDqBitmap: Error setting " - // "ATTR_RECONFIGURE_LOOP" ); - // break; - //} + l_rc = FAPI_ATTR_SET( fapi2::ATTR_RECONFIGURE_LOOP, + fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), + l_reconfigAttr ); + if ( l_rc ) + { + FAPI_ERR( "fapiAttrSetBadDqBitmap: Error setting " + "ATTR_RECONFIGURE_LOOP" ); + break; + } #endif } @@ -1445,25 +1480,6 @@ ReturnCode fapiAttrSetBadDqBitmap( uint8_t l_eccSpareBitmap[mss::MAX_RANK_PER_DIMM] [mss::BAD_DQ_BYTE_COUNT]; - uint8_t l_tmpData[mss::MAX_RANK_PER_DIMM][mss::BAD_DQ_BYTE_COUNT]; - memcpy( &l_tmpData, &i_data, sizeof(i_data) ); - - l_errl = __dimmUpdateDqBitmapEccByte( l_dimmTarget, l_tmpData ); - if ( l_errl ) - { - FAPI_ERR( "fapiAttrSetBadDqBitmap: Error getting ECC data." ); - l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl)); - break; - } - - l_rc = __dimmUpdateDqBitmapSpareByte( l_dimmTarget, l_tmpData ); - if ( l_rc ) - { - FAPI_ERR( "fapiAttrSetBadDqBitmap: Error getting spare DRAM " - "data." ); - break; - } - l_rc = __compareEccAndSpare( l_dimmTarget, mfgModeBadBitsPresent, l_tmpData, l_eccSpareBitmap ); if ( l_rc ) |