diff options
author | Corey Swenson <cswenson@us.ibm.com> | 2015-04-14 13:47:12 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-04-24 10:57:34 -0500 |
commit | af81c1dae90203d31871ee4d34aedfe6cd5392e1 (patch) | |
tree | 612c2771debb000119339a328d3aeecdc65c0fa1 /src/usr/hwpf/hwp | |
parent | c17c45d7e8d3a09c49ab882a361e7e7f223b1301 (diff) | |
download | talos-hostboot-af81c1dae90203d31871ee4d34aedfe6cd5392e1.tar.gz talos-hostboot-af81c1dae90203d31871ee4d34aedfe6cd5392e1.zip |
Fix for Bad DQ Bitmap spare byte triggering false DRAM repairs
Change-Id: I6b443fc7c05d1fda1f97d180e317ac8a93eb77ad
RTC: 125477
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/17106
Tested-by: Jenkins Server
Reviewed-by: Michael Baiocchi <baiocchi@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp')
-rw-r--r-- | src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C | 122 |
1 files changed, 99 insertions, 23 deletions
diff --git a/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C b/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C index 4c61ab897..98f9bf92e 100644 --- a/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C +++ b/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -22,7 +22,7 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: dimmBadDqBitmapAccessHwp.C,v 1.15 2014/03/27 20:55:12 whs Exp $ +// $Id: dimmBadDqBitmapAccessHwp.C,v 1.16 2015/04/22 20:09:16 cswenson Exp $ /** * @file dimmBadDqBitmapAccessHwp.C * @@ -53,6 +53,7 @@ * whs 02/24/2014 Capture bad DQs as FFDC * in mnfg error logs * whs 03/27/2014 fix current FFDC bit map + * cswenson 04/22/2014 fix spare byte translate */ #include <dimmBadDqBitmapAccessHwp.H> @@ -78,23 +79,19 @@ extern "C" { /** - * @brief Called by dimmBadDqBitmapAccessHwp() to query ATTR_EFF_DIMM_SPARE - * and set bits for unconnected spare DRAM in caller's data. + * @brief Returns bits for unconnected spare DRAM. * * * @param[in] i_mba Reference to MBA Target. * @param[in] i_dimm Reference to DIMM Target. - * @param[o] o_data Reference to Bad DQ Bitmap set by - * the caller. Only the SPARE_DRAM_DQ_BYTE_NUMBER_INDEX - * byte is modified by this function. + * @param[o] o_spareByte Reference to the spare byte returned to caller. * * @return ReturnCode */ - -fapi::ReturnCode dimmUpdateDqBitmapSpareByte( +fapi::ReturnCode dimmGetDqBitmapSpareByte( const fapi::Target & i_mba, const fapi::Target & i_dimm, - uint8_t (&o_data)[DIMM_DQ_MAX_DIMM_RANKS][DIMM_DQ_RANK_BITMAP_SIZE]) + uint8_t (&o_spareByte)[DIMM_DQ_MAX_DIMM_RANKS]) { fapi::ReturnCode l_rc; @@ -108,7 +105,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte( l_rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_SPARE, &i_mba, l_mbaSpare); if (l_rc) { - FAPI_ERR("dimmUpdateDqBitmapSpareByte: " + FAPI_ERR("dimmGetDqBitmapSpareByte: " "Error getting DRAM Spare data"); break; } @@ -117,7 +114,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte( l_rc = FAPI_ATTR_GET(ATTR_MBA_PORT, &i_dimm, l_mbaPort); if (l_rc) { - FAPI_ERR("dimmUpdateDqBitmapSpareByte: " + FAPI_ERR("dimmGetDqBitmapSpareByte: " "Error getting MBA port number"); break; } @@ -126,7 +123,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte( l_rc = FAPI_ATTR_GET(ATTR_MBA_DIMM, &i_dimm, l_dimm); if (l_rc) { - FAPI_ERR("dimmUpdateDqBitmapSpareByte: " + FAPI_ERR("dimmGetDqBitmapSpareByte: " "Error getting dimm number"); break; } @@ -139,20 +136,21 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte( case fapi::ENUM_ATTR_VPD_DIMM_SPARE_NO_SPARE: // Set DQ bits reflecting unconnected // spare DRAM in caller's data - o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] = 0xFF; + o_spareByte[i] = 0xFF; break; case fapi::ENUM_ATTR_VPD_DIMM_SPARE_LOW_NIBBLE: - o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= 0x0F; + o_spareByte[i] = 0x0F; break; case fapi::ENUM_ATTR_VPD_DIMM_SPARE_HIGH_NIBBLE: - o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= 0xF0; + o_spareByte[i] = 0xF0; break; // As erroneous value will not be encountered. case fapi::ENUM_ATTR_VPD_DIMM_SPARE_FULL_BYTE: default: + o_spareByte[i] = 0x0; break; } } @@ -161,6 +159,45 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte( } /** + * @brief Called by dimmBadDqBitmapAccessHwp() to query ATTR_EFF_DIMM_SPARE + * and set bits for unconnected spare DRAM in caller's data. + * + * + * @param[in] i_mba Reference to MBA Target. + * @param[in] i_dimm Reference to DIMM Target. + * @param[o] o_data Reference to Bad DQ Bitmap set by + * the caller. Only the SPARE_DRAM_DQ_BYTE_NUMBER_INDEX + * byte is modified by this function. + * + * @return ReturnCode + */ + +fapi::ReturnCode dimmUpdateDqBitmapSpareByte( + const fapi::Target & i_mba, + const fapi::Target & i_dimm, + uint8_t (&o_data)[DIMM_DQ_MAX_DIMM_RANKS][DIMM_DQ_RANK_BITMAP_SIZE]) +{ + fapi::ReturnCode l_rc; + + uint8_t spareByte[DIMM_DQ_MAX_DIMM_RANKS]; + memset(spareByte, 0, sizeof(spareByte)); + + l_rc = dimmGetDqBitmapSpareByte(i_mba,i_dimm,spareByte); + if (l_rc) + { + FAPI_ERR("dimmUpdateDqBitmapSpareByte: " + "Error getting spare byte"); + return l_rc; + } + + for (uint32_t i=0; i<DIMM_DQ_MAX_DIMM_RANKS; i++) + { + o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= spareByte[i]; + } + return l_rc; +} + +/** * @brief Called by dimmBadDqBitmapAccessHwp() to query * ATTR_SPD_MODULE_MEMORY_BUS_WIDTH in order to determine * ECC support for this DIMM. This function will set @@ -472,8 +509,13 @@ fapi::ReturnCode dimmBadDqBitmapSet( uint8_t (l_prev_data)[DIMM_DQ_MAX_DIMM_RANKS] [DIMM_DQ_RANK_BITMAP_SIZE]; bool badDQSet = false; - dimmBadDqBitmapGet(i_mba, i_dimm, l_prev_data, i_wiringData, - i_allMnfgFlags); + l_rc = dimmBadDqBitmapGet(i_mba, i_dimm, l_prev_data, i_wiringData, + i_allMnfgFlags); + if (l_rc) + { + FAPI_ERR("dimmBadDqBitmapAccessHwp: Error getting DQ bitmap"); + return l_rc; + } // Check if Bad DQ bit set for (uint8_t i = 0; i < DIMM_DQ_MAX_DIMM_RANKS; i++) @@ -654,6 +696,18 @@ fapi::ReturnCode dimmBadDqBitmapSet( l_pSpdData->iv_reserved3 = 0; memset(l_pSpdData->iv_bitmaps, 0, sizeof(l_pSpdData->iv_bitmaps)); + // Get the spare byte + uint8_t spareByte[DIMM_DQ_MAX_DIMM_RANKS]; + memset(spareByte, 0, sizeof(spareByte)); + + l_rc = dimmGetDqBitmapSpareByte(i_mba,i_dimm,spareByte); + if (l_rc) + { + FAPI_ERR("dimmBadDqBitmapAccessHwp: " + "Error getting spare byte"); + break; + } + // Translate bitmap from Centaur DQ to DIMM DQ point of view for // each rank for (uint8_t i = 0; i < DIMM_DQ_MAX_DIMM_RANKS; i++) @@ -661,6 +715,16 @@ fapi::ReturnCode dimmBadDqBitmapSet( // Iterate through all the DQ bits in the rank for (uint8_t j = 0; j < DIMM_DQ_NUM_DQS; j++) { + if ((j/8) == SPARE_DRAM_DQ_BYTE_NUMBER_INDEX) + { + // The spareByte can be one of: 0x00 0x0F 0xF0 0xFF + // If a bit is set, then that spare is unconnected + // so continue to the next num_dqs, do not translate + if (spareByte[i] & (0x80 >> (j % 8))) + { + continue; + } + } if ((i_data[i][j/8]) & (0x80 >> (j % 8))) { // Centaur DQ bit set in callers data. @@ -747,13 +811,25 @@ fapi::ReturnCode dimmBadDqBitmapAccessHwp( if (i_get) { - dimmBadDqBitmapGet(i_mba, i_dimm, io_data, l_wiringData, - l_allMnfgFlags); + l_rc = dimmBadDqBitmapGet(i_mba, i_dimm, io_data, l_wiringData, + l_allMnfgFlags); + if (l_rc) + { + FAPI_ERR("dimmBadDqBitmapAccessHwp: " + "Error getting DQ bitmap"); + break; + } } else { - dimmBadDqBitmapSet(i_mba, i_dimm, io_data, l_wiringData, - l_allMnfgFlags); + l_rc = dimmBadDqBitmapSet(i_mba, i_dimm, io_data, l_wiringData, + l_allMnfgFlags); + if (l_rc) + { + FAPI_ERR("dimmBadDqBitmapAccessHwp: " + "Error setting DQ bitmap"); + break; + } } }while(0); @@ -763,4 +839,4 @@ fapi::ReturnCode dimmBadDqBitmapAccessHwp( return l_rc; } -} +}
\ No newline at end of file |