summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C
blob: 9a8217e5272ea029e5d02071a49f8f0975091f4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: src/import/chips/p9/procedures/hwp/memory/p9_mss_eff_config.C $ */
/*                                                                        */
/* OpenPOWER HostBoot Project                                             */
/*                                                                        */
/* Contributors Listed Below - COPYRIGHT 2015,2019                        */
/* [+] International Business Machines Corp.                              */
/*                                                                        */
/*                                                                        */
/* Licensed under the Apache License, Version 2.0 (the "License");        */
/* you may not use this file except in compliance with the License.       */
/* You may obtain a copy of the License at                                */
/*                                                                        */
/*     http://www.apache.org/licenses/LICENSE-2.0                         */
/*                                                                        */
/* Unless required by applicable law or agreed to in writing, software    */
/* distributed under the License is distributed on an "AS IS" BASIS,      */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
/* implied. See the License for the specific language governing           */
/* permissions and limitations under the License.                         */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */

///
/// @file p9_mss_eff_config.C
/// @brief Command and Control for the memory subsystem - populate attributes
///
// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com>
// *HWP HWP Backup: Jacob Harvey <jlharvey@us.ibm.com>
// *HWP Team: Memory
// *HWP Level: 3
// *HWP Consumed by: FSP:HB

#include <p9_mss_eff_config.H>

// std
#include <vector>

// fapi2
#include <fapi2.H>

// mss lib
#include <lib/shared/nimbus_defaults.H>
#include <generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H>
#include <generic/memory/lib/utils/pos.H>
#include <lib/utils/checker.H>
#include <lib/utils/nimbus_find.H>
#include <lib/shared/mss_kind.H>
#include <lib/dimm/eff_dimm.H>
#include <lib/eff_config/plug_rules.H>
#include <generic/memory/lib/utils/count_dimm.H>

///
/// @brief Configure the attributes for each controller
/// @param[in] i_target the controller (e.g., MCS)
/// @param[in] i_decode_spd_only options to set VPD and SPD attrs only
/// @return FAPI2_RC_SUCCESS iff ok
///
fapi2::ReturnCode p9_mss_eff_config( const fapi2::Target<fapi2::TARGET_TYPE_MCS>& i_target,
                                     const bool i_decode_spd_only )
{
    if ( mss::count_dimm(i_target) == 0 )
    {
        FAPI_INF("No DIMMs found on %s... Skipping p9_mss_eff_config", mss::c_str(i_target));
        return fapi2::FAPI2_RC_SUCCESS;
    }

    std::vector< mss::spd::facade > l_spd_facades;
    FAPI_TRY( get_spd_decoder_list(i_target, l_spd_facades) );

    // Need to check dead load before we get the VPD.
    // MR and MT VPD depends on DIMM ranks and freaks out if it receives 0 ranks from DIMM 0 and 1 or more ranks for DIMM 1
    FAPI_TRY( mss::plug_rule::check_dead_load(i_target),
              "Failed check_dead_load for %s", mss::c_str(i_target) );
    FAPI_TRY( mss::plug_rule::empty_slot_zero(i_target),
              "Failed empty_slot_zero for %s", mss::c_str(i_target));

    // We need to decode the VPD. We don't do this in the ctor as we need
    // the rank information and for that we need the SPD caches (which we get when we populate the cache.)
    // However, we need to do the VPD decode before the others so that they might
    // be able to use VPD information to make decisions about setting up eff attributes.
    if( !i_decode_spd_only )
    {
        // Always set VPD attributes unless we enable the SPD_ONLY flag
        // Enables skipping VPD decoder when a valid VPD template isn't available
        FAPI_TRY( mss::eff_dimm::decode_vpd(i_target),
                  "Unable to decode VPD for %s", mss::c_str(i_target) );
    }

    // First we process the ODIC and ODT values since we need these initialized for both DIMM
    // on a port if we're in a dual-drop config
    for( const auto& l_spd : l_spd_facades )
    {
        const auto l_dimm = l_spd.get_dimm_target();

        std::shared_ptr<mss::eff_dimm> l_eff_dimm;
        FAPI_TRY( mss::eff_dimm::factory( l_spd, l_eff_dimm),
                  "Failed factory for %s",  mss::c_str(l_dimm));

        FAPI_INF("Setting up ODIC and ODT attributes on %s", mss::c_str(l_dimm) );

        FAPI_TRY(  l_eff_dimm->lrdimm_training_pattern(),
                   "Failed lrdimm_training_pattern for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->dram_odic(),
                   "Failed dram_odic for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->odt_wr(),
                   "Failed odt_wr for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->odt_rd(),
                   "Failed odt_rd for %s", mss::c_str(l_dimm) );
    }

    // Now we continue with the remainder of eff_config
    for( const auto& l_spd : l_spd_facades )
    {
        const auto l_dimm = l_spd.get_dimm_target();

        std::shared_ptr<mss::eff_dimm> l_eff_dimm;
        FAPI_TRY( mss::eff_dimm::factory( l_spd, l_eff_dimm),
                  "Failed factory for %s",  mss::c_str(l_dimm));

        FAPI_INF("Running eff_config on %s", mss::c_str(l_dimm) );

        FAPI_TRY(  l_eff_dimm->phy_rlo(),
                   "Failed phy_rlo for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->phy_wlo(),
                   "Failed phy_wlo for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->rcd_mfg_id(),
                  "Failed rcd_mfg_id for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->register_type(),
                  "Failed register_type for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->register_rev(),
                  "Failed register_rev for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_mfg_id(),
                  "Failed dram_mfg_id for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_width(),
                  "Failed dram_width for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_density(),
                  "Failed dram_density for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->ranks_per_dimm(),
                  "Failed ranks_per_dimm for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->prim_die_count(),
                  "Failed prim_die_count for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->primary_stack_type(),
                  "Failed primary_stack_type for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_size(),
                  "Failed dimm_size for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trefi(),
                  "Failed dram_trefi for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trfc(),
                  "Failed dram_trfc for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trfc_dlr(),
                  "Failed dram_trfc_dlr for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->rcd_mirror_mode(),
                  "Failed rcd_mirror_mode for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_bank_bits(),
                  "Failed dram_bank_bits for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_row_bits(),
                  "Failed dram_row_bits for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_dqs_time(),
                  "Failed dram_dqs_time for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_tccd_l(),
                  "Failed dram_tccd_l for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc00(),
                  "Failed dimm_rc00 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc01(),
                  "Failed dimm_rc01 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc02(),
                  "Failed dimm_rc02 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc03(),
                  "Failed dimm_rc03 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc04(),
                  "Failed dimm_rc04 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc05(),
                  "Failed dimm_rc05 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc06_07(),
                  "Failed dimm_rc06_07 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc08(),
                  "Failed dimm_rc08 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc09(),
                  "Failed dimm_rc09 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc0a(),
                  "Failed dimm_rc0a for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc0b(),
                  "Failed dimm_rc0b for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc0c(),
                  "Failed dimm_rc0c for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc0d(),
                  "Failed dimm_rc0d for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc0e(),
                  "Failed dimm_rc0e for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc0f(),
                  "Failed dimm_rc0f for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc1x(),
                  "Failed dimm_rc1x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc2x(),
                  "Failed dimm_rc2x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc3x(),
                  "Failed dimm_rc3x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc4x(),
                  "Failed dimm_rc4x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc5x(),
                  "Failed dimm_rc5x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc6x(),
                  "Failed dimm_rc6x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc7x(),
                  "Failed dimm_rc7x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc8x(),
                  "Failed dimm_rc8x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rc9x(),
                  "Failed dimm_rc9x for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rcax(),
                  "Failed dimm_rcax for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_rcbx(),
                  "Failed dimm_rcbx for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_twr(),
                  "Failed dram_twr for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->read_burst_type(),
                  "Failed read_burst_type for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_tm(),
                  "Failed dram_tm for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_cwl(),
                  "Failed dram_cwl for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_lpasr(),
                  "Failed dram_lpasr for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dll_enable(),
                  "Failed dll_enable for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dll_reset(),
                  "Failed dll_reset for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->write_level_enable(),
                  "Failed write_level_enable for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->output_buffer(),
                  "Failed output_buffer for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->vref_dq_train_value_and_range(),
                  "Failed vref_dq_train_value_and_range for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->vref_dq_train_enable(),
                  "Failed vref_dq_train_enable for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->ca_parity_latency(),
                  "Failed ca_parity_latency for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->ca_parity_error_status(),
                  "Failed ca_parity_error_status for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->ca_parity(),
                  "Failed ca_parity for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->crc_error_clear(),
                  "Failed crc_error_clear for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->odt_input_buffer(),
                  "Failed odt_input_buffer for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->post_package_repair(),
                  "Failed post_package_repair for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->soft_post_package_repair(),
                  "Failed soft_post_package_repair for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->read_preamble_train(),
                  "Failed read_preamble_train for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->read_preamble(),
                  "Failed read_preamble for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->write_preamble(),
                  "Failed write_preamble for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->self_refresh_abort(),
                  "Failed self_refresh_abort for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->cs_to_cmd_addr_latency(),
                  "Failed cs_to_cmd_addr_latency for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->internal_vref_monitor(),
                  "Failed internal_vref_monitor for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->max_powerdown_mode(),
                  "Failed max_powerdown_mode for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->mpr_read_format(),
                  "Failed mpr_read_format for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->temp_readout(),
                  "Failed temp_readout for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->crc_wr_latency(),
                  "Failed crc_wr_latency for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->per_dram_addressability(),
                  "Failed per_dram_addressability for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->geardown_mode(),
                  "Failed geardown_mode for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->mpr_page(),
                  "Failed mpr_page for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->mpr_mode(),
                  "Failed mpr_mode for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->write_crc(),
                  "Failed write_crc for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->zqcal_interval(),
                  "Failed zqcal_interval for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->memcal_interval(),
                  "Failed memcal_interval for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trp(),
                  "Failed dram_trp for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trcd(),
                  "Failed dram_trcd for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trc(),
                  "Failed dram_trc for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_twtr_l(),
                  "Failed dram_twtr_l for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_twtr_s(),
                  "Failed dram_twtr_s for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trrd_s(),
                  "Failed dram_trrd_s for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trrd_l(),
                  "Failed dram_trrd_l for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trrd_dlr(),
                  "Failed dram_trrd_dlr for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_tfaw(),
                  "Failed dram_tfaw for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_tfaw_dlr(),
                  "Failed dram_tfaw_dlr for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_tras(),
                  "Failed dram_tras for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_trtp(),
                  "Failed dram_trtp for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->read_dbi(),
                  "Failed read_dbi for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->write_dbi(),
                  "Failed write_dbi for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->additive_latency(),
                  "Failed additive_latency for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->data_mask(),
                  "Failed data_mask for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc00(),
                  "Failed dimm_bc00 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc01(),
                  "Failed dimm_bc01 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc02(),
                  "Failed dimm_bc02 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc03(),
                  "Failed dimm_bc03 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc04(),
                  "Failed dimm_bc04 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc05(),
                  "Failed dimm_bc05 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc06(),
                  "Failed dimm_bc06 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc07(),
                  "Failed dimm_bc07 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc08(),
                  "Failed dimm_bc08 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc09(),
                  "Failed dimm_bc09 for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc0a(),
                  "Failed dimm_bc0a for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc0b(),
                  "Failed dimm_bc0b for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc0c(),
                  "Failed dimm_bc0c for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc0d(),
                  "Failed dimm_bc0d for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc0e(),
                  "Failed dimm_bc0e for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dimm_bc0f(),
                  "Failed dimm_bc0f for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_rtt_nom (),
                  "Failed dram_rtt_nom for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_rtt_wr  (),
                  "Failed dram_rtt_wr for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->dram_rtt_park(),
                  "Failed dram_rtt_park for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->phy_seq_refresh(),
                   "Failed phy_seq_refresh for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->package_rank_map(),
                   "Failed package_rank_map for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->nibble_map(),
                   "Failed nibble_map for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->wr_crc(),
                   "Failed wr_crc for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->dimm_f0bc1x(),
                   "Failed dimm_f0bc1x for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->dimm_f0bc6x(),
                   "Failed dimm_f0bc6x for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->dimm_f2bcex(),
                   "Failed dimm_f2bcex for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->dimm_f5bc5x(),
                   "Failed dimm_f5bc5x for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->dimm_f5bc6x(),
                   "Failed dimm_f5bc6x for %s", mss::c_str(l_dimm) );
        FAPI_TRY(  l_eff_dimm->dimm_f6bc4x(),
                   "Failed dimm_f6bc4x for %s", mss::c_str(l_dimm) );

        // Sets up the calibration steps
        FAPI_TRY( l_eff_dimm->cal_step_enable(),
                  "Failed cal_step_enable for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->rdvref_enable_bit(),
                  "Failed rdvref_enable_bit for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->training_adv_wr_pattern(),
                  "Failed training_adv_wr_pattern for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->training_adv_pattern(),
                  "Failed training_adv_pattern for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->training_adv_backup_pattern(),
                  "Failed training_adv_backup_pattern for %s", mss::c_str(l_dimm) );
        FAPI_TRY( l_eff_dimm->training_adv_backup_pattern2(),
                  "Failed training_adv_backup_pattern2 for %s", mss::c_str(l_dimm) );

        //Let's do some checking
        FAPI_TRY( mss::check::temp_refresh_mode(),
                  "Failed temp_refresh_mode for %s", mss::c_str(l_dimm) );
    }// dimm

    // Check plug rules. We check the MCS, and this will iterate down to children as needed.
    FAPI_TRY( mss::plug_rule::enforce_plug_rules(i_target),
              "Failed enforce_plug_rules for %s", mss::c_str(i_target) );

fapi_try_exit:
    return fapi2::current_err;
}
OpenPOWER on IntegriCloud