blob: a7ce28d7b3715d338b2857ba8e57b9e678732289 [file] [log] [blame]
Dan Crowell51b199d2018-11-29 10:09:57 -06001From 0cd588d30268958d8e4dc06e72c07a0cfdfc534a Mon Sep 17 00:00:00 2001
Stewart Smitha55c02c2018-11-27 11:36:05 +11002From: Stewart Smith <stewart@linux.ibm.com>
3Date: Thu, 22 Nov 2018 10:51:50 +1100
4Subject: [PATCH] Revert "Fixes LRDIMM eff_config bugs"
5
6This reverts commit 40a34c94a981ebfe9e1ff95263663cda0cbaaa42.
7
8This broke p9dsu platforms with 16GB DIMMs.
9
10We'd die in ISTEP 15.1 and come back with callouts like this:
11
1210.12460|ERRL|Dumping errors reported prior to registration
1310.12793|================================================
1410.12794|Error reported by prdf (0xE500) PLID 0x90000005
1510.12794| PRD Signature : 0x240004 0x18A0000E
1610.15353| Signature Description : pu.mca:k0:n0:s0:p00:c4 (MCAECCFIR[14]) \
17 Mainline read UE
1810.17354| UserData1 : 0x0024000400000103
1910.17354| UserData2 : 0x18a0000e88047008
2010.17354|------------------------------------------------
2110.18357| Callout type : Hardware Callout
2210.20356| CPU id : 2
2310.22360| Target : Physical:/Sys0/Node0/DIMM5
2410.22361| Deconfig State : NO_DECONFIG
2510.22361| GARD Error Type : GARD_Fatal
2610.22362| Priority : SRCI_PRIORITY_MED
2710.22362|------------------------------------------------
2810.22362|
2910.22363|------------------------------------------------
3010.22363| System checkstop occurred during IPL on previous boot
3110.22364|------------------------------------------------
3210.22364|
3310.22364|------------------------------------------------
3410.22365| Hostboot Build ID: hostboot-40a34c9-p36fbe89/hbicore.bin
3510.22365|================================================
36
37*IF* you were lucky enough to IPL, you'd have a bunch of GARD records
38for DIMMs that previously worked perfectly, as well as some runtime
39memory errors:
40
41root@bstn004p1:~# opal-gard list
42 ID | Error | Type | Path
43---------------------------------------------------------
44 00000001 | 90000014 | Fatal | /Sys0/Node0/DIMM1
45 00000002 | 90000019 | Fatal | /Sys0/Node0/DIMM7
46 00000003 | 9000001e | Predictive | /Sys0/Node0/DIMM5
47 00000004 | 90000025 | Predictive | /Sys0/Node0/DIMM3
48=========================================================
49
50[ 16.165513] Memory failure: 0x0: reserved kernel page still referenced by 1 users
51[ 16.166347] Memory failure: 0x0: recovery action for reserved kernel page: Failed
52[ 17.268941] Memory failure: 0x0: already hardware poisoned
53[ 17.269908] Memory failure: 0x1: reserved kernel page still referenced by 1 users
54[ 17.270776] Memory failure: 0x1: recovery action for reserved kernel page: Failed
55
56and from opal-prd:
57
58Nov 20 00:44:13 bstn004p1 opal-prd[2894]:
59MEM: Memory error: range 0000000000000800-0000000fffffeb40, type: uncorrectable
60MEM: Failed to offline memory! page addr: 0000000000000800 type: 1: \
61 Device or resource busy
62MEM: Memory error: range 0000000000000800-0000000fffffeb40, type: uncorrectable
63MEM: Failed to offline memory! page addr: 0000000000010800 type: 1: \
64 Device or resource busy
65
66Out of the three p9dsu systems I tried, the ones with 16GB DIMMs failed,
67and the ones with 32GB DIMMs did not. FRU snippets:
68
69FRU Device Description : P1-DIMMA1 (ID 12)
70 Product Manufacturer : Samsung Electronics
71 Product Name : DDR4-2666 32GiB 64-bit ECC RDIMM
72 Product Part Number : M393A4K40BB2-CTD
73 Product Version : 00
74 Product Serial : 34ee7214
75
76FRU Device Description : P1-DIMMA1 (ID 12)
77 Product Manufacturer : Samsung Electronics
78 Product Name : DDR4-2666 16GiB 64-bit ECC RDIMM
79 Product Part Number : M393A2K40BB2-CTD
80 Product Version : 00
81 Product Serial : 3446d454
82
83FRU Device Description : P1-DIMMA1 (ID 12)
84Product Manufacturer : Samsung Electronics
85Product Name : DDR4-2666 16GiB 64-bit ECC RDIMM
86Product Part Number : M393A2K40BB2-CTD
87Product Version : 00
88Product Serial : 3569b648
89
90So, for the moment, to not break existing hardware, revert the commit.
91
92Change-Id: Ib35da530c301e2c57e8bd495a4281fc750150f5d
93Fixes: https://github.com/open-power/hostboot/issues/150
94Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
95---
Dan Crowell51b199d2018-11-29 10:09:57 -060096 .../p9/procedures/hwp/initfiles/p9n_mca_scom.C | 136 ++---
97 .../procedures/hwp/memory/lib/dimm/bcw_load_ddr4.C | 16 +-
98 .../hwp/memory/lib/dimm/ddr4/data_buffer_ddr4.H | 9 +-
99 .../p9/procedures/hwp/memory/lib/dimm/ddr4/mrs01.C | 2 +-
100 .../p9/procedures/hwp/memory/lib/dimm/eff_dimm.C | 617 ++++-----------------
101 .../p9/procedures/hwp/memory/lib/dimm/eff_dimm.H | 212 +------
102 .../p9/procedures/hwp/memory/lib/phy/ddr_phy.C | 6 +-
103 .../procedures/hwp/memory/lib/shared/mss_const.H | 1 -
104 .../p9/procedures/hwp/memory/p9_mss_eff_config.C | 20 -
105 .../xml/error_info/p9_memory_mss_eff_config.xml | 18 -
106 10 files changed, 172 insertions(+), 865 deletions(-)
Stewart Smitha55c02c2018-11-27 11:36:05 +1100107 mode change 100755 => 100644 src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C
108 mode change 100755 => 100644 src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C
109
110diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9n_mca_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9n_mca_scom.C
Dan Crowell51b199d2018-11-29 10:09:57 -0600111index edce5e2..7b010b1 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +1100112--- a/src/import/chips/p9/procedures/hwp/initfiles/p9n_mca_scom.C
113+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9n_mca_scom.C
114@@ -183,10 +183,10 @@ fapi2::ReturnCode p9n_mca_scom(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& TGT0
115 literal_0x0) | l_TGT2_ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM[l_def_PORT_INDEX][literal_1]);
116 uint64_t l_def_SLOT1_DRAM_STACK_HEIGHT = (l_TGT2_ATTR_EFF_NUM_RANKS_PER_DIMM[l_def_PORT_INDEX][literal_1] /
117 l_def_SLOT1_DENOMINATOR);
118- fapi2::ATTR_MSS_EFF_ODT_RD_Type l_TGT2_ATTR_MSS_EFF_ODT_RD;
119- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MSS_EFF_ODT_RD, TGT2, l_TGT2_ATTR_MSS_EFF_ODT_RD));
120- fapi2::ATTR_MSS_EFF_ODT_WR_Type l_TGT2_ATTR_MSS_EFF_ODT_WR;
121- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MSS_EFF_ODT_WR, TGT2, l_TGT2_ATTR_MSS_EFF_ODT_WR));
122+ fapi2::ATTR_MSS_VPD_MT_ODT_RD_Type l_TGT2_ATTR_MSS_VPD_MT_ODT_RD;
123+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MSS_VPD_MT_ODT_RD, TGT2, l_TGT2_ATTR_MSS_VPD_MT_ODT_RD));
124+ fapi2::ATTR_MSS_VPD_MT_ODT_WR_Type l_TGT2_ATTR_MSS_VPD_MT_ODT_WR;
125+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MSS_VPD_MT_ODT_WR, TGT2, l_TGT2_ATTR_MSS_VPD_MT_ODT_WR));
126 fapi2::ATTR_EFF_DRAM_TREFI_Type l_TGT2_ATTR_EFF_DRAM_TREFI;
127 FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EFF_DRAM_TREFI, TGT2, l_TGT2_ATTR_EFF_DRAM_TREFI));
128 uint64_t l_def_REFRESH_INTERVAL = (l_TGT2_ATTR_EFF_DRAM_TREFI[l_def_PORT_INDEX] / (literal_8 * l_def_NUM_RANKS));
129@@ -712,133 +712,133 @@ fapi2::ReturnCode p9n_mca_scom(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& TGT0
130 {
131 FAPI_TRY(fapi2::getScom( TGT0, 0x7010915ull, l_scom_buffer ));
132
133- l_scom_buffer.insert<0, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
134+ l_scom_buffer.insert<0, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
135 literal_7) );
136- l_scom_buffer.insert<1, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
137+ l_scom_buffer.insert<1, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
138 literal_6) );
139- l_scom_buffer.insert<2, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
140+ l_scom_buffer.insert<2, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
141 literal_3) );
142- l_scom_buffer.insert<3, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
143+ l_scom_buffer.insert<3, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_0] >>
144 literal_2) );
145- l_scom_buffer.insert<4, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
146+ l_scom_buffer.insert<4, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
147 literal_7) );
148- l_scom_buffer.insert<5, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
149+ l_scom_buffer.insert<5, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
150 literal_6) );
151- l_scom_buffer.insert<6, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
152+ l_scom_buffer.insert<6, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
153 literal_3) );
154- l_scom_buffer.insert<7, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
155+ l_scom_buffer.insert<7, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_1] >>
156 literal_2) );
157- l_scom_buffer.insert<8, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
158+ l_scom_buffer.insert<8, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
159 literal_7) );
160- l_scom_buffer.insert<9, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
161+ l_scom_buffer.insert<9, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
162 literal_6) );
163- l_scom_buffer.insert<10, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
164+ l_scom_buffer.insert<10, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
165 literal_3) );
166- l_scom_buffer.insert<11, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
167+ l_scom_buffer.insert<11, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_2] >>
168 literal_2) );
169- l_scom_buffer.insert<12, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
170+ l_scom_buffer.insert<12, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
171 literal_7) );
172- l_scom_buffer.insert<13, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
173+ l_scom_buffer.insert<13, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
174 literal_6) );
175- l_scom_buffer.insert<14, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
176+ l_scom_buffer.insert<14, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
177 literal_3) );
178- l_scom_buffer.insert<15, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
179+ l_scom_buffer.insert<15, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_0][literal_3] >>
180 literal_2) );
181- l_scom_buffer.insert<16, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
182+ l_scom_buffer.insert<16, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
183 literal_7) );
184- l_scom_buffer.insert<17, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
185+ l_scom_buffer.insert<17, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
186 literal_6) );
187- l_scom_buffer.insert<18, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
188+ l_scom_buffer.insert<18, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
189 literal_3) );
190- l_scom_buffer.insert<19, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
191+ l_scom_buffer.insert<19, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_0] >>
192 literal_2) );
193- l_scom_buffer.insert<20, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
194+ l_scom_buffer.insert<20, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
195 literal_7) );
196- l_scom_buffer.insert<21, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
197+ l_scom_buffer.insert<21, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
198 literal_6) );
199- l_scom_buffer.insert<22, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
200+ l_scom_buffer.insert<22, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
201 literal_3) );
202- l_scom_buffer.insert<23, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
203+ l_scom_buffer.insert<23, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_1] >>
204 literal_2) );
205- l_scom_buffer.insert<24, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
206+ l_scom_buffer.insert<24, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
207 literal_7) );
208- l_scom_buffer.insert<25, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
209+ l_scom_buffer.insert<25, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
210 literal_6) );
211- l_scom_buffer.insert<26, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
212+ l_scom_buffer.insert<26, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
213 literal_3) );
214- l_scom_buffer.insert<27, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
215+ l_scom_buffer.insert<27, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_2] >>
216 literal_2) );
217- l_scom_buffer.insert<28, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
218+ l_scom_buffer.insert<28, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
219 literal_7) );
220- l_scom_buffer.insert<29, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
221+ l_scom_buffer.insert<29, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
222 literal_6) );
223- l_scom_buffer.insert<30, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
224+ l_scom_buffer.insert<30, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
225 literal_3) );
226- l_scom_buffer.insert<31, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
227+ l_scom_buffer.insert<31, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_RD[l_def_PORT_INDEX][literal_1][literal_3] >>
228 literal_2) );
229- l_scom_buffer.insert<32, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
230+ l_scom_buffer.insert<32, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
231 literal_7) );
232- l_scom_buffer.insert<33, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
233+ l_scom_buffer.insert<33, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
234 literal_6) );
235- l_scom_buffer.insert<34, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
236+ l_scom_buffer.insert<34, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
237 literal_3) );
238- l_scom_buffer.insert<35, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
239+ l_scom_buffer.insert<35, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_0] >>
240 literal_2) );
241- l_scom_buffer.insert<36, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
242+ l_scom_buffer.insert<36, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
243 literal_7) );
244- l_scom_buffer.insert<37, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
245+ l_scom_buffer.insert<37, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
246 literal_6) );
247- l_scom_buffer.insert<38, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
248+ l_scom_buffer.insert<38, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
249 literal_3) );
250- l_scom_buffer.insert<39, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
251+ l_scom_buffer.insert<39, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_1] >>
252 literal_2) );
253- l_scom_buffer.insert<40, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
254+ l_scom_buffer.insert<40, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
255 literal_7) );
256- l_scom_buffer.insert<41, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
257+ l_scom_buffer.insert<41, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
258 literal_6) );
259- l_scom_buffer.insert<42, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
260+ l_scom_buffer.insert<42, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
261 literal_3) );
262- l_scom_buffer.insert<43, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
263+ l_scom_buffer.insert<43, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_2] >>
264 literal_2) );
265- l_scom_buffer.insert<44, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
266+ l_scom_buffer.insert<44, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
267 literal_7) );
268- l_scom_buffer.insert<45, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
269+ l_scom_buffer.insert<45, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
270 literal_6) );
271- l_scom_buffer.insert<46, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
272+ l_scom_buffer.insert<46, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
273 literal_3) );
274- l_scom_buffer.insert<47, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
275+ l_scom_buffer.insert<47, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_0][literal_3] >>
276 literal_2) );
277- l_scom_buffer.insert<48, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
278+ l_scom_buffer.insert<48, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
279 literal_7) );
280- l_scom_buffer.insert<49, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
281+ l_scom_buffer.insert<49, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
282 literal_6) );
283- l_scom_buffer.insert<50, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
284+ l_scom_buffer.insert<50, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
285 literal_3) );
286- l_scom_buffer.insert<51, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
287+ l_scom_buffer.insert<51, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_0] >>
288 literal_2) );
289- l_scom_buffer.insert<52, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
290+ l_scom_buffer.insert<52, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
291 literal_7) );
292- l_scom_buffer.insert<53, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
293+ l_scom_buffer.insert<53, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
294 literal_6) );
295- l_scom_buffer.insert<54, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
296+ l_scom_buffer.insert<54, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
297 literal_3) );
298- l_scom_buffer.insert<55, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
299+ l_scom_buffer.insert<55, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_1] >>
300 literal_2) );
301- l_scom_buffer.insert<56, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
302+ l_scom_buffer.insert<56, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
303 literal_7) );
304- l_scom_buffer.insert<57, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
305+ l_scom_buffer.insert<57, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
306 literal_6) );
307- l_scom_buffer.insert<58, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
308+ l_scom_buffer.insert<58, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
309 literal_3) );
310- l_scom_buffer.insert<59, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
311+ l_scom_buffer.insert<59, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_2] >>
312 literal_2) );
313- l_scom_buffer.insert<60, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
314+ l_scom_buffer.insert<60, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
315 literal_7) );
316- l_scom_buffer.insert<61, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
317+ l_scom_buffer.insert<61, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
318 literal_6) );
319- l_scom_buffer.insert<62, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
320+ l_scom_buffer.insert<62, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
321 literal_3) );
322- l_scom_buffer.insert<63, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_EFF_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
323+ l_scom_buffer.insert<63, 1, 63, uint64_t>((l_TGT2_ATTR_MSS_VPD_MT_ODT_WR[l_def_PORT_INDEX][literal_1][literal_3] >>
324 literal_2) );
325 FAPI_TRY(fapi2::putScom(TGT0, 0x7010915ull, l_scom_buffer));
326 }
327diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/bcw_load_ddr4.C b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/bcw_load_ddr4.C
Dan Crowell51b199d2018-11-29 10:09:57 -0600328index 3539735..92e65bc 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +1100329--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/bcw_load_ddr4.C
330+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/bcw_load_ddr4.C
331@@ -100,7 +100,6 @@ fapi2::ReturnCode bcw_load_ddr4( const fapi2::Target<TARGET_TYPE_DIMM>& i_target
332 { FUNC_SPACE_0, DQ_DRIVER_CW, eff_dimm_ddr4_bc03, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
333 { FUNC_SPACE_0, MDQ_RTT_CW, eff_dimm_ddr4_bc04, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
334 { FUNC_SPACE_0, MDQ_DRIVER_CW, eff_dimm_ddr4_bc05, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
335- { FUNC_SPACE_0, CMD_SPACE_CW, eff_dimm_ddr4_bc06, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
336 { FUNC_SPACE_0, RANK_PRESENCE_CW, eff_dimm_ddr4_bc07, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
337 { FUNC_SPACE_0, RANK_SELECTION_CW, eff_dimm_ddr4_bc08, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
338 { FUNC_SPACE_0, POWER_SAVING_CW, eff_dimm_ddr4_bc09, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
339@@ -112,23 +111,14 @@ fapi2::ReturnCode bcw_load_ddr4( const fapi2::Target<TARGET_TYPE_DIMM>& i_target
340 { FUNC_SPACE_0, ERROR_STATUS_CW, eff_dimm_ddr4_bc0f, mss::tmrc() , CW4_DATA_LEN, cw_info::BCW},
341
342 // 8-bit BCW's now
343- // Function space 0 - we're already there, so that's nice
344- { FUNC_SPACE_0, BUFF_CONFIG_CW, eff_dimm_ddr4_f0bc1x, mss::tmrc(), CW8_DATA_LEN, cw_info::BCW},
345- { FUNC_SPACE_0, LRDIMM_OPERATING_SPEED, eff_dimm_ddr4_f0bc6x, mss::tmrc(), CW8_DATA_LEN, cw_info::BCW},
346-
347- // Function space 2
348- { FUNC_SPACE_2, FUNC_SPACE_SELECT_CW, FUNC_SPACE_2, mss::tmrd(), CW8_DATA_LEN, cw_info::BCW},
349- { FUNC_SPACE_2, HOST_DFE, eff_dimm_ddr4_f2bcex, mss::tmrc(), CW8_DATA_LEN, cw_info::BCW},
350+ // Function space 6
351+ { FUNC_SPACE_6, FUNC_SPACE_SELECT_CW, FUNC_SPACE_6, mss::tmrd(), CW8_DATA_LEN, cw_info::BCW},
352+ { FUNC_SPACE_6, BUFF_TRAIN_CONFIG_CW, eff_dimm_ddr4_f6bc4x, mss::tmrc(), CW8_DATA_LEN, cw_info::BCW},
353
354 // Function space 5
355 { FUNC_SPACE_5, FUNC_SPACE_SELECT_CW, FUNC_SPACE_5, mss::tmrd(), CW8_DATA_LEN, cw_info::BCW},
356- { FUNC_SPACE_5, HOST_VREF_CW, eff_dimm_ddr4_f5bc5x, mss::tmrc(), CW8_DATA_LEN, cw_info::BCW},
357 { FUNC_SPACE_5, DRAM_VREF_CW, eff_dimm_ddr4_f5bc6x, mss::tmrc(), CW8_DATA_LEN, cw_info::BCW},
358
359- // Function space 6
360- { FUNC_SPACE_6, FUNC_SPACE_SELECT_CW, FUNC_SPACE_6, mss::tmrd(), CW8_DATA_LEN, cw_info::BCW},
361- { FUNC_SPACE_6, BUFF_TRAIN_CONFIG_CW, eff_dimm_ddr4_f6bc4x, mss::tmrc(), CW8_DATA_LEN, cw_info::BCW},
362-
363
364 // So, we always want to know what function space we're in
365 // The way to do that is to always return to one function space
366diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/data_buffer_ddr4.H b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/data_buffer_ddr4.H
Dan Crowell51b199d2018-11-29 10:09:57 -0600367index 05b1f2f..a92d8ea 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +1100368--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/data_buffer_ddr4.H
369+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/data_buffer_ddr4.H
370@@ -90,12 +90,9 @@ enum db02_def : size_t
371 FUNC_SPACE_SELECT_CW = 0x7,
372
373 // 8 bit BCWs
374- BUFF_CONFIG_CW = 0x1, // Func space 0
375- LRDIMM_OPERATING_SPEED = 0x6, // Func space 0
376- HOST_DFE = 0xE, // Func space 2
377- HOST_VREF_CW = 0x5, // Func space 5
378- DRAM_VREF_CW = 0x6, // Func space 5
379- BUFF_TRAIN_CONFIG_CW = 0x4, // Func space 6
380+ BUFF_CONFIG_CW = 0x1,
381+ DRAM_VREF_CW = 0x6,
382+ BUFF_TRAIN_CONFIG_CW = 0x4,
383 };
384
385 namespace ddr4
386diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/mrs01.C b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/mrs01.C
Dan Crowell51b199d2018-11-29 10:09:57 -0600387index 834ee1e..875c83f 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +1100388--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/mrs01.C
389+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/mrs01.C
Stewart Smitha55c02c2018-11-27 11:36:05 +1100390@@ -62,7 +62,7 @@ mrs01_data::mrs01_data( const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
391 iv_qoff(0)
392 {
393 FAPI_TRY( mss::eff_dram_dll_enable(i_target, iv_dll_enable), "Error in mrs01_data()" );
394- FAPI_TRY( mss::eff_dram_odic(i_target, &(iv_odic[0])), "Error in mrs01_data()" );
395+ FAPI_TRY( mss::vpd_mt_dram_drv_imp_dq_dqs(i_target, &(iv_odic[0])), "Error in mrs01_data()" );
396 FAPI_TRY( mss::eff_dram_al(i_target, iv_additive_latency), "Error in mrs01_data()" );
397 FAPI_TRY( mss::eff_dram_wr_lvl_enable(i_target, iv_wl_enable), "Error in mrs01_data()" );
398 FAPI_TRY( mss::eff_dram_rtt_nom(i_target, &(iv_rtt_nom[0])), "Error in mrs01_data()" );
399diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C
400old mode 100755
401new mode 100644
Dan Crowell51b199d2018-11-29 10:09:57 -0600402index b5e562a..ae55f78
Stewart Smitha55c02c2018-11-27 11:36:05 +1100403--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C
404+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C
405@@ -312,20 +312,9 @@ enum rc3x_encode : uint8_t
406 enum bc03_encode : uint8_t
407 {
408 // Bit position of the BC03 bit to enable/ disable DQ/ DQS drivers
409- BC03_HOST_DQ_DISABLE_POS = 4,
410- BC03_HOST_DQ_DISABLE = 1,
411- BC03_HOST_DQ_ENABLE = 0,
412-};
413-
414-///
415-/// @brief bc05_encode enums for DRAM Interface MDQ Driver Control Word
416-///
417-enum bc05_encode : uint8_t
418-{
419- // Bit position of the BC05 bit to enable/ disable DQ/ DQS drivers
420- BC05_DRAM_DQ_DRIVER_DISABLE_POS = 4,
421- BC05_DRAM_DQ_DRIVER_DISABLE = 1,
422- BC05_DRAM_DQ_DRIVER_ENABLE = 0,
423+ BC03_DQ_DISABLE_POS = 4,
424+ BC03_DQ_DISABLE = 1,
425+ BC03_DQ_ENABLE = 0,
426 };
427
428
429@@ -340,7 +329,6 @@ enum bc09_encode : uint8_t
430 BC09_CKE_POWER_DOWN_ENABLE_POS = 4,
431 BC09_CKE_POWER_ODT_OFF = 1,
432 BC09_CKE_POWER_ODT_ON = 0,
433- BC09_CKE_POWER_ODT_POS = 5,
434 };
435
436 ///
437@@ -360,7 +348,6 @@ enum invalid_freq_function_encoding : uint8_t
438 RC0A = 0x0a,
439 RC3X = 0x30,
440 BC0A = 0x0a,
441- F0BC6X = 0x60,
442 };
443
444 ///
Dan Crowell51b199d2018-11-29 10:09:57 -0600445@@ -1418,28 +1405,6 @@ fapi_try_exit:
Stewart Smitha55c02c2018-11-27 11:36:05 +1100446 }
447
Dan Crowell51b199d2018-11-29 10:09:57 -0600448 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100449-/// @brief Determines & sets effective config for DRAM output driver impedance control
450-/// @return fapi2::FAPI2_RC_SUCCESS if okay
451-///
452-fapi2::ReturnCode eff_rdimm::dram_odic()
453-{
454- uint8_t l_dram_odic[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
455- uint8_t l_vpd_odic[MAX_RANK_PER_DIMM];
456- FAPI_TRY( eff_dram_odic(iv_mcs, &l_dram_odic[0][0][0]));
457-
458- // Gets the VPD value
459- FAPI_TRY( mss::vpd_mt_dram_drv_imp_dq_dqs(iv_dimm, &(l_vpd_odic[0])));
460-
461- // Updates DRAM ODIC with the VPD value
462- memcpy(&(l_dram_odic[iv_port_index][iv_dimm_index][0]), l_vpd_odic, MAX_RANK_PER_DIMM);
463-
464- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DRAM_ODIC, iv_mcs, l_dram_odic) );
465-
466-fapi_try_exit:
467- return fapi2::current_err;
468-}
469-
Dan Crowell51b199d2018-11-29 10:09:57 -0600470-///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100471 /// @brief Determines & sets effective config for tCCD_L
472 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -0600473 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100474@@ -1926,8 +1891,8 @@ fapi2::ReturnCode eff_dimm::dimm_rc09()
475 // 2) Gets the ODT values for the other DIMM
476 uint8_t l_wr_odt[MAX_RANK_PER_DIMM] = {};
477 uint8_t l_rd_odt[MAX_RANK_PER_DIMM] = {};
478- FAPI_TRY(eff_odt_rd(l_other_dimm, l_rd_odt));
479- FAPI_TRY(eff_odt_wr(l_other_dimm, l_wr_odt));
480+ FAPI_TRY(vpd_mt_odt_rd(l_other_dimm, l_rd_odt));
481+ FAPI_TRY(vpd_mt_odt_wr(l_other_dimm, l_wr_odt));
482
483 // 3) Checks whether this DIMM's ODTs are used for writes or reads that target the other DIMMs
484 for(uint8_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
Dan Crowell51b199d2018-11-29 10:09:57 -0600485@@ -2897,42 +2862,6 @@ fapi_try_exit:
Stewart Smitha55c02c2018-11-27 11:36:05 +1100486 }
487
Dan Crowell51b199d2018-11-29 10:09:57 -0600488 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100489-/// @brief Determines & sets effective config for Vref DQ Train Value and Range
490-/// @return fapi2::FAPI2_RC_SUCCESS if okay
491-///
492-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
493-fapi2::ReturnCode eff_lrdimm::vref_dq_train_value_and_range()
494-{
495- uint8_t l_vref_dq_train_value[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
496- uint8_t l_vref_dq_train_range[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
497- fapi2::buffer<uint8_t> l_vref_range;
498-
499- // Gets the attributes
500- FAPI_TRY( eff_vref_dq_train_value(iv_mcs, &l_vref_dq_train_value[0][0][0]) );
501- FAPI_TRY( eff_vref_dq_train_range(iv_mcs, &l_vref_dq_train_range[0][0][0]) );
502-
503- // Using hardcoded values for 2R settings from the IBM SI team
504- // It should be good enough to get us going
505- for(uint64_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
506- {
507- constexpr uint8_t VREF_79PERCENT = 0x1d;
508- // Yes, range1 has a value of 0 this is taken from the JEDEC spec
509- constexpr uint8_t RANGE1 = 0x00;
510- l_vref_dq_train_value[iv_port_index][iv_dimm_index][l_rank] = VREF_79PERCENT;
511- l_vref_dq_train_range[iv_port_index][iv_dimm_index][l_rank] = RANGE1;
512- }
513-
514- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_VREF_DQ_TRAIN_VALUE, iv_mcs, l_vref_dq_train_value),
515- "Failed setting attribute for ATTR_EFF_VREF_DQ_TRAIN_VALUE");
516-
517- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_VREF_DQ_TRAIN_RANGE, iv_mcs, l_vref_dq_train_range),
518- "Failed setting attribute for ATTR_EFF_VREF_DQ_TRAIN_RANGE");
519-
520-fapi_try_exit:
521- return fapi2::current_err;
522-}
523-
Dan Crowell51b199d2018-11-29 10:09:57 -0600524-///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100525 /// @brief Determines & sets effective config for Vref DQ Train Enable
526 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -0600527 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100528@@ -4350,7 +4279,7 @@ fapi2::ReturnCode eff_rdimm::dram_rtt_nom()
529 // Indexed by denominator. So, if RQZ is 240, and you have OHM240, then you're looking
530 // for mss::index 1. So this doesn't correspond directly with the table in the JEDEC spec,
531 // as that's not in "denominator order."
532- // 0 RQZ/1 RQZ/2 RQZ/3 RQZ/4 RQZ/5 RQZ/6 RQZ/7
533+ // 0 RQZ/1 RQZ/2 RQZ/3 RQZ/4 RQZ/5 RQZ/6 RQZ/7
534 constexpr uint8_t rtt_nom_map[RTT_NOM_MAP_SIZE] = { 0, 0b100, 0b010, 0b110, 0b001, 0b101, 0b011, 0b111 };
535
536 size_t l_rtt_nom_index = 0;
537@@ -4400,21 +4329,24 @@ fapi_try_exit:
538 /// @return fapi2::FAPI2_RC_SUCCESS if okay
539 /// @note used for MRS01
540 ///
541-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
542 fapi2::ReturnCode eff_lrdimm::dram_rtt_nom()
543 {
544+ std::vector< uint64_t > l_ranks;
545+
546+ uint8_t l_decoder_val = 0;
547 uint8_t l_mcs_attrs[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
548 FAPI_TRY( eff_dram_rtt_nom(iv_mcs, &l_mcs_attrs[0][0][0]) );
549
550- // The host is in charge of ensuring good termination from the buffer to the DRAM
551- // That means that we need to know and set the settings
552- // Currently, our SI team thinks that the 2R single drop open power settings will work for BUP
553- // We're going to hard code in those settings the above story can be used as a catchall to improve settings if need be
554- // Loops through all ranks
555- for(uint64_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
556+ // Get the value from the LRDIMM SPD
557+ FAPI_TRY( iv_spd_decoder.dram_rtt_nom(iv_freq, l_decoder_val));
558+
559+ // Plug into every rank position for the attribute so it'll fit the same style as the RDIMM value
560+ // Same value for every rank for LRDIMMs
561+ FAPI_TRY(mss::rank::ranks(iv_dimm, l_ranks));
562+
563+ for (const auto& l_rank : l_ranks)
564 {
565- // Taking the 34ohm value from up above
566- l_mcs_attrs[iv_port_index][iv_dimm_index][l_rank] = 0b111;
567+ l_mcs_attrs[iv_port_index][iv_dimm_index][mss::index(l_rank)] = l_decoder_val;
568 }
569
570 FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DRAM_RTT_NOM, iv_mcs, l_mcs_attrs) );
571@@ -4481,21 +4413,23 @@ fapi_try_exit:
572 /// @return fapi2::FAPI2_RC_SUCCESS if okay
573 /// @note used for MRS02
574 ///
575-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
576 fapi2::ReturnCode eff_lrdimm::dram_rtt_wr()
577 {
578+ std::vector< uint64_t > l_ranks;
579+
580+ uint8_t l_decoder_val = 0;
581 uint8_t l_mcs_attrs[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
582- FAPI_TRY( eff_dram_rtt_wr(iv_mcs, &l_mcs_attrs[0][0][0]) );
583
584- // The host is in charge of ensuring good termination from the buffer to the DRAM
585- // That means that we need to know and set the settings
586- // Currently, our SI team thinks that the 2R single drop open power settings will work for BUP
587- // We're going to hard code in those settings the above story can be used as a catchall to improve settings if need be
588- // Loops through all ranks
589- for(uint64_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
590+ // Get the value from the LRDIMM SPD
591+ FAPI_TRY( iv_spd_decoder.dram_rtt_wr(iv_freq, l_decoder_val));
592+
593+ // Plug into every rank position for the attribute so it'll fit the same style as the RDIMM value
594+ // Same value for every rank for LRDIMMs
595+ FAPI_TRY(mss::rank::ranks(iv_dimm, l_ranks));
596+
597+ for (const auto& l_rank : l_ranks)
598 {
599- // Taking the disable value from up above
600- l_mcs_attrs[iv_port_index][iv_dimm_index][l_rank] = 0b000;
601+ l_mcs_attrs[iv_port_index][iv_dimm_index][mss::index(l_rank)] = l_decoder_val;
602 }
603
604 // Set the attribute
605@@ -4554,23 +4488,27 @@ fapi_try_exit:
606 /// @return fapi2::FAPI2_RC_SUCCESS if okay
607 /// @note used for MRS05
608 ///
609-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
610 fapi2::ReturnCode eff_lrdimm::dram_rtt_park()
611 {
612 uint8_t l_mcs_attrs[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
613+ uint8_t l_decoder_val_01 = 0;
614+ uint8_t l_decoder_val_23 = 0;
615
616 FAPI_TRY( eff_dram_rtt_park(iv_mcs, &l_mcs_attrs[0][0][0]) );
617
618- // The host is in charge of ensuring good termination from the buffer to the DRAM
619- // That means that we need to know and set the settings
620- // Currently, our SI team thinks that the 2R single drop open power settings will work for BUP
621- // We're going to hard code in those settings the above story can be used as a catchall to improve settings if need be
622- // Loops through all ranks
623- for(uint64_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
624- {
625- // Taking the disable value from up above
626- l_mcs_attrs[iv_port_index][iv_dimm_index][l_rank] = 0b000;
627- }
628+ // Get the value from the LRDIMM SPD
629+ FAPI_TRY( iv_spd_decoder.dram_rtt_park_ranks0_1(iv_freq, l_decoder_val_01),
630+ "%s failed to decode RTT_PARK for ranks 0/1", mss::c_str(iv_mcs) );
631+ FAPI_TRY( iv_spd_decoder.dram_rtt_park_ranks2_3(iv_freq, l_decoder_val_23),
632+ "%s failed to decode RTT_PARK for ranks 2/3", mss::c_str(iv_mcs) );
633+
634+ // Setting the four rank values for this dimm
635+ // Rank 0 and 1 have the same value, l_decoder_val_01
636+ // Rank 2 and 3 have the same value, l_decoder_val_23
637+ l_mcs_attrs[iv_port_index][iv_dimm_index][0] = l_decoder_val_01;
638+ l_mcs_attrs[iv_port_index][iv_dimm_index][1] = l_decoder_val_01;
639+ l_mcs_attrs[iv_port_index][iv_dimm_index][2] = l_decoder_val_23;
640+ l_mcs_attrs[iv_port_index][iv_dimm_index][3] = l_decoder_val_23;
641
642 FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DRAM_RTT_PARK, iv_mcs, l_mcs_attrs) );
643
644@@ -4661,16 +4599,13 @@ fapi2::ReturnCode eff_lrdimm::dimm_bc01()
645 uint8_t l_dram_rtt_wr[MAX_RANK_PER_DIMM];
646 FAPI_TRY( mss::vpd_mt_dram_rtt_wr(iv_dimm, &(l_dram_rtt_wr[0])) );
647
648- // Rzq is 240, so calculate from there
649 static const std::vector< std::pair<uint8_t, uint8_t> > l_rtt_wr_map =
650 {
651 {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_DISABLE, 0b000},
652- {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_HIGHZ, 0b111},
653- // Note: we don't have this value for DDR4 RTT_WR, so we don't have a constant for it
654- {60, 0b001}, // RZQ/4
655- {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_OHM80, 0b110}, // RZQ/3
656- {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_OHM120, 0b010}, // RZQ/2
657- {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_OHM240, 0b100} // RZQ/1
658+ {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_HIGHZ, 0b011},
659+ {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_OHM80, 0b100}, // RZQ/3
660+ {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_OHM120, 0b001}, // RZQ/2
661+ {fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_WR_OHM240, 0b010}
662 };
663
664 FAPI_ASSERT( mss::find_value_from_key(l_rtt_wr_map, l_dram_rtt_wr[l_rank], l_encoding),
665@@ -4708,38 +4643,29 @@ fapi2::ReturnCode eff_lrdimm::dimm_bc02()
666 // Retrieve MCS attribute data
667 uint8_t l_attrs_dimm_bc02[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
668
669- uint8_t l_rank = 0;
670- // Indexed by denominator. So, if RQZ is 240, and you have OHM240, then you're looking
671- // for mss::index 1. So this doesn't correspond directly with the table in the JEDEC spec,
672- // as that's not in "denominator order."
673- constexpr uint64_t RTT_PARK_COUNT = 8;
674- // 0 RQZ/1 RQZ/2 RQZ/3 RQZ/4 RQZ/5 RQZ/6 RQZ/7
675- constexpr uint8_t rtt_park_map[RTT_PARK_COUNT] = { 0, 0b100, 0b010, 0b110, 0b001, 0b101, 0b011, 0b111 };
676+ {
677+ uint8_t l_rank = 0;
678+ // Indexed by denominator. So, if RQZ is 240, and you have OHM240, then you're looking
679+ // for mss::index 1. So this doesn't correspond directly with the table in the JEDEC spec,
680+ // as that's not in "denominator order."
681+ constexpr uint64_t RTT_PARK_COUNT = 8;
682+ // 0 RQZ/1 RQZ/2 RQZ/3 RQZ/4 RQZ/5 RQZ/6 RQZ/7
683+ constexpr uint8_t rtt_park_map[RTT_PARK_COUNT] = { 0, 0b100, 0b010, 0b110, 0b001, 0b101, 0b011, 0b111 };
684
685- uint8_t l_rtt_park[MAX_RANK_PER_DIMM];
686- uint8_t l_rtt_park_index = 0;
687+ uint8_t l_rtt_park[MAX_RANK_PER_DIMM];
688
689- FAPI_TRY( mss::vpd_mt_dram_rtt_park(iv_dimm, &(l_rtt_park[0])) );
690+ FAPI_TRY( mss::vpd_mt_dram_rtt_park(iv_dimm, &(l_rtt_park[0])) );
691
692- // We have to be careful about 0
693- l_rtt_park_index = (l_rtt_park[l_rank] == 0) ?
694- 0 : fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_PARK_240OHM / l_rtt_park[l_rank];
695+ // Calculate the value for each rank and store in attribute
696+ uint8_t l_rtt_park_index = 0;
697
698- // Make sure it's a valid index
699- FAPI_ASSERT( l_rtt_park_index < RTT_PARK_COUNT,
700- fapi2::MSS_INVALID_RTT_PARK_CALCULATIONS()
701- .set_RANK(l_rank)
702- .set_RTT_PARK_INDEX(l_rtt_park_index)
703- .set_RTT_PARK_FROM_VPD(l_rtt_park[mss::index(l_rank)])
704- .set_DIMM_TARGET(iv_dimm),
705- "Error calculating RTT_PARK for target %s rank %d, rtt_park from vpd is %d, index is %d",
706- mss::c_str(iv_dimm),
707- l_rank,
708- l_rtt_park[mss::index(l_rank)],
709- l_rtt_park_index);
710+ // We have to be careful about 0
711+ l_rtt_park_index = (l_rtt_park[l_rank] == 0) ?
712+ 0 : fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_RTT_PARK_240OHM / l_rtt_park[l_rank];
713
714- // Map from RTT_PARK array to the value in the map
715- l_decoder_val = rtt_park_map[l_rtt_park_index];
716+ // Map from RTT_PARK array to the value in the map
717+ l_decoder_val = rtt_park_map[l_rtt_park_index];
718+ }
719
720 FAPI_TRY( eff_dimm_ddr4_bc02(iv_mcs, &l_attrs_dimm_bc02[0][0]) );
721 l_attrs_dimm_bc02[iv_port_index][iv_dimm_index] = l_decoder_val;
722@@ -4798,7 +4724,7 @@ fapi2::ReturnCode eff_lrdimm_db01::dimm_bc03()
723
724 // Using a writeBit for clarity sake
725 // Enabling Host interface DQ/DQS driver
726- l_result.writeBit<BC03_HOST_DQ_DISABLE_POS>(BC03_HOST_DQ_ENABLE);
727+ l_result.writeBit<BC03_DQ_DISABLE_POS>(BC03_DQ_ENABLE);
728
729 FAPI_TRY( eff_dimm_ddr4_bc03(iv_mcs, &l_attrs_dimm_bc03[0][0]) );
730 l_attrs_dimm_bc03[iv_port_index][iv_dimm_index] = l_result;
731@@ -4834,7 +4760,7 @@ fapi2::ReturnCode eff_lrdimm_db02::dimm_bc03()
732
733 // Treat buffer as 0th rank. LRDIMM in our eyes only have 1 rank
734 constexpr size_t l_rank = 0;
735- fapi2::buffer<uint8_t> l_result;
736+ fapi2::buffer<uint8_t> l_result = 0;
737 uint64_t l_ohm_value = 0;
738 uint8_t l_encoding = 0;
739 // attributes
740@@ -4858,7 +4784,7 @@ fapi2::ReturnCode eff_lrdimm_db02::dimm_bc03()
741
742 // Using a writeBit for clarity sake
743 // Enabling DQ/DQS drivers
744- l_result.writeBit<BC03_HOST_DQ_DISABLE_POS>(BC03_HOST_DQ_ENABLE);
745+ l_result.writeBit<BC03_DQ_DISABLE_POS>(BC03_DQ_ENABLE);
746
747 // Retrieve MCS attribute data
748 FAPI_TRY( eff_dimm_ddr4_bc03(iv_mcs, &l_attrs_dimm_bc03[0][0]) );
749@@ -4886,15 +4812,21 @@ fapi_try_exit:
750 /// DRAM Interface MDQ/MDQS ODT Strength for Data Buffer
751 /// Comes from SPD
752 ///
753-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
754 fapi2::ReturnCode eff_lrdimm::dimm_bc04()
755 {
756+ uint8_t l_decoder_val = 0;
757+
758 // Retrieve MCS attribute data
759 uint8_t l_attrs_dimm_bc04[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
760 FAPI_TRY( eff_dimm_ddr4_bc04(iv_mcs, &l_attrs_dimm_bc04[0][0]) );
761+ // Update MCS attribute
762
763- // Taken from SI spreadsheet and JEDEC - we want 60 Ohms, so 0x01 for a value
764- l_attrs_dimm_bc04[iv_port_index][iv_dimm_index] = 0x01;
765+ // So the encoding from the SPD is the same as the encoding for the buffer control encoding
766+ // Simple grab and insert
767+ // Value is checked in decoder function for validity
768+ FAPI_TRY( iv_spd_decoder.data_buffer_mdq_rtt(iv_freq, l_decoder_val) );
769+
770+ // Update MCS attribute
771
772 FAPI_INF("%s: BC04 settting (MDQ_RTT): %d", mss::c_str(iv_dimm), l_attrs_dimm_bc04[iv_port_index][iv_dimm_index] );
773 FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_BC04, iv_mcs, l_attrs_dimm_bc04) );
774@@ -4911,22 +4843,19 @@ fapi_try_exit:
775 /// Page 57 Table 28
776 /// @note DRAM Interface MDQ/MDQS Output Driver Impedance control
777 ///
778-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
779 fapi2::ReturnCode eff_lrdimm::dimm_bc05()
780 {
781- // Taken from the SI spreadsheet - we want 34 Ohms so 0x01
782- fapi2::buffer<uint8_t> l_result(0x01);
783+ uint8_t l_decoder_val;
784
785 // Retrieve MCS attribute data
786 uint8_t l_attrs_dimm_bc05[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
787 FAPI_TRY( eff_dimm_ddr4_bc05(iv_mcs, &l_attrs_dimm_bc05[0][0]) );
788
789- // Using a writeBit for clarity sake
790- // Enabling DQ/DQS drivers
791- l_result.writeBit<BC05_DRAM_DQ_DRIVER_DISABLE_POS>(BC05_DRAM_DQ_DRIVER_ENABLE);
792- l_attrs_dimm_bc05[iv_port_index][iv_dimm_index] = l_result;
793+ // Same as BC04, grab from SPD and put into BC
794+ FAPI_TRY( iv_spd_decoder.data_buffer_mdq_drive_strength(iv_freq, l_decoder_val) );
795+ l_attrs_dimm_bc05[iv_port_index][iv_dimm_index] = l_decoder_val;
796
797- FAPI_INF("%s: BC05 settting (MDQ Drive Strength): 0x%02x", mss::c_str(iv_dimm),
798+ FAPI_INF("%s: BC05 settting (MDQ Drive Strenght): %d", mss::c_str(iv_dimm),
799 l_attrs_dimm_bc05[iv_port_index][iv_dimm_index] );
800 FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_BC05, iv_mcs, l_attrs_dimm_bc05) );
801
Dan Crowell51b199d2018-11-29 10:09:57 -0600802@@ -4935,32 +4864,6 @@ fapi_try_exit:
Stewart Smitha55c02c2018-11-27 11:36:05 +1100803 }
804
Dan Crowell51b199d2018-11-29 10:09:57 -0600805 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100806-/// @brief Determines & sets effective config for DIMM BC06
807-/// @return fapi2::FAPI2_RC_SUCCESS if okay
808-/// @noteCommand Space Control Word
809-/// From DDR4DB02 Spec Rev 0.95
810-/// Page 57 Table 28
811-/// @note DRAM Interface MDQ/MDQS Output Driver Impedance control
812-///
813-fapi2::ReturnCode eff_lrdimm::dimm_bc06()
814-{
815- constexpr uint8_t RESET_DLL = 0x00;
816-
817- // Retrieve MCS attribute data
818- uint8_t l_attrs_dimm_bc06[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
819- FAPI_TRY( eff_dimm_ddr4_bc06(iv_mcs, &l_attrs_dimm_bc06[0][0]) );
820-
821- l_attrs_dimm_bc06[iv_port_index][iv_dimm_index] = RESET_DLL;
822-
823- FAPI_INF("%s: BC06 settting (Command Space Control Word): 0x%02x", mss::c_str(iv_dimm),
824- l_attrs_dimm_bc06[iv_port_index][iv_dimm_index] );
825- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_BC06, iv_mcs, l_attrs_dimm_bc06) );
826-
827-fapi_try_exit:
828- return fapi2::current_err;
829-}
830-
Dan Crowell51b199d2018-11-29 10:09:57 -0600831-///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100832 /// @brief Determines & sets effective config for DIMM BC07
833 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -0600834 /// @note Rank Presence Control Word
Stewart Smitha55c02c2018-11-27 11:36:05 +1100835@@ -4972,7 +4875,7 @@ fapi2::ReturnCode eff_lrdimm::dimm_bc07()
836 {
837 // Map for the bc07 attribute, Each bit and its position represents one rank
838 // 0b0 == enabled, 0b1 == disabled
839- // 1 rank 2 rank 3 rank 4 rank
840+ // 1 rank 2 rank 3 rank 4 rank
841 constexpr uint8_t const dram_map [MAX_RANK_PER_DIMM] = {0b1110, 0b1100, 0b1000, 0b0000};
842 uint8_t l_ranks_per_dimm = 0;
843
844@@ -4986,15 +4889,7 @@ fapi2::ReturnCode eff_lrdimm::dimm_bc07()
845 // Subtract so 1 rank == 0, 2 rank == 1, etc. For array mss::indexing
846 --l_ranks_per_dimm;
847 // Make sure we didn't overflow or screw up somehow
848- // TK Thoughts on if we need an official error code below??
849- FAPI_ASSERT(l_ranks_per_dimm < MAX_RANK_PER_DIMM,
850- fapi2::MSS_OUT_OF_BOUNDS_INDEXING()
851- .set_TARGET(iv_dimm)
852- .set_INDEX(l_ranks_per_dimm)
853- .set_LIST_SIZE(MAX_RANK_PER_DIMM)
854- .set_FUNCTION(EFF_BC07),
855- "%s has ranks per dimm (%u) out of bounds: %u",
856- mss::c_str(iv_dimm), l_ranks_per_dimm, MAX_RANK_PER_DIMM);
857+ fapi2::Assert (l_ranks_per_dimm < MAX_RANK_PER_DIMM);
858
859 l_attrs_dimm_bc07[iv_port_index][iv_dimm_index] = dram_map[l_ranks_per_dimm];
860
861@@ -5024,7 +4919,8 @@ fapi2::ReturnCode eff_lrdimm::dimm_bc08()
862 // Update MCS attribute
863 FAPI_TRY( eff_dimm_ddr4_bc08(iv_mcs, &l_attrs_dimm_bc08[0][0]) );
864 // BC08 is used to set the rank for Write Leveling training modes
865- // This value is used in training so a value of 0 is fine for now
866+ // Defaulting to 0 because every dimm should have a rank 0, right?
867+ // This attribute should be set in training...
868 l_attrs_dimm_bc08[iv_port_index][iv_dimm_index] = 0;
869
870 FAPI_INF("%s: BC08 settting: %d", mss::c_str(iv_dimm), l_attrs_dimm_bc08[iv_port_index][iv_dimm_index] );
871@@ -5051,9 +4947,9 @@ fapi2::ReturnCode eff_lrdimm::dimm_bc09()
872
873 fapi2::buffer<uint8_t> l_setting = 0;
874
875- // Enabling power down mode (when CKE's are low!) to bring us inline with RC09/RCD powerdown mode
876- l_setting.writeBit<BC09_CKE_POWER_DOWN_ENABLE_POS>(BC09_CKE_POWER_DOWN_ENABLE)
877- .writeBit<BC09_CKE_POWER_ODT_POS>(BC09_CKE_POWER_ODT_OFF);
878+ // Disabling for now until characterization can be done
879+ // Power/ performance setting
880+ l_setting.writeBit<BC09_CKE_POWER_DOWN_ENABLE_POS> (BC09_CKE_POWER_DOWN_DISABLE);
881
882 // Update MCS attribute
883 FAPI_TRY( eff_dimm_ddr4_bc09(iv_mcs, &l_attrs_dimm_bc09[0][0]) );
884@@ -5126,7 +5022,6 @@ fapi2::ReturnCode eff_lrdimm_db01::dimm_bc0b()
885
886 // Update MCS attribute
887 // Only option is to set it to 0 to signify 1.2 operating Voltage, everything else is reserved
888- // Per the IBM signal integrity team, the default value should be sufficient
889 l_attrs_dimm_bc0b[iv_port_index][iv_dimm_index] = 0;
890
891 FAPI_INF("%s: BC0b settting: %d", mss::c_str(iv_dimm), l_attrs_dimm_bc0b[iv_port_index][iv_dimm_index] );
892@@ -5153,7 +5048,6 @@ fapi2::ReturnCode eff_lrdimm_db02::dimm_bc0b()
893 // Bits 0~1 (IBM numbering) are for slew rate
894 // Bit 3 is reserved, Bit 4 has to be 0 to signal 1.2 V Buffer Vdd Voltage
895 // Hard coding values to 0, sets slew rate to Moderate (according to Dan Phipps, this is fine)
896- // Per the IBM signal integrity team, the default value should be sufficient
897 l_attrs_dimm_bc0b[iv_port_index][iv_dimm_index] = 0;
898
899 FAPI_INF("%s: BC0b settting: %d", mss::c_str(iv_dimm), l_attrs_dimm_bc0b[iv_port_index][iv_dimm_index] );
900@@ -5216,7 +5110,7 @@ fapi_try_exit:
901 ///
902 /// @brief Determines & sets effective config for DIMM BC0d
903 /// @return fapi2::FAPI2_RC_SUCCESS if okay
904-/// @note Reserved for future use - set it to 0 for now
905+/// @note LDQ Operation Control Word
906 /// From DDR4DB01 Spec Rev 1.0
907 /// Page 61 Table 25
908 /// All values are reserved for DB01, setting to 0
909@@ -5240,7 +5134,7 @@ fapi_try_exit:
910 ///
911 /// @brief Determines & sets effective config for DIMM BC0d
912 /// @return fapi2::FAPI2_RC_SUCCESS if okay
913-/// @note Reserved for future use - set it to 0 for now
914+/// @note LDQ Operation Control Word
915 /// From DDR4DB02 Spec Rev 0.95
916 /// Page 60 Table 24
917 /// @note This register is used by the Non Volatile controller (NVC) to change the mode of operation of the DDR4DB02
Dan Crowell51b199d2018-11-29 10:09:57 -0600918@@ -5310,219 +5204,6 @@ fapi_try_exit:
Stewart Smitha55c02c2018-11-27 11:36:05 +1100919 }
920
Dan Crowell51b199d2018-11-29 10:09:57 -0600921 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +1100922-/// @brief Determines and sets DIMM BC1x
923-/// @return fapi2::FAPI2_RC_SUCCESS if okay
924-///
925-fapi2::ReturnCode eff_lrdimm::dimm_f0bc1x()
926-{
927- uint8_t l_attrs_dimm_bc_1x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
928-
929- // Retrieve MCS attribute data
930- FAPI_TRY( eff_dimm_ddr4_f0bc1x(iv_mcs, &l_attrs_dimm_bc_1x[0][0]) );
931-
932- // Setup to default as we want to be in runtime mode
933- l_attrs_dimm_bc_1x[iv_port_index][iv_dimm_index] = 0;
934-
935- FAPI_INF( "%s: F0BC1X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_bc_1x[iv_port_index][iv_dimm_index] );
936- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_F0BC1x, iv_mcs, l_attrs_dimm_bc_1x) );
937-
938-
939-fapi_try_exit:
940- return fapi2::current_err;
941-}
942-
943-///
944-/// @brief Determines and sets DIMM BC6x
945-/// @return fapi2::FAPI2_RC_SUCCESS if okay
946-///
947-fapi2::ReturnCode eff_lrdimm::dimm_f0bc6x()
948-{
949- uint8_t l_attrs_dimm_bc_6x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
950-
951- // Retrieve MCS attribute data
952- FAPI_TRY( eff_dimm_ddr4_f0bc6x(iv_mcs, &l_attrs_dimm_bc_6x[0][0]) );
953-
954- // Frequency encoding is the same as rc3x, so reusing here
955- switch(iv_freq)
956- {
957- case fapi2::ENUM_ATTR_MSS_FREQ_MT1866:
958- l_attrs_dimm_bc_6x[iv_port_index][iv_dimm_index] = rc3x_encode::MT1860_TO_MT1880;
959- break;
960-
961- case fapi2::ENUM_ATTR_MSS_FREQ_MT2133:
962- l_attrs_dimm_bc_6x[iv_port_index][iv_dimm_index] = rc3x_encode::MT2120_TO_MT2140;
963- break;
964-
965- case fapi2::ENUM_ATTR_MSS_FREQ_MT2400:
966- l_attrs_dimm_bc_6x[iv_port_index][iv_dimm_index] = rc3x_encode::MT2380_TO_MT2400;
967- break;
968-
969- case fapi2::ENUM_ATTR_MSS_FREQ_MT2666:
970- l_attrs_dimm_bc_6x[iv_port_index][iv_dimm_index] = rc3x_encode::MT2660_TO_MT2680;
971- break;
972-
973- default:
974- FAPI_ASSERT( false,
975- fapi2::MSS_INVALID_FREQ_RC()
976- .set_FREQ(iv_freq)
977- .set_RC_NUM(F0BC6X)
978- .set_DIMM_TARGET(iv_dimm),
979- "%s: Invalid frequency for BC_6X encoding received: %d",
980- mss::c_str(iv_dimm),
981- iv_freq);
982- break;
983- }
984-
985- FAPI_INF( "%s: F0BC6X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_bc_6x[iv_port_index][iv_dimm_index] );
986- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_F0BC6x, iv_mcs, l_attrs_dimm_bc_6x) );
987-
988-
989-fapi_try_exit:
990- return fapi2::current_err;
991-}
992-
993-///
994-/// @brief Determines and sets DIMM F2BCEx
995-/// @return fapi2::FAPI2_RC_SUCCESS if okay
996-///
997-fapi2::ReturnCode eff_lrdimm::dimm_f2bcex()
998-{
999- uint8_t l_attrs_dimm_f2bcex[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
1000-
1001- // Retrieve MCS attribute data
1002- FAPI_TRY( eff_dimm_ddr4_f2bcex(iv_mcs, &l_attrs_dimm_f2bcex[0][0]) );
1003-
1004- // Setup to default as we want to be in runtime mode (not DFE mode)
1005- l_attrs_dimm_f2bcex[iv_port_index][iv_dimm_index] = 0;
1006-
1007- FAPI_INF( "%s: F2BCEX setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_f2bcex[iv_port_index][iv_dimm_index] );
1008- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_F2BCEx, iv_mcs, l_attrs_dimm_f2bcex) );
1009-
1010-
1011-fapi_try_exit:
1012- return fapi2::current_err;
1013-}
1014-
1015-///
1016-/// @brief Determines and sets DIMM F5BC5x
1017-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1018-///
1019-fapi2::ReturnCode eff_lrdimm::dimm_f5bc5x()
1020-{
1021- // Taken from DDR4 (this attribute is DDR4 only) spec MRS6 section VrefDQ training: values table
1022- constexpr uint8_t JEDEC_MAX_TRAIN_VALUE = 0b00110010;
1023-
1024- // Gets the JEDEC VREFDQ range and value
1025- fapi2::buffer<uint8_t> l_train_value;
1026- fapi2::buffer<uint8_t> l_train_range;
1027- uint8_t l_attrs_dimm_f5bc5x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
1028-
1029- // Retrieve MCS attribute data
1030- FAPI_TRY( eff_dimm_ddr4_f5bc5x(iv_mcs, &l_attrs_dimm_f5bc5x[0][0]) );
1031- FAPI_TRY(mss::get_vpd_wr_vref_range_and_value(iv_dimm, l_train_range, l_train_value));
1032-
1033- FAPI_ASSERT(l_train_value <= JEDEC_MAX_TRAIN_VALUE,
1034- fapi2::MSS_INVALID_VPD_VREF_DRAM_WR_RANGE()
1035- .set_MAX(JEDEC_MAX_TRAIN_VALUE)
1036- .set_VALUE(l_train_value)
1037- .set_MCS_TARGET(iv_mcs),
1038- "%s VPD DRAM VREF value out of range max 0x%02x value 0x%02x", mss::c_str(iv_dimm),
1039- JEDEC_MAX_TRAIN_VALUE, l_train_value );
1040-
1041- // F5BC5x is just the VREF training range
1042- l_attrs_dimm_f5bc5x[iv_port_index][iv_dimm_index] = l_train_value;
1043-
1044- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_F5BC5x, iv_mcs, l_attrs_dimm_f5bc5x),
1045- "Failed setting attribute for ATTR_EFF_DIMM_DDR4_F5BC5x");
1046-
1047-fapi_try_exit:
1048- return fapi2::current_err;
1049-}
1050-
1051-///
1052-/// @brief Determines and sets DIMM F5BC6x
1053-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1054-///
1055-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
1056-fapi2::ReturnCode eff_lrdimm::dimm_f5bc6x()
1057-{
1058- constexpr uint8_t VREF_73PERCENT = 0x14;
1059- uint8_t l_attrs_dimm_f5bc6x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
1060-
1061- // Retrieve MCS attribute data
1062- FAPI_TRY( eff_dimm_ddr4_f5bc6x(iv_mcs, &l_attrs_dimm_f5bc6x[0][0]) );
1063-
1064- // F5BC6x is just the VREF training range
1065- l_attrs_dimm_f5bc6x[iv_port_index][iv_dimm_index] = VREF_73PERCENT;
1066-
1067- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_F5BC6x, iv_mcs, l_attrs_dimm_f5bc6x),
1068- "Failed setting attribute for ATTR_EFF_DIMM_DDR4_F5BC6x");
1069-
1070-fapi_try_exit:
1071- return fapi2::current_err;
1072-}
1073-
1074-///
1075-/// @brief Determines and sets DIMM F6BC4x
1076-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1077-///
1078-fapi2::ReturnCode eff_lrdimm::dimm_f6bc4x()
1079-{
1080- constexpr uint64_t WR_VREFDQ_BIT = 6;
1081- constexpr uint64_t RD_VREFDQ_BIT = 5;
1082-
1083- uint8_t l_attrs_dimm_f6bc4x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
1084- uint8_t l_buffer_rd_vref_range = 0;
1085- uint8_t l_buffer_wr_vref_range = 0;
1086- uint8_t l_wr_vref_value = 0; // Used in F5BC5x, but we need it for a helper function
1087- fapi2::buffer<uint8_t> l_temp;
1088-
1089- // Retrieve MCS attribute data
1090- FAPI_TRY( eff_dimm_ddr4_f6bc4x(iv_mcs, &l_attrs_dimm_f6bc4x[0][0]) );
1091-
1092- // Gets the WR VREF range
1093- FAPI_TRY( get_vpd_wr_vref_range_and_value(iv_dimm, l_buffer_wr_vref_range, l_wr_vref_value) );
1094-
1095- // Gets the RD VREF range
1096- FAPI_TRY( iv_spd_decoder.data_buffer_vref_dq_range(l_buffer_rd_vref_range) );
1097-
1098- // Setup to default as we want to be in runtime mode
1099- l_temp.writeBit<WR_VREFDQ_BIT>(l_buffer_wr_vref_range)
1100- .writeBit<RD_VREFDQ_BIT>(l_buffer_rd_vref_range);
1101- l_attrs_dimm_f6bc4x[iv_port_index][iv_dimm_index] = l_temp;
1102-
1103- FAPI_INF( "%s: F6BC4X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_f6bc4x[iv_port_index][iv_dimm_index] );
1104- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_F6BC4x, iv_mcs, l_attrs_dimm_f6bc4x) );
1105-
1106-
1107-fapi_try_exit:
1108- return fapi2::current_err;
1109-}
1110-
1111-///
1112-/// @brief Determines & sets effective config for DRAM output driver impedance control
1113-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1114-///
1115-// TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
1116-fapi2::ReturnCode eff_lrdimm::dram_odic()
1117-{
1118- uint8_t l_dram_odic[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
1119- FAPI_TRY( eff_dram_odic(iv_mcs, &l_dram_odic[0][0][0]));
1120-
1121- // Updates DRAM ODIC with the VPD value
1122- for(uint8_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
1123- {
1124- // JEDEC setting - taken from SI spreadsheet
1125- l_dram_odic[iv_port_index][iv_dimm_index][l_rank] = fapi2::ENUM_ATTR_MSS_VPD_MT_DRAM_DRV_IMP_DQ_DQS_OHM34;
1126- }
1127-
1128- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DRAM_ODIC, iv_mcs, l_dram_odic) );
1129-
1130-fapi_try_exit:
1131- return fapi2::current_err;
1132-}
1133-
Dan Crowell51b199d2018-11-29 10:09:57 -06001134-///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001135 /// @brief Grab the VPD blobs and decode into attributes
1136 /// @param[in] i_target FAPI2 target (MCS)
Dan Crowell51b199d2018-11-29 10:09:57 -06001137 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Stewart Smitha55c02c2018-11-27 11:36:05 +11001138@@ -5881,116 +5562,4 @@ fapi2::ReturnCode eff_dimm::phy_seq_refresh()
1139 iv_mcs,
1140 UINT8_VECTOR_TO_1D_ARRAY(l_phy_seq_ref_enable, PORTS_PER_MCS));
1141 }
1142-
1143-///
1144-/// @brief Determines & sets effective ODT write values
1145-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1146-///
1147-fapi2::ReturnCode eff_rdimm::odt_wr()
1148-{
1149- uint8_t l_mcs_attr[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
1150- uint8_t l_vpd_odt[MAX_RANK_PER_DIMM];
1151-
1152- // Gets the VPD value
1153- FAPI_TRY( mss::vpd_mt_odt_wr(iv_dimm, &(l_vpd_odt[0])));
1154- FAPI_TRY( eff_odt_wr( iv_mcs, &(l_mcs_attr[0][0][0])) );
1155-
1156-
1157- memcpy(&(l_mcs_attr[iv_port_index][iv_dimm_index][0]), l_vpd_odt, MAX_RANK_PER_DIMM);
1158-
1159- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_MSS_EFF_ODT_WR, iv_mcs, l_mcs_attr) );
1160-
1161-fapi_try_exit:
1162- return fapi2::current_err;
1163-}
1164-
1165-///
1166-/// @brief Determines & sets effective ODT write values
1167-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1168-///
1169-fapi2::ReturnCode eff_lrdimm::odt_wr()
1170-{
1171- constexpr uint8_t ODT_2R_1DROP_VALUES[MAX_RANK_PER_DIMM] =
1172- {
1173- 0x40,
1174- 0x80,
1175- 0x00,
1176- 0x00,
1177- };
1178- uint8_t l_mcs_attr[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
1179- uint8_t l_vpd_odt[MAX_RANK_PER_DIMM];
1180-
1181- // Gets the VPD value
1182- FAPI_TRY( mss::vpd_mt_odt_wr(iv_dimm, &(l_vpd_odt[0])));
1183- FAPI_TRY( eff_odt_wr( iv_mcs, &(l_mcs_attr[0][0][0])) );
1184-
1185- // Loops through and sets/updates all ranks
1186- for(uint64_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
1187- {
1188- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
1189- // So, here we do a bitwise or of our LR settings and our VPD settings
1190- // The VPD contains the host <-> buffer settings
1191- // The constant contains the buffer <-> DRAM
1192- // Due to how the ODT functions, we need to or them
1193- l_mcs_attr[iv_port_index][iv_dimm_index][l_rank] = l_vpd_odt[l_rank] | ODT_2R_1DROP_VALUES[l_rank];
1194- }
1195-
1196- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_MSS_EFF_ODT_WR, iv_mcs, l_mcs_attr) );
1197-
1198-fapi_try_exit:
1199- return fapi2::current_err;
1200-}
1201-
1202-///
1203-/// @brief Determines & sets effective ODT read values
1204-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1205-///
1206-fapi2::ReturnCode eff_rdimm::odt_rd()
1207-{
1208- uint8_t l_mcs_attr[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
1209- uint8_t l_vpd_odt[MAX_RANK_PER_DIMM];
1210-
1211- // Gets the VPD value
1212- FAPI_TRY( mss::vpd_mt_odt_rd(iv_dimm, &(l_vpd_odt[0])));
1213- FAPI_TRY( eff_odt_rd( iv_mcs, &(l_mcs_attr[0][0][0])) );
1214-
1215-
1216- memcpy(&(l_mcs_attr[iv_port_index][iv_dimm_index][0]), l_vpd_odt, MAX_RANK_PER_DIMM);
1217-
1218- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_MSS_EFF_ODT_RD, iv_mcs, l_mcs_attr) );
1219-
1220-fapi_try_exit:
1221- return fapi2::current_err;
1222-}
1223-
1224-///
1225-/// @brief Determines & sets effective ODT read values
1226-/// @return fapi2::FAPI2_RC_SUCCESS if okay
1227-///
1228-fapi2::ReturnCode eff_lrdimm::odt_rd()
1229-{
1230- uint8_t l_mcs_attr[PORTS_PER_MCS][MAX_DIMM_PER_PORT][MAX_RANK_PER_DIMM] = {};
1231- uint8_t l_vpd_odt[MAX_RANK_PER_DIMM];
1232-
1233- // Gets the VPD value
1234- FAPI_TRY( mss::vpd_mt_odt_rd(iv_dimm, &(l_vpd_odt[0])));
1235- FAPI_TRY( eff_odt_rd( iv_mcs, &(l_mcs_attr[0][0][0])) );
1236-
1237- // Loops through and sets/updates all ranks
1238- for(uint64_t l_rank = 0; l_rank < MAX_RANK_PER_DIMM; ++l_rank)
1239- {
1240- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
1241- // So, here we do a bitwise or of our LR settings and our VPD settings
1242- // The VPD contains the host <-> buffer settings
1243- // The constant contains the buffer <-> DRAM
1244- // Due to how the ODT functions, we need to or them
1245- l_mcs_attr[iv_port_index][iv_dimm_index][l_rank] = l_vpd_odt[l_rank] | 0x00;
1246- }
1247-
1248- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_MSS_EFF_ODT_RD, iv_mcs, l_mcs_attr) );
1249-
1250-fapi_try_exit:
1251- return fapi2::current_err;
1252-}
1253-
1254 }//mss
1255diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H
Dan Crowell51b199d2018-11-29 10:09:57 -06001256index 693e14a..7e33c0b 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +11001257--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H
1258+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.H
Dan Crowell51b199d2018-11-29 10:09:57 -06001259@@ -291,12 +291,6 @@ class eff_dimm
Stewart Smitha55c02c2018-11-27 11:36:05 +11001260 fapi2::ReturnCode dram_dqs_time();
1261
Dan Crowell51b199d2018-11-29 10:09:57 -06001262 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001263- /// @brief Determines & sets effective config for DRAM output driver impedance control
1264- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1265- ///
1266- virtual fapi2::ReturnCode dram_odic() = 0;
1267-
Dan Crowell51b199d2018-11-29 10:09:57 -06001268- ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001269 /// @brief Determines & sets effective config for tCCD_L
1270 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001271 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001272@@ -534,7 +528,7 @@ class eff_dimm
1273 /// @brief Determines & sets effective config for Vref DQ Train Value and Range
1274 /// @return fapi2::FAPI2_RC_SUCCESS if okay
1275 ///
1276- virtual fapi2::ReturnCode vref_dq_train_value_and_range();
1277+ fapi2::ReturnCode vref_dq_train_value_and_range();
1278
1279 ///
1280 /// @brief Determines & sets effective config for Vref DQ Train Enable
1281@@ -571,18 +565,6 @@ class eff_dimm
1282 /// @return fapi2::FAPI2_RC_SUCCESS if okay
1283 ///
1284 fapi2::ReturnCode odt_input_buffer();
1285-
1286- ///
1287- /// @brief Determines & sets effective ODT write values
1288- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1289- ///
1290- virtual fapi2::ReturnCode odt_wr() = 0;
1291-
1292- ///
1293- /// @brief Determines & sets effective ODT read values
1294- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1295- ///
1296- virtual fapi2::ReturnCode odt_rd() = 0;
1297 ///
1298 /// @brief Determines & sets effective config for data_mask
1299 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001300@@ -909,12 +891,6 @@ class eff_dimm
Stewart Smitha55c02c2018-11-27 11:36:05 +11001301 virtual fapi2::ReturnCode dimm_bc05() = 0;
1302
Dan Crowell51b199d2018-11-29 10:09:57 -06001303 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001304- /// @brief Determines and sets DIMM BC06
1305- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1306- ///
1307- virtual fapi2::ReturnCode dimm_bc06() = 0;
1308-
Dan Crowell51b199d2018-11-29 10:09:57 -06001309- ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001310 /// @brief Determines and sets DIMM BC07
1311 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001312 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001313@@ -969,43 +945,6 @@ class eff_dimm
1314 ///
1315 virtual fapi2::ReturnCode dimm_bc0f() = 0;
1316
1317- ///
1318- /// @brief Determines and sets DIMM F0BC1x
1319- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1320- ///
1321- virtual fapi2::ReturnCode dimm_f0bc1x() = 0;
1322-
1323- ///
1324- /// @brief Determines and sets DIMM F0BC6x
1325- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1326- ///
1327- virtual fapi2::ReturnCode dimm_f0bc6x() = 0;
1328-
1329- ///
1330- /// @brief Determines and sets DIMM F2BCEx
1331- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1332- ///
1333- virtual fapi2::ReturnCode dimm_f2bcex() = 0;
1334-
1335- ///
1336- /// @brief Determines and sets DIMM F5BC5x
1337- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1338- ///
1339- virtual fapi2::ReturnCode dimm_f5bc5x() = 0;
1340-
1341- ///
1342- /// @brief Determines and sets DIMM F5BC6x
1343- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1344- ///
1345- virtual fapi2::ReturnCode dimm_f5bc6x() = 0;
1346-
1347-
1348- ///
1349- /// @brief Determines and sets DIMM F6BC4x
1350- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1351- ///
1352- virtual fapi2::ReturnCode dimm_f6bc4x() = 0;
1353-
1354 private:
1355
1356 ///
1357@@ -1076,25 +1015,6 @@ class eff_lrdimm : public eff_dimm
1358 ///
1359 virtual ~eff_lrdimm() = default;
1360
1361-
1362- ///
1363- /// @brief Determines & sets effective config for Vref DQ Train Value and Range
1364- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1365- ///
1366- virtual fapi2::ReturnCode vref_dq_train_value_and_range() final;
1367-
1368- ///
1369- /// @brief Determines & sets effective ODT write values
1370- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1371- ///
1372- virtual fapi2::ReturnCode odt_wr() final;
1373-
1374- ///
1375- /// @brief Determines & sets effective ODT read values
1376- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1377- ///
1378- virtual fapi2::ReturnCode odt_rd() final;
1379-
1380 ///
1381 /// @brief Sets the RTT_NOM value from SPD
1382 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001383@@ -1117,12 +1037,6 @@ class eff_lrdimm : public eff_dimm
Stewart Smitha55c02c2018-11-27 11:36:05 +11001384 virtual fapi2::ReturnCode dram_rtt_park() final;
1385
Dan Crowell51b199d2018-11-29 10:09:57 -06001386 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001387- /// @brief Determines & sets effective config for DRAM output driver impedance control
1388- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1389- ///
1390- virtual fapi2::ReturnCode dram_odic() final;
1391-
Dan Crowell51b199d2018-11-29 10:09:57 -06001392- ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001393 /// @brief Determines and sets DIMM BC00
1394 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Stewart Smitha55c02c2018-11-27 11:36:05 +11001395 ///
Dan Crowell51b199d2018-11-29 10:09:57 -06001396@@ -1159,12 +1073,6 @@ class eff_lrdimm : public eff_dimm
Stewart Smitha55c02c2018-11-27 11:36:05 +11001397 virtual fapi2::ReturnCode dimm_bc05() final;
1398
Dan Crowell51b199d2018-11-29 10:09:57 -06001399 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001400- /// @brief Determines and sets DIMM BC09
1401- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1402- ///
1403- virtual fapi2::ReturnCode dimm_bc06() final;
1404-
Dan Crowell51b199d2018-11-29 10:09:57 -06001405- ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001406 /// @brief Determines and sets DIMM BC07
1407 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001408 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001409@@ -1217,42 +1125,6 @@ class eff_lrdimm : public eff_dimm
1410 /// @return fapi2::FAPI2_RC_SUCCESS if okay
1411 ///
1412 virtual fapi2::ReturnCode dimm_bc0f() final;
1413-
1414- ///
1415- /// @brief Determines and sets DIMM F0BC1x
1416- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1417- ///
1418- virtual fapi2::ReturnCode dimm_f0bc1x() final;
1419-
1420- ///
1421- /// @brief Determines and sets DIMM F0BC6x
1422- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1423- ///
1424- virtual fapi2::ReturnCode dimm_f0bc6x() final;
1425-
1426- ///
1427- /// @brief Determines and sets DIMM F2BCex
1428- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1429- ///
1430- virtual fapi2::ReturnCode dimm_f2bcex() final;
1431-
1432- ///
1433- /// @brief Determines and sets DIMM F5BC5x
1434- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1435- ///
1436- virtual fapi2::ReturnCode dimm_f5bc5x() final;
1437-
1438- ///
1439- /// @brief Determines and sets DIMM F5BC6x
1440- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1441- ///
1442- virtual fapi2::ReturnCode dimm_f5bc6x() final;
1443-
1444- ///
1445- /// @brief Determines and sets DIMM F6BC4x
1446- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1447- ///
1448- virtual fapi2::ReturnCode dimm_f6bc4x() final;
1449 };
1450
1451 ///
Dan Crowell51b199d2018-11-29 10:09:57 -06001452@@ -1398,18 +1270,6 @@ class eff_rdimm : public eff_dimm
Stewart Smitha55c02c2018-11-27 11:36:05 +11001453 ~eff_rdimm() = default;
1454
Dan Crowell51b199d2018-11-29 10:09:57 -06001455 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001456- /// @brief Determines & sets effective ODT write values
1457- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1458- ///
1459- virtual fapi2::ReturnCode odt_wr() final;
1460-
1461- ///
1462- /// @brief Determines & sets effective ODT read values
1463- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1464- ///
1465- virtual fapi2::ReturnCode odt_rd() final;
1466-
Dan Crowell51b199d2018-11-29 10:09:57 -06001467- ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001468 /// @brief Sets the RTT_NOM value from SPD
1469 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001470 /// @note used for MRS01
1471@@ -1431,12 +1291,6 @@ class eff_rdimm : public eff_dimm
Stewart Smitha55c02c2018-11-27 11:36:05 +11001472 fapi2::ReturnCode dram_rtt_park() final;
1473
Dan Crowell51b199d2018-11-29 10:09:57 -06001474 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001475- /// @brief Determines & sets effective config for DRAM output driver impedance control
1476- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1477- ///
1478- virtual fapi2::ReturnCode dram_odic() final;
1479-
Dan Crowell51b199d2018-11-29 10:09:57 -06001480- ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001481 /// @brief Determines and sets DIMM BC00
1482 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001483 ///
1484@@ -1491,15 +1345,6 @@ class eff_rdimm : public eff_dimm
Stewart Smitha55c02c2018-11-27 11:36:05 +11001485 }
1486
Dan Crowell51b199d2018-11-29 10:09:57 -06001487 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001488- /// @brief Determines and sets DIMM BC06
1489- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1490- ///
1491- fapi2::ReturnCode dimm_bc06() final
1492- {
1493- return fapi2::FAPI2_RC_SUCCESS;
1494- }
1495-
Dan Crowell51b199d2018-11-29 10:09:57 -06001496- ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001497 /// @brief Determines and sets DIMM BC07
1498 /// @return fapi2::FAPI2_RC_SUCCESS if okay
Dan Crowell51b199d2018-11-29 10:09:57 -06001499 ///
Stewart Smitha55c02c2018-11-27 11:36:05 +11001500@@ -1579,61 +1424,6 @@ class eff_rdimm : public eff_dimm
1501 {
1502 return fapi2::FAPI2_RC_SUCCESS;
1503 }
1504-
1505- ///
1506- /// @brief Determines and sets DIMM F0BC1x
1507- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1508- ///
1509- virtual fapi2::ReturnCode dimm_f0bc1x() final
1510- {
1511- return fapi2::FAPI2_RC_SUCCESS;
1512- }
1513-
1514- ///
1515- /// @brief Determines and sets DIMM F0BC6x
1516- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1517- ///
1518- virtual fapi2::ReturnCode dimm_f0bc6x() final
1519- {
1520- return fapi2::FAPI2_RC_SUCCESS;
1521- }
1522-
1523- ///
1524- /// @brief Determines and sets DIMM F2BCEx
1525- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1526- ///
1527- virtual fapi2::ReturnCode dimm_f2bcex() final
1528- {
1529- return fapi2::FAPI2_RC_SUCCESS;
1530- }
1531-
1532- ///
1533- /// @brief Determines and sets DIMM F5BC5x
1534- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1535- ///
1536- virtual fapi2::ReturnCode dimm_f5bc5x() final
1537- {
1538- return fapi2::FAPI2_RC_SUCCESS;
1539- }
1540-
1541- ///
1542- /// @brief Determines and sets DIMM F5BC6x
1543- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1544- ///
1545- virtual fapi2::ReturnCode dimm_f5bc6x() final
1546- {
1547- return fapi2::FAPI2_RC_SUCCESS;
1548- }
1549-
1550-
1551- ///
1552- /// @brief Determines and sets DIMM F6BC4x
1553- /// @return fapi2::FAPI2_RC_SUCCESS if okay
1554- ///
1555- virtual fapi2::ReturnCode dimm_f6bc4x() final
1556- {
1557- return fapi2::FAPI2_RC_SUCCESS;
1558- }
1559 };
1560 }//mss
1561
Stewart Smitha55c02c2018-11-27 11:36:05 +11001562diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C b/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C
Dan Crowell51b199d2018-11-29 10:09:57 -06001563index c8f5940..187b60c 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +11001564--- a/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C
1565+++ b/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C
1566@@ -1255,7 +1255,7 @@ fapi2::ReturnCode reset_odt_rd_config( const fapi2::Target<fapi2::TARGET_TYPE_MC
1567
1568 const uint64_t l_dimm_count = count_dimm(i_target);
1569
1570- FAPI_TRY( mss::eff_odt_rd(i_target, &(l_odt_rd[0][0])) );
1571+ FAPI_TRY( mss::vpd_mt_odt_rd(i_target, &(l_odt_rd[0][0])) );
1572
1573 return reset_odt_rd_config_helper<fapi2::TARGET_TYPE_MCA, MAX_DIMM_PER_PORT, MAX_RANK_PER_DIMM>(
1574 i_target, l_dimm_count, l_odt_rd);
1575@@ -1276,7 +1276,7 @@ fapi2::ReturnCode reset_odt_wr_config( const fapi2::Target<fapi2::TARGET_TYPE_MC
1576
1577 const uint64_t l_dimm_count = count_dimm(i_target);
1578
1579- FAPI_TRY( mss::eff_odt_wr(i_target, &(l_odt_wr[0][0])) );
1580+ FAPI_TRY( mss::vpd_mt_odt_wr(i_target, &(l_odt_wr[0][0])) );
1581
1582 return reset_odt_wr_config_helper<fapi2::TARGET_TYPE_MCA, MAX_DIMM_PER_PORT, MAX_RANK_PER_DIMM>(
1583 i_target, l_dimm_count, l_odt_wr);
1584@@ -1310,7 +1310,7 @@ fapi2::ReturnCode override_odt_wr_config( const fapi2::Target<fapi2::TARGET_TYPE
1585 i_rank );
1586
1587 // read the attributes
1588- FAPI_TRY( mss::eff_odt_wr(i_target, &(l_odt_wr[0][0])) );
1589+ FAPI_TRY( mss::vpd_mt_odt_wr(i_target, &(l_odt_wr[0][0])) );
1590
1591 // set the ODTs for the rank selected
1592 // The ODT encoding is (for mranks only)
1593diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H b/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H
Dan Crowell51b199d2018-11-29 10:09:57 -06001594index d1effb8..e7999e9 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +11001595--- a/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H
1596+++ b/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H
Dan Crowell51b199d2018-11-29 10:09:57 -06001597@@ -153,7 +153,6 @@ enum ffdc_function_codes
Stewart Smitha55c02c2018-11-27 11:36:05 +11001598 DRAM_BANK_BITS = 25,
1599 DRAM_ROW_BITS = 26,
1600 SOFT_POST_PACKAGE_REPAIR = 27,
1601- EFF_BC07 = 28,
1602
1603 // Used in fw_mark_store.H for MSS_INVALID_RANK_PASSED
1604 FWMS_READ = 30,
1605diff --git a/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C b/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C
1606old mode 100755
1607new mode 100644
Dan Crowell51b199d2018-11-29 10:09:57 -06001608index 6b078f9..c05c519
Stewart Smitha55c02c2018-11-27 11:36:05 +11001609--- a/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C
1610+++ b/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C
1611@@ -98,12 +98,6 @@ fapi2::ReturnCode p9_mss_eff_config( const fapi2::Target<fapi2::TARGET_TYPE_MCS>
1612
1613 FAPI_INF("Running eff_config on %s", mss::c_str(l_dimm) );
1614
1615- FAPI_TRY( l_eff_dimm->dram_odic(),
1616- "Failed dram_odic for %s", mss::c_str(l_dimm) );
1617- FAPI_TRY( l_eff_dimm->odt_wr(),
1618- "Failed odt_wr for %s", mss::c_str(l_dimm) );
1619- FAPI_TRY( l_eff_dimm->odt_rd(),
1620- "Failed odt_rd for %s", mss::c_str(l_dimm) );
1621 FAPI_TRY( l_eff_dimm->rcd_mfg_id(),
1622 "Failed rcd_mfg_id for %s", mss::c_str(l_dimm) );
1623 FAPI_TRY( l_eff_dimm->register_type(),
1624@@ -306,8 +300,6 @@ fapi2::ReturnCode p9_mss_eff_config( const fapi2::Target<fapi2::TARGET_TYPE_MCS>
1625 "Failed dimm_bc04 for %s", mss::c_str(l_dimm) );
1626 FAPI_TRY( l_eff_dimm->dimm_bc05(),
1627 "Failed dimm_bc05 for %s", mss::c_str(l_dimm) );
1628- FAPI_TRY( l_eff_dimm->dimm_bc06(),
1629- "Failed dimm_bc06 for %s", mss::c_str(l_dimm) );
1630 FAPI_TRY( l_eff_dimm->dimm_bc07(),
1631 "Failed dimm_bc07 for %s", mss::c_str(l_dimm) );
1632 FAPI_TRY( l_eff_dimm->dimm_bc08(),
1633@@ -340,18 +332,6 @@ fapi2::ReturnCode p9_mss_eff_config( const fapi2::Target<fapi2::TARGET_TYPE_MCS>
1634 "Failed nibble_map for %s", mss::c_str(l_dimm) );
1635 FAPI_TRY( l_eff_dimm->wr_crc(),
1636 "Failed wr_crc for %s", mss::c_str(l_dimm) );
1637- FAPI_TRY( l_eff_dimm->dimm_f0bc1x(),
1638- "Failed dimm_f0bc1x for %s", mss::c_str(l_dimm) );
1639- FAPI_TRY( l_eff_dimm->dimm_f0bc6x(),
1640- "Failed dimm_f0bc6x for %s", mss::c_str(l_dimm) );
1641- FAPI_TRY( l_eff_dimm->dimm_f2bcex(),
1642- "Failed dimm_f2bcex for %s", mss::c_str(l_dimm) );
1643- FAPI_TRY( l_eff_dimm->dimm_f5bc5x(),
1644- "Failed dimm_f5bc5x for %s", mss::c_str(l_dimm) );
1645- FAPI_TRY( l_eff_dimm->dimm_f5bc6x(),
1646- "Failed dimm_f5bc6x for %s", mss::c_str(l_dimm) );
1647- FAPI_TRY( l_eff_dimm->dimm_f6bc4x(),
1648- "Failed dimm_f6bc4x for %s", mss::c_str(l_dimm) );
1649
1650 // Sets up the calibration steps
1651 FAPI_TRY( l_eff_dimm->cal_step_enable(),
Stewart Smitha55c02c2018-11-27 11:36:05 +11001652diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_eff_config.xml b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_eff_config.xml
Dan Crowell51b199d2018-11-29 10:09:57 -06001653index 9d9aea1..965e0de 100644
Stewart Smitha55c02c2018-11-27 11:36:05 +11001654--- a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_eff_config.xml
1655+++ b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_eff_config.xml
Dan Crowell51b199d2018-11-29 10:09:57 -06001656@@ -486,24 +486,6 @@
Stewart Smitha55c02c2018-11-27 11:36:05 +11001657 </hwpError>
1658
Dan Crowell51b199d2018-11-29 10:09:57 -06001659 <hwpError>
Stewart Smitha55c02c2018-11-27 11:36:05 +11001660- <rc>RC_MSS_INVALID_RTT_PARK_CALCULATIONS</rc>
1661- <description>
1662- Calculated the rtt_park_index into the VPD attribute incorrectly
1663- </description>
1664- <ffdc>RANK</ffdc>
1665- <ffdc>RTT_PARK_INDEX</ffdc>
1666- <ffdc>RTT_PARK_FROM_VPD</ffdc>
1667- <ffdc>DIMM_TARGET</ffdc>
1668- <callout>
1669- <hw>
1670- <hwid>VPD_PART</hwid>
1671- <refTarget>MCS_TARGET</refTarget>
1672- </hw>
1673- <priority>HIGH</priority>
1674- </callout>
1675- </hwpError>
1676-
Dan Crowell51b199d2018-11-29 10:09:57 -06001677- <hwpError>
Stewart Smitha55c02c2018-11-27 11:36:05 +11001678 <rc>RC_MSS_INVALID_RTT_NOM_CALCULATIONS</rc>
1679 <description>
Dan Crowell51b199d2018-11-29 10:09:57 -06001680 Calculated the rtt_nom_index into the VPD attribute incorrectly
Stewart Smitha55c02c2018-11-27 11:36:05 +11001681--
Dan Crowell51b199d2018-11-29 10:09:57 -060016821.8.2.2
Stewart Smitha55c02c2018-11-27 11:36:05 +11001683