blob: 02202c3fd305ae9e8677322479dd188878fe978e [file] [log] [blame]
Mike Baiocchi6adfe3c2015-04-23 17:25:14 -05001From 3b397cfb77ca5315f6403874ad10534e5f42f8a6 Mon Sep 17 00:00:00 2001
2From: Corey Swenson <cswenson@us.ibm.com>
3Date: Tue, 14 Apr 2015 13:47:12 -0500
4Subject: [PATCH 1/2] Fix for Bad DQ Bitmap spare byte triggering false DRAM
5 repairs
6
7Change-Id: I6b443fc7c05d1fda1f97d180e317ac8a93eb77ad
8RTC: 125477
9---
10 src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C | 122 ++++++++++++++++++++++------
11 1 file changed, 99 insertions(+), 23 deletions(-)
12
13diff --git a/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C b/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C
14index 4c61ab8..98f9bf9 100644
15--- a/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C
16+++ b/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C
17@@ -5,7 +5,7 @@
18 /* */
19 /* OpenPOWER HostBoot Project */
20 /* */
21-/* Contributors Listed Below - COPYRIGHT 2012,2014 */
22+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
23 /* [+] International Business Machines Corp. */
24 /* */
25 /* */
26@@ -22,7 +22,7 @@
27 /* permissions and limitations under the License. */
28 /* */
29 /* IBM_PROLOG_END_TAG */
30-// $Id: dimmBadDqBitmapAccessHwp.C,v 1.15 2014/03/27 20:55:12 whs Exp $
31+// $Id: dimmBadDqBitmapAccessHwp.C,v 1.16 2015/04/22 20:09:16 cswenson Exp $
32 /**
33 * @file dimmBadDqBitmapAccessHwp.C
34 *
35@@ -53,6 +53,7 @@
36 * whs 02/24/2014 Capture bad DQs as FFDC
37 * in mnfg error logs
38 * whs 03/27/2014 fix current FFDC bit map
39+ * cswenson 04/22/2014 fix spare byte translate
40 */
41
42 #include <dimmBadDqBitmapAccessHwp.H>
43@@ -78,23 +79,19 @@ extern "C"
44 {
45
46 /**
47- * @brief Called by dimmBadDqBitmapAccessHwp() to query ATTR_EFF_DIMM_SPARE
48- * and set bits for unconnected spare DRAM in caller's data.
49+ * @brief Returns bits for unconnected spare DRAM.
50 *
51 *
52 * @param[in] i_mba Reference to MBA Target.
53 * @param[in] i_dimm Reference to DIMM Target.
54- * @param[o] o_data Reference to Bad DQ Bitmap set by
55- * the caller. Only the SPARE_DRAM_DQ_BYTE_NUMBER_INDEX
56- * byte is modified by this function.
57+ * @param[o] o_spareByte Reference to the spare byte returned to caller.
58 *
59 * @return ReturnCode
60 */
61-
62-fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
63+fapi::ReturnCode dimmGetDqBitmapSpareByte(
64 const fapi::Target & i_mba,
65 const fapi::Target & i_dimm,
66- uint8_t (&o_data)[DIMM_DQ_MAX_DIMM_RANKS][DIMM_DQ_RANK_BITMAP_SIZE])
67+ uint8_t (&o_spareByte)[DIMM_DQ_MAX_DIMM_RANKS])
68 {
69 fapi::ReturnCode l_rc;
70
71@@ -108,7 +105,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
72 l_rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_SPARE, &i_mba, l_mbaSpare);
73 if (l_rc)
74 {
75- FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
76+ FAPI_ERR("dimmGetDqBitmapSpareByte: "
77 "Error getting DRAM Spare data");
78 break;
79 }
80@@ -117,7 +114,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
81 l_rc = FAPI_ATTR_GET(ATTR_MBA_PORT, &i_dimm, l_mbaPort);
82 if (l_rc)
83 {
84- FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
85+ FAPI_ERR("dimmGetDqBitmapSpareByte: "
86 "Error getting MBA port number");
87 break;
88 }
89@@ -126,7 +123,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
90 l_rc = FAPI_ATTR_GET(ATTR_MBA_DIMM, &i_dimm, l_dimm);
91 if (l_rc)
92 {
93- FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
94+ FAPI_ERR("dimmGetDqBitmapSpareByte: "
95 "Error getting dimm number");
96 break;
97 }
98@@ -139,20 +136,21 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
99 case fapi::ENUM_ATTR_VPD_DIMM_SPARE_NO_SPARE:
100 // Set DQ bits reflecting unconnected
101 // spare DRAM in caller's data
102- o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] = 0xFF;
103+ o_spareByte[i] = 0xFF;
104 break;
105
106 case fapi::ENUM_ATTR_VPD_DIMM_SPARE_LOW_NIBBLE:
107- o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= 0x0F;
108+ o_spareByte[i] = 0x0F;
109 break;
110
111 case fapi::ENUM_ATTR_VPD_DIMM_SPARE_HIGH_NIBBLE:
112- o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= 0xF0;
113+ o_spareByte[i] = 0xF0;
114 break;
115
116 // As erroneous value will not be encountered.
117 case fapi::ENUM_ATTR_VPD_DIMM_SPARE_FULL_BYTE:
118 default:
119+ o_spareByte[i] = 0x0;
120 break;
121 }
122 }
123@@ -161,6 +159,45 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
124 }
125
126 /**
127+ * @brief Called by dimmBadDqBitmapAccessHwp() to query ATTR_EFF_DIMM_SPARE
128+ * and set bits for unconnected spare DRAM in caller's data.
129+ *
130+ *
131+ * @param[in] i_mba Reference to MBA Target.
132+ * @param[in] i_dimm Reference to DIMM Target.
133+ * @param[o] o_data Reference to Bad DQ Bitmap set by
134+ * the caller. Only the SPARE_DRAM_DQ_BYTE_NUMBER_INDEX
135+ * byte is modified by this function.
136+ *
137+ * @return ReturnCode
138+ */
139+
140+fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
141+ const fapi::Target & i_mba,
142+ const fapi::Target & i_dimm,
143+ uint8_t (&o_data)[DIMM_DQ_MAX_DIMM_RANKS][DIMM_DQ_RANK_BITMAP_SIZE])
144+{
145+ fapi::ReturnCode l_rc;
146+
147+ uint8_t spareByte[DIMM_DQ_MAX_DIMM_RANKS];
148+ memset(spareByte, 0, sizeof(spareByte));
149+
150+ l_rc = dimmGetDqBitmapSpareByte(i_mba,i_dimm,spareByte);
151+ if (l_rc)
152+ {
153+ FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
154+ "Error getting spare byte");
155+ return l_rc;
156+ }
157+
158+ for (uint32_t i=0; i<DIMM_DQ_MAX_DIMM_RANKS; i++)
159+ {
160+ o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= spareByte[i];
161+ }
162+ return l_rc;
163+}
164+
165+/**
166 * @brief Called by dimmBadDqBitmapAccessHwp() to query
167 * ATTR_SPD_MODULE_MEMORY_BUS_WIDTH in order to determine
168 * ECC support for this DIMM. This function will set
169@@ -472,8 +509,13 @@ fapi::ReturnCode dimmBadDqBitmapSet(
170 uint8_t (l_prev_data)[DIMM_DQ_MAX_DIMM_RANKS]
171 [DIMM_DQ_RANK_BITMAP_SIZE];
172 bool badDQSet = false;
173- dimmBadDqBitmapGet(i_mba, i_dimm, l_prev_data, i_wiringData,
174- i_allMnfgFlags);
175+ l_rc = dimmBadDqBitmapGet(i_mba, i_dimm, l_prev_data, i_wiringData,
176+ i_allMnfgFlags);
177+ if (l_rc)
178+ {
179+ FAPI_ERR("dimmBadDqBitmapAccessHwp: Error getting DQ bitmap");
180+ return l_rc;
181+ }
182
183 // Check if Bad DQ bit set
184 for (uint8_t i = 0; i < DIMM_DQ_MAX_DIMM_RANKS; i++)
185@@ -654,6 +696,18 @@ fapi::ReturnCode dimmBadDqBitmapSet(
186 l_pSpdData->iv_reserved3 = 0;
187 memset(l_pSpdData->iv_bitmaps, 0, sizeof(l_pSpdData->iv_bitmaps));
188
189+ // Get the spare byte
190+ uint8_t spareByte[DIMM_DQ_MAX_DIMM_RANKS];
191+ memset(spareByte, 0, sizeof(spareByte));
192+
193+ l_rc = dimmGetDqBitmapSpareByte(i_mba,i_dimm,spareByte);
194+ if (l_rc)
195+ {
196+ FAPI_ERR("dimmBadDqBitmapAccessHwp: "
197+ "Error getting spare byte");
198+ break;
199+ }
200+
201 // Translate bitmap from Centaur DQ to DIMM DQ point of view for
202 // each rank
203 for (uint8_t i = 0; i < DIMM_DQ_MAX_DIMM_RANKS; i++)
204@@ -661,6 +715,16 @@ fapi::ReturnCode dimmBadDqBitmapSet(
205 // Iterate through all the DQ bits in the rank
206 for (uint8_t j = 0; j < DIMM_DQ_NUM_DQS; j++)
207 {
208+ if ((j/8) == SPARE_DRAM_DQ_BYTE_NUMBER_INDEX)
209+ {
210+ // The spareByte can be one of: 0x00 0x0F 0xF0 0xFF
211+ // If a bit is set, then that spare is unconnected
212+ // so continue to the next num_dqs, do not translate
213+ if (spareByte[i] & (0x80 >> (j % 8)))
214+ {
215+ continue;
216+ }
217+ }
218 if ((i_data[i][j/8]) & (0x80 >> (j % 8)))
219 {
220 // Centaur DQ bit set in callers data.
221@@ -747,13 +811,25 @@ fapi::ReturnCode dimmBadDqBitmapAccessHwp(
222
223 if (i_get)
224 {
225- dimmBadDqBitmapGet(i_mba, i_dimm, io_data, l_wiringData,
226- l_allMnfgFlags);
227+ l_rc = dimmBadDqBitmapGet(i_mba, i_dimm, io_data, l_wiringData,
228+ l_allMnfgFlags);
229+ if (l_rc)
230+ {
231+ FAPI_ERR("dimmBadDqBitmapAccessHwp: "
232+ "Error getting DQ bitmap");
233+ break;
234+ }
235 }
236 else
237 {
238- dimmBadDqBitmapSet(i_mba, i_dimm, io_data, l_wiringData,
239- l_allMnfgFlags);
240+ l_rc = dimmBadDqBitmapSet(i_mba, i_dimm, io_data, l_wiringData,
241+ l_allMnfgFlags);
242+ if (l_rc)
243+ {
244+ FAPI_ERR("dimmBadDqBitmapAccessHwp: "
245+ "Error setting DQ bitmap");
246+ break;
247+ }
248 }
249
250 }while(0);
251@@ -763,4 +839,4 @@ fapi::ReturnCode dimmBadDqBitmapAccessHwp(
252 return l_rc;
253 }
254
255-}
256+}
257\ No newline at end of file
258--
2591.8.2.2
260