summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp
diff options
context:
space:
mode:
authorCorey Swenson <cswenson@us.ibm.com>2015-04-14 13:47:12 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-04-24 10:57:34 -0500
commitaf81c1dae90203d31871ee4d34aedfe6cd5392e1 (patch)
tree612c2771debb000119339a328d3aeecdc65c0fa1 /src/usr/hwpf/hwp
parentc17c45d7e8d3a09c49ab882a361e7e7f223b1301 (diff)
downloadtalos-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.C122
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
OpenPOWER on IntegriCloud