summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config.C')
-rw-r--r--src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config.C3057
1 files changed, 0 insertions, 3057 deletions
diff --git a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config.C b/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config.C
deleted file mode 100644
index 321d9fe08..000000000
--- a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config.C
+++ /dev/null
@@ -1,3057 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2015 */
-/* [+] 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 */
-// $Id: mss_eff_config.C,v 1.55 2015/10/02 19:49:34 sglancy Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/
-// centaur/working/procedures/ipl/fapi/mss_eff_config.C,v $
-//------------------------------------------------------------------------------
-// *! (C) Copyright International Business Machines Corp. 2011
-// *! All Rights Reserved -- Property of IBM
-//------------------------------------------------------------------------------
-// *! TITLE : mss_eff_config
-// *! DESCRIPTION : see additional comments below
-// *! OWNER NAME : Anuwat Saetow Email: asaetow@us.ibm.com
-// *! BACKUP NAME : Briana Foxworth Email: beforwor@us.ibm.com
-// *! ADDITIONAL COMMENTS :
-//
-// The purpose of this procedure is to setup attributes used in other mss
-// procedures.
-//
-//------------------------------------------------------------------------------
-// Don't forget to create CVS comments when you check in your changes!
-//------------------------------------------------------------------------------
-// CHANGE HISTORY:
-//------------------------------------------------------------------------------
-// Version:| Author: | Date: | Comment:
-//---------|----------|---------|-----------------------------------------------
-// 1.55 | sglancy |02-OCT-15| Fixed RCD support for DDR4 ISRDIMMs
-// 1.54 | asaetow |13-AUG-15| Added ATTR_SPD_SDRAM_ROWS=R17 and ATTR_SPD_SDRAM_ROWS=R18 for DDR4.
-// 1.53 | asaetow |31-JUL-15| Changed code based on FW code review.
-// | | | Added RC_MSS_EFF_CONFIG_INVALID_DDR4_SPD_TB and RC_MSS_EFF_CONFIG_INCOMPATABLE_SPD_DRAM_GEN.
-// | | | Fixed attribute naming convension from ATTR_TCCD_L to ATTR_EFF_DRAM_TCCD_L and ATTR_LRDIMM_ADDITIONAL_CNTL_WORDS to ATTR_EFF_LRDIMM_ADDITIONAL_CNTL_WORDS.
-// | | | NOTE: DO NOT pickup w/o memory_attributes.xml v1.153 or newer
-// | | | NOTE: DO NOT pickup w/o memory_mss_eff_config.xml v1.6 or newer
-// 1.52 | asaetow |10-MAY-15| Added initial official DDR4 support to mainline.
-// | | | NOTE: Merge of mss_eff_config_ddr4.C v1.1 from Menlo.
-// | | | NOTE: LRDIMM and TSV not fully supported in this version.
-// | | | Changed backup owner.
-// 1.51 | asaetow |13-MAR-15| Changed DRAM_AL to be CL-2 in 2N/2T mode and CL-1 in 1N/1T mode.
-// 1.50 | jdsloat |03-DEC-14| Removed string data types that are not supported.
-// 1.49 | asaetow |01-DEC-14| Added RDIMM SPD/VPD support for ATTR_EFF_DIMM_RCD_CNTL_WORD_0_15 to take in SPD bits69:76 thru new VPD attribute ATTR_VPD_DIMM_RCD_CNTL_WORD_0_15.
-// | | | Added ATTR_VPD_DIMM_RCD_IBT and ATTR_VPD_DIMM_RCD_OUTPUT_TIMING merge, per meeting with Ken and Dan P.
-// | | | NOTE: DO NOT pickup w/o getMBvpdTermData.C v1.18 or newer from Dan.C and Corey.
-// | | | NOTE: DO NOT pickup w/o getMBvpdTermData.H v1.6 or newer from Dan.C and Corey.
-// | | | NOTE: DO NOT pickup w/o dimm_spd_attributes.xml v1.44 or newer.
-// | | | NOTE: DO NOT pickup w/o memory_mss_eff_config.xml v1.3 or newer.
-// | | | Added hardcode for RC0-DA4=0b0 and RC9-DBA1-DBA0-DA4-DA3=0b00X0, per meeting with Ken and Dan P.
-// | | | Changed l_mss_volt to p_l_mss_eff_config_data->mss_volt.
-// 1.48 | asaetow |13-OCT-14| Removed call to mss_eff_config_termination() for Palmetto and Habanero using ifdef "FAPI_MSSLABONLY", moving to liveVPD.
-// | | | Note: Stradale, Glacier, KG3, and DDR4 will still need ifdef "FAPI_MSSLABONLY".
-// 1.47 | asaetow |15-SEP-14| Changed ATTR_MSS_POWER_CONTROL_REQUESTED to ATTR_MRW_POWER_CONTROL_REQUESTED.
-// | | | NOTE: Do NOT pickup without memory_attributes.xml v1.135
-// 1.46 | asaetow |06-AUG-14| Added ATTR_MSS_POWER_CONTROL_REQUESTED to determine ATTR_EFF_DRAM_DLL_PPD.
-// 1.45 | sglancy |05-AUG-14| Updated comments.
-// 1.44 | sglancy |17-JUL-14| Fixed DDR4 ifdef flag - TARGET_MBA error definition
-// 1.43 | jdsloat |04-APR-14| Fixed DDR4 ifdef flag
-// 1.42 | asaetow |31-MAR-14| Added ifdef for three #include from Thi and Jake FW Code review.
-// | | | Added back in bus_width_extension check from SPD byte8[4:3].
-// | | | NOTE: Only 64bit with ECC extension is allowed.
-// | | | Added FFDC error callout from Andrea's FW RAS review.
-// | | | NOTE: Do NOT pickup without memory_mss_eff_config.xml v1.2
-// | | | Added comments for commended out code.
-// 1.41 | jdsloat |20-MAR-14| FASTEXIT settings in mba_def.initfile are causing fails. Workaround to use SLOWEXIT. SW249561
-// 1.40 | kcook |14-MAR-14| Added call to DDR4 function support
-// 1.39 | dcadiga |04-MAR-14| Added isdimm support pass 1
-// 1.38 | asaetow |17-JAN-14| Removed mss_eff_config_cke_map, now empty, data from vpd.
-// | | | Removed mss_eff_config_termination from normal/FW code flow.
-// | | | Added mss_eff_config_termination to lab only code flow.
-// | | | Removed CDIMM as a valid EFF_DIMM_TYPE, use EFF_CUSTOM_DIMM instead.
-// | | | Added ATTR_MSS_CAL_STEP_ENABLE attribute set to "always run all cal steps".
-// | | | NOTE: Needs mss_eff_config_termination.C v1.42 and mss_eff_config_termination.H v1.2
-// 1.37 | bellows |17-JAN-14| Fixed VPD version when only single drop
-// 1.36 | bellows |13-JAN-14| Make VPD version available at mba level
-// 1.35 | asaetow |13-JAN-14| Fixed ATTR_EFF_DRAM_DLL_PPD from SLOWEXIT to FASTEXIT.
-// | | | Added comments and converted some attr to use enums.
-// 1.34 | bellows |02-JAN-14| VPD attribute removal
-// 1.33 | bellows |16-SEP-13| Hostboot compile update
-// 1.32 | kcook |13-SEP-13| Added using namespace fapi.
-// 1.31 | kcook |13-SEP-13| Updated define FAPI_LRDIMM token.
-// 1.30 | kcook |27-AUG-13| Removed LRDIMM support to mss_lrdimm_funcs.C.
-// 1.29 | kcook |16-AUG-13| Added LRDIMM support.
-// 1.28 | asaetow |06-AUG-13| Added call to mss_eff_pre_config().
-// | | | Removed call to mss_eff_config_thermal().
-// | | | NOTE: Do NOT pickup without mss_eff_pre_config.C v1.1 or newer.
-// 1.27 | asaetow |05-AUG-13| Restored EFF_STACK_TYPE_DDP_QDP support v1.25.
-// | | | NOTE: Do NOT pickup without mss_eff_config_termination.C v1.28 or newer, contains workaround for incorrect byte33 SPD data in early lab OLD 16G/32G CDIMMs.
-// 1.26 | bellows |21-JUN-13| Removed last update because caused lab problems
-// 1.25 | asaetow |20-JUN-13| Added EFF_STACK_TYPE_DDP_QDP support.
-// 1.24 | asaetow |19-APR-13| Fixed X4 CDIMM spare for RCB to use LOW_NIBBLE only.
-// 1.23 | asaetow |17-APR-13| Added 10% margin to TRFI per defect HW248225
-// 1.22 | asaetow |11-APR-13| Changed eff_dram_tdqs from 0 back to 1 for X8 ISDIMMs.
-// 1.21 | asaetow |22-MAR-13| Changed ATTR_EFF_ZQCAL_INTERVAL and ATTR_EFF_MEMCAL_INTERVAL back to enable.
-// | | | NOTE: Need mba_def.initfile v1.27 or newer
-// 1.20 | asaetow |28-FEB-13| Changed temporary ATTR_EFF_ZQCAL_INTERVAL and ATTR_EFF_MEMCAL_INTERVAL to disable.
-// | | | NOTE: Temporary until we get timeout error fixed.
-// 1.19 | sauchadh |26-FEB-13| Added MCBIST related attributes
-// 1.18 | asaetow |12-FEB-13| Changed eff_dram_tdqs from 1 to 0.
-// 1.17 | asaetow |30-JAN-13| Changed "ATTR_SPD_MODULE_TYPE_CDIMM is obsolete..." message from error to warning.
-// 1.16 | bellows |24-JAN-13| Added in CUSTOM bit of SPD and CUSTOM Attr
-// | | | settings.
-// 1.15 | asaetow |15-NOV-12| Added call to mss_eff_config_cke_map().
-// | | | NOTE: DO NOT pick-up without
-// | | | mss_eff_config_cke_map.C v1.3 or newer.
-// | | | Added ATTR_MSS_ALLOW_SINGLE_PORT check.
-// | | | Added ATTR_EFF_DIMM_SPARE.
-// | | | Fixed NUM_RANKS_PER_DIMM for single drop.
-// | | | Fixed calc_timing_in_clk() for negative.
-// | | | Fixed IBM_TYPE and STACK_TYPE.
-// 1.14 | asaetow |08-NOV-12| Changed to match new memory_attributes.xml
-// | | | v1.45 or newer.
-// | | | NOTE: DO NOT pick-up without
-// | | | memory_attributes.xml v1.45 or newer.
-// 1.13 | asaetow |11-OCT-12| Added ATTR_EFF_SCHMOO_ADDR_MODE,
-// | | | ATTR_EFF_SCHMOO_WR_EYE_MIN_MARGIN,
-// | | | ATTR_EFF_SCHMOO_RD_EYE_MIN_MARGIN,
-// | | | ATTR_EFF_SCHMOO_DQS_CLK_MIN_MARGIN,
-// | | | ATTR_EFF_SCHMOO_RD_GATE_MIN_MARGIN,
-// | | | ATTR_EFF_SCHMOO_ADDR_CMD_MIN_MARGIN,
-// | | | ATTR_EFF_DRAM_WR_VREF_SCHMOO,
-// | | | ATTR_EFF_CEN_RD_VREF_SCHMOO,
-// | | | ATTR_EFF_CEN_DRV_IMP_DQ_DQS_SCHMOO,
-// | | | ATTR_EFF_CEN_DRV_IMP_CMD_SCHMOO,
-// | | | ATTR_EFF_CEN_DRV_IMP_CNTL_SCHMOO,
-// | | | ATTR_EFF_CEN_RCV_IMP_DQ_DQS_SCHMOO,
-// | | | ATTR_EFF_CEN_SLEW_RATE_DQ_DQS_SCHMOO,
-// | | | ATTR_EFF_CEN_SLEW_RATE_CMD_SCHMOO,
-// | | | and ATTR_EFF_CEN_SLEW_RATE_CNTL_SCHMOO.
-// 1.12 | asaetow |26-SEP-12| Added initial equation for
-// | | | ATTR_EFF_ZQCAL_INTERVAL and
-// | | | ATTR_EFF_MEMCAL_INTERVAL from Ken.
-// 1.11 | kjpower |26-SEP-12| Restructured code, added modularity
-// 1.10 | bellows |02-AUG-12| Added in DIMM functional vector for Daniel
-// 1.9 | asaetow |29-MAY-12| Added divide by 0 check for mss_freq.
-// | | | Added 9 new attributes from
-// | | | memory_attributes.xml v1.23
-// | | | Changed plug_config to
-// | | | my_attr_eff_num_drops_per_port.
-// | | | NOTE: DO NOT pick-up without
-// | | | memory_attributes.xml v1.23 or newer.
-// | | | NOTE: Some hard code still in place awaiting
-// | | | SPD attributes bytes[76:68,33,8].
-// 1.8 | asaetow |04-MAY-12| Fixed my_attr_eff_dimm_size calcualtion and
-// | | | use new ATTR_EFF_DRAM_WIDTH enum from
-// | | | memory_attributes.xml v1.22
-// | | | NOTE: DO NOT pick-up without
-// | | | memory_attributes.xml v1.22 or newer.
-// 1.7 | asaetow |04-MAY-12| Removed calc_u8_timing_in_clk().
-// | | | Changed calc_u32_timing_in_clk() to
-// | | | calc_timing_in_clk() and changed params.
-// | | | Removed currently unused vars.
-// 1.6 | asaetow |03-MAY-12| Removed FAPI_ATTR_SET(ATTR_EFF_DRAM_CL), moved
-// | | | to mss_freq.C.
-// | | | Fixed "suggest parentheses around && within
-// | | | ||", per Mike Jones.
-// | | | Changed tCK_in_ps calc to reduce num of
-// | | | operations.
-// 1.5 | asaetow |02-MAY-12| Removed #include <*.C>, per FW.
-// | | | Added #include <mss_eff_config_thermal.H>
-// | | | Added call to sub-procedure
-// | | | mss_eff_config_thermal().
-// 1.4 | asaetow |30-APR-12| Changed procedure to use SPD attributes.
-// | | | Added calls to sub-procedures
-// | | | mss_eff_config_rank_group() and
-// | | | mss_eff_config_termination().
-// 1.3 | asaetow |18-APR-12| Changed procedure to print use
-// | | | mss_eff_config_sim.C until 30APR2012.
-// 1.2 | asaetow |03-NOV-11| Fixed to comply with mss_eff_config.H.
-// | | | Added calls to mss_eff_config_rank_group()
-// | | | and mss_eff_config_thermal().
-// 1.1 | asaetow |01-NOV-11| First Draft.
-//------------------------------------------------------------------------------
-
-#include <fapi.H>
-
-//------------------------------------------------------------------------------
-// My Includes
-//------------------------------------------------------------------------------
-#include <mss_eff_config.H>
-#include <mss_eff_pre_config.H>
-#include <mss_eff_config_rank_group.H>
-#include <mss_eff_config_shmoo.H>
-
-#ifdef FAPI_MSSLABONLY
-#include <mss_eff_config_termination.H>
-#endif
-
-#ifdef FAPI_LRDIMM
-#include <mss_lrdimm_funcs.H>
-#endif
-
-
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-// Constants
-//------------------------------------------------------------------------------
-const uint32_t MSS_EFF_EMPTY = 0;
-const uint32_t MSS_EFF_VALID = 255;
-const uint32_t TWO_MHZ = 2000000;
-const uint8_t PORT_SIZE = 2;
-const uint8_t DIMM_SIZE = 2;
-const uint8_t RANK_SIZE = 4;
-
-using namespace fapi;
-
-#ifndef FAPI_LRDIMM
-fapi::ReturnCode mss_lrdimm_eff_config( const Target& i_target_mba,
- uint8_t cur_dimm_spd_valid_u8array[PORT_SIZE][DIMM_SIZE],
- uint32_t mss_freq,
- uint8_t eff_num_ranks_per_dimm[PORT_SIZE][DIMM_SIZE])
-{
- ReturnCode rc;
-
- FAPI_ERR("Invalid exec of LRDIMM function on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_LRDIMM_INVALID_EXEC);
- return rc;
-
-}
-#endif
-
-#ifndef FAPI_MSSLABONLY
-fapi::ReturnCode mss_eff_config_termination( const Target& i_target_mba)
-{
- ReturnCode rc;
-
- FAPI_ERR("Invalid exec of MSSLABONLY function on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INVALID_TERM_EXEC);
- return rc;
-
-}
-#endif
-
-
-
-//------------------------------------------------------------------------------
-// Structure
-// @brief struct mss_eff_config_data
-// @brief holds the the variables used in many function calls
-// in mss_eff_config.C
-//------------------------------------------------------------------------------
-struct mss_eff_config_data
-{
- uint8_t cur_dimm_spd_valid_u8array[PORT_SIZE][DIMM_SIZE];
- uint8_t dimm_functional;
- uint8_t allow_single_port;
- uint8_t cur_dram_density;
- uint32_t mss_freq;
- uint32_t mss_volt;
- uint32_t mtb_in_ps_u32array[PORT_SIZE][DIMM_SIZE];
- uint32_t ftb_in_fs_u32array[PORT_SIZE][DIMM_SIZE];
- //uint8_t dram_taa;
- uint32_t dram_tfaw;
- uint32_t dram_tras;
- uint32_t dram_trc;
- uint8_t dram_trcd;
- uint32_t dram_trfc;
- uint8_t dram_trp;
- uint8_t dram_trrd;
- uint8_t dram_trtp;
- uint8_t dram_twtr;
- uint8_t dram_wr;
- uint8_t dram_trrdl;
- uint8_t dram_tccdl;
- uint8_t dram_twtrl;
-};
-
-//------------------------------------------------------------------------------
-// Structure
-// @brief struct mss_eff_config_spd_data
-// @brief holds the DIMM SPD data for an MBA
-//------------------------------------------------------------------------------
-struct mss_eff_config_spd_data
-{
- uint8_t dram_device_type[PORT_SIZE][DIMM_SIZE];
- uint8_t sdram_device_type[PORT_SIZE][DIMM_SIZE];
- uint8_t module_type[PORT_SIZE][DIMM_SIZE];
- uint8_t custom[PORT_SIZE][DIMM_SIZE];
- uint8_t sdram_banks[PORT_SIZE][DIMM_SIZE];
- uint8_t sdram_density[PORT_SIZE][DIMM_SIZE];
- uint8_t sdram_rows[PORT_SIZE][DIMM_SIZE];
- uint8_t sdram_columns[PORT_SIZE][DIMM_SIZE];
- //uint8_t module_nominal_voltage[PORT_SIZE][DIMM_SIZE];
- uint8_t num_ranks[PORT_SIZE][DIMM_SIZE];
- uint8_t dram_width[PORT_SIZE][DIMM_SIZE];
- uint8_t module_memory_bus_width[PORT_SIZE][DIMM_SIZE];
- uint8_t ftb_dividend[PORT_SIZE][DIMM_SIZE];
- uint8_t ftb_divisor[PORT_SIZE][DIMM_SIZE];
- uint8_t mtb_dividend[PORT_SIZE][DIMM_SIZE];
- uint8_t mtb_divisor[PORT_SIZE][DIMM_SIZE];
- //uint8_t tckmin[PORT_SIZE][DIMM_SIZE];
- //uint32_t cas_latencies_supported[PORT_SIZE][DIMM_SIZE];
- //uint8_t taamin[PORT_SIZE][DIMM_SIZE];
- uint8_t twrmin[PORT_SIZE][DIMM_SIZE];
- uint8_t trcdmin[PORT_SIZE][DIMM_SIZE];
- uint8_t trrdmin[PORT_SIZE][DIMM_SIZE]; // DDR3 only
- uint8_t trpmin[PORT_SIZE][DIMM_SIZE];
- uint32_t trasmin[PORT_SIZE][DIMM_SIZE];
- uint32_t trcmin[PORT_SIZE][DIMM_SIZE];
- uint32_t trfcmin[PORT_SIZE][DIMM_SIZE]; // DDR3 only
- uint8_t twtrmin[PORT_SIZE][DIMM_SIZE]; // DDR3 only
- uint8_t trtpmin[PORT_SIZE][DIMM_SIZE];
- uint32_t tfawmin[PORT_SIZE][DIMM_SIZE];
-
- // DDR4 only
- uint8_t trrdsmin[PORT_SIZE][DIMM_SIZE];
- uint8_t trrdlmin[PORT_SIZE][DIMM_SIZE];
- uint8_t tccdlmin[PORT_SIZE][DIMM_SIZE];
- uint32_t trfc1min[PORT_SIZE][DIMM_SIZE];
- uint32_t trfc2min[PORT_SIZE][DIMM_SIZE];
- uint32_t trfc4min[PORT_SIZE][DIMM_SIZE];
- uint8_t twtrsmin[PORT_SIZE][DIMM_SIZE];
- uint8_t twtrlmin[PORT_SIZE][DIMM_SIZE];
-
- // Not needed for GA1 CDIMM, will need to enable check for ISDIMM.
- //uint8_t sdram_optional_features[PORT_SIZE][DIMM_SIZE];
- //uint8_t sdram_thermal_and_refresh_options[PORT_SIZE][DIMM_SIZE];
- //uint8_t module_thermal_sensor[PORT_SIZE][DIMM_SIZE];
-
- uint8_t fine_offset_tckmin[PORT_SIZE][DIMM_SIZE];
- uint8_t fine_offset_taamin[PORT_SIZE][DIMM_SIZE];
- uint8_t fine_offset_trcdmin[PORT_SIZE][DIMM_SIZE];
- uint8_t fine_offset_trpmin[PORT_SIZE][DIMM_SIZE];
- uint8_t fine_offset_trcmin[PORT_SIZE][DIMM_SIZE];
-
- // ATTR_SPD_MODULE_SPECIFIC_SECTION, Located in DDR3 SPD bytes 60d - 116d
- //uint8_t module_specific_section[PORT_SIZE][DIMM_SIZE][57];
- uint64_t rdimm_rcd_cntl_word_0_15[PORT_SIZE][DIMM_SIZE];
-
- // Moved from DIMM to MBA[port][dimm] attr per DanC. see dimm_spd_attributes.xml v1.40
- //uint32_t rdimm_rcd_ibt[PORT_SIZE][DIMM_SIZE];
- //uint8_t rdimm_rcd_output_timing[PORT_SIZE][DIMM_SIZE];
-
- // See "svpdMFGtool --inventory"
- //uint32_t module_id_module_manufacturers_jedec_id_code[PORT_SIZE][DIMM_SIZE];
- //uint8_t module_id_module_manufacturing_location[PORT_SIZE][DIMM_SIZE];
- //uint32_t module_id_module_manufacturing_date[PORT_SIZE][DIMM_SIZE];
- //uint32_t module_id_module_serial_number[PORT_SIZE][DIMM_SIZE];
- //uint32_t cyclical_redundancy_code[PORT_SIZE][DIMM_SIZE];
- //uint8_t module_part_number[PORT_SIZE][DIMM_SIZE][SPD_ATTR_SIZE_18];
- //uint32_t module_revision_code[PORT_SIZE][DIMM_SIZE];
- //uint32_t dram_manufacturer_jedec_id_code[PORT_SIZE][DIMM_SIZE];
-
- // See VPD parser #A keyword
- //uint8_t bad_dq_data[PORT_SIZE][DIMM_SIZE][SPD_ATTR_SIZE_80];
-
- uint32_t vpd_version[PORT_SIZE][DIMM_SIZE];
-};
-
-//------------------------------------------------------------------------------
-// Structure
-// @brief struct mss_eff_config_atts
-// @brief holds the effective configuration attributes
-//------------------------------------------------------------------------------
-struct mss_eff_config_atts
-{
- uint8_t eff_dimm_ranks_configed[PORT_SIZE][DIMM_SIZE];
- // Using SPD byte68,69:76, enabled in GA2 for full RDIMM support
- uint64_t eff_dimm_rcd_cntl_word_0_15[PORT_SIZE][DIMM_SIZE];
- uint64_t eff_lrdimm_additional_cntl_words[PORT_SIZE][DIMM_SIZE]; // LRDIMMs only
- uint8_t eff_dimm_size[PORT_SIZE][DIMM_SIZE];
- uint8_t eff_dimm_type;
- uint8_t eff_custom_dimm;
- uint8_t eff_dram_al; // Based on 2N/2T or 1N/1T enable
- uint8_t eff_dram_asr;
- uint8_t eff_dram_bl;
- uint8_t eff_dram_banks;
-
- // See mss_freq.C
- //uint8_t eff_dram_cl;
-
- uint8_t eff_dram_cols;
- uint8_t eff_dram_cwl;
- uint8_t eff_dram_density;
- uint8_t eff_dram_dll_enable;
- uint8_t eff_dram_dll_ppd; // Check MRW, ATTR_MRW_POWER_CONTROL_REQUESTED attr
- uint8_t eff_dram_dll_reset; // Always reset DLL at start of IPL.
- uint8_t eff_dram_gen;
- uint8_t eff_dram_output_buffer;
- uint8_t eff_dram_pasr;
- uint8_t eff_dram_rbt;
- uint8_t eff_dram_rows;
- uint8_t eff_dram_srt; // Always use extended operating temp range.
- uint8_t eff_dram_tdqs;
- uint8_t eff_dram_tfaw;
- uint32_t eff_dram_tfaw_u32;
- uint8_t eff_dram_tm;
- uint8_t eff_dram_tras;
- uint32_t eff_dram_tras_u32;
- uint8_t eff_dram_trc;
- uint32_t eff_dram_trc_u32;
- uint8_t eff_dram_trcd;
- uint32_t eff_dram_trfc;
- uint32_t eff_dram_trfi;
- uint8_t eff_dram_trp;
- uint8_t eff_dram_trrd;
- uint8_t eff_dram_trtp;
- uint8_t eff_dram_twtr;
- uint8_t eff_dram_width;
- uint8_t eff_dram_wr;
- uint8_t eff_dram_wr_lvl_enable;
- uint8_t eff_ibm_type[PORT_SIZE][DIMM_SIZE];
- uint32_t eff_memcal_interval;
- uint8_t eff_mpr_loc;
- uint8_t eff_mpr_mode;
-
- // AST HERE: Needs SPD DDR3 byte33[6:4], DDR4 byte6[6:4] currently hard coded to 0
- uint8_t eff_num_dies_per_package[PORT_SIZE][DIMM_SIZE];
-
- uint8_t eff_num_drops_per_port;
- uint8_t eff_num_master_ranks_per_dimm[PORT_SIZE][DIMM_SIZE];
-
- // AST HERE: Needs source data, currently hard coded to 0
- uint8_t eff_num_packages_per_rank[PORT_SIZE][DIMM_SIZE];
-
- uint8_t eff_num_ranks_per_dimm[PORT_SIZE][DIMM_SIZE];
- uint8_t eff_schmoo_mode;
-
- uint8_t eff_schmoo_addr_mode;
- uint8_t eff_schmoo_wr_eye_min_margin;
- uint8_t eff_schmoo_rd_eye_min_margin;
- uint8_t eff_schmoo_dqs_clk_min_margin;
- uint8_t eff_schmoo_rd_gate_min_margin;
- uint8_t eff_schmoo_addr_cmd_min_margin;
- uint32_t eff_cen_rd_vref_schmoo[PORT_SIZE];
- uint32_t eff_dram_wr_vref_schmoo[PORT_SIZE];
- uint32_t eff_cen_rcv_imp_dq_dqs_schmoo[PORT_SIZE];
- uint32_t eff_cen_drv_imp_dq_dqs_schmoo[PORT_SIZE];
- uint8_t eff_cen_drv_imp_cntl_schmoo[PORT_SIZE];
- uint8_t eff_cen_drv_imp_clk_schmoo[PORT_SIZE];
- uint8_t eff_cen_drv_imp_spcke_schmoo[PORT_SIZE];
- uint8_t eff_cen_slew_rate_dq_dqs_schmoo[PORT_SIZE];
- uint8_t eff_cen_slew_rate_cntl_schmoo[PORT_SIZE];
- uint8_t eff_cen_slew_rate_addr_schmoo[PORT_SIZE];
- uint8_t eff_cen_slew_rate_clk_schmoo[PORT_SIZE];
- uint8_t eff_cen_slew_rate_spcke_schmoo[PORT_SIZE];
-
- uint8_t eff_schmoo_param_valid;
- uint8_t eff_schmoo_test_valid;
- uint8_t eff_stack_type[PORT_SIZE][DIMM_SIZE];
- uint32_t eff_zqcal_interval;
- uint8_t dimm_functional_vector;
- uint8_t mss_cal_step_enable; // Always run all cal steps
- uint32_t eff_vpd_version;
- uint8_t eff_dram_trrdl;
- uint8_t eff_dram_tccdl;
- uint8_t eff_dram_twtrl;
-};
-
-//------------------------------------------------------------------------------
-// Function Prototypes
-//------------------------------------------------------------------------------
-/*
-fapi::ReturnCode mss_eff_config_get_spd_data(const fapi::Target &i_target_mba,
- mss_eff_config_data *p_i_mss_eff_config_data,
- mss_eff_config_spd_data *p_o_spd_data,
- mss_eff_config_atts *p_i_atts);
-
-
-fapi::ReturnCode mss_eff_config_read_spd_data(fapi::Target i_target_dimm,
- mss_eff_config_spd_data *p_o_spd_data,
- uint8_t i_port, uint8_t i_dimm);
-
-fapi::ReturnCode mss_eff_config_verify_plug_rules(
- const fapi::Target &i_target_mba,
- mss_eff_config_data *p_i_mss_eff_config_data,
- mss_eff_config_atts *p_i_atts);
-
-fapi::ReturnCode mss_eff_config_verify_spd_data(
- const fapi::Target &i_target_mba,
- mss_eff_config_atts *p_i_atts,
- mss_eff_config_spd_data *p_i_data);
-
-fapi::ReturnCode mss_eff_config_setup_eff_atts(const fapi::Target &i_target_mba,
- mss_eff_config_data *p_i_mss_eff_config_data,
- mss_eff_config_spd_data *p_i_data,
- mss_eff_config_atts *p_o_atts);
-
-
-fapi::ReturnCode mss_eff_config_write_eff_atts(const fapi::Target &i_target_mba,
- mss_eff_config_atts *p_i_atts);
-*/
-//------------------------------------------------------------------------------
-// extern encapsulation
-//------------------------------------------------------------------------------
-extern "C"
-{
-
-//------------------------------------------------------------------------------
-// @brief calc_timing_in_clk(): This function calculates clock timing
-//
-// @param unit32_t i_mtb_in_ps:
-// @param unit32_t i_ftb_in_fs:
-// @param unit32_t i_unit:
-// @param unit32_t i_offset:
-// @param uint32_t i_mss_freq:
-//
-// @return unit32_t l_timing_in_clk
-//------------------------------------------------------------------------------
-uint32_t calc_timing_in_clk(uint32_t i_mtb_in_ps, uint32_t i_ftb_in_fs,
- uint32_t i_unit, uint8_t i_offset, uint32_t i_mss_freq)
-{
- uint64_t l_timing;
- uint32_t l_timing_in_clk;
- uint32_t l_tCK_in_ps;
- // perform calculations
- l_tCK_in_ps = TWO_MHZ/i_mss_freq;
- if ( i_offset >= 128 ) {
- i_offset = 256 - i_offset;
- l_timing = (i_unit * i_mtb_in_ps) - (i_offset * i_ftb_in_fs);
- } else {
- l_timing = (i_unit * i_mtb_in_ps) + (i_offset * i_ftb_in_fs);
- }
- // ceiling()
- l_timing_in_clk = l_timing / l_tCK_in_ps;
- // check l_timing
- if ( (l_timing_in_clk * l_tCK_in_ps) < l_timing )
- {
- l_timing_in_clk += 1;
- }
- // DEBUG HERE:
- //FAPI_INF("calc_timing_in_clk: l_timing_in_clk = %d, l_tCK_in_ps = %d, i_mtb_in_ps = %d, i_ftb_in_fs = %d, i_unit = %d, i_offset = %d", l_timing_in_clk, l_tCK_in_ps, i_mtb_in_ps, i_ftb_in_fs, i_unit, i_offset);
-
- return l_timing_in_clk;
-} // end calc_timing_in_clk()
-
-//------------------------------------------------------------------------------
-// @brief mss_eff_config_read_spd_data(): This function reads DIMM SPD data
-//
-// @param fapi::Target i_target_dimm: target dimm
-// @param mss_eff_config_spd_data *p_o_spd_data: Pointer to
-// mss_eff configuration spd data structure
-// @param uint8_t i_port: current mba port
-// @param uint8_t i_dimm: current mba dimm
-//
-// @return fapi::ReturnCode
-//------------------------------------------------------------------------------
-fapi::ReturnCode mss_eff_config_read_spd_data(fapi::Target i_target_dimm,
- mss_eff_config_spd_data *p_o_spd_data,
- uint8_t i_port, uint8_t i_dimm)
-{
- fapi::ReturnCode rc;
- const fapi::Target& TARGET_DIMM = i_target_dimm;
- // Grab DIMM/SPD data.
- do
- {
- rc = FAPI_ATTR_GET(ATTR_SPD_DRAM_DEVICE_TYPE, &i_target_dimm,
- p_o_spd_data->dram_device_type[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_SDRAM_DEVICE_TYPE, &i_target_dimm,
- p_o_spd_data->sdram_device_type[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_TYPE, &i_target_dimm,
- p_o_spd_data->module_type[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_CUSTOM, &i_target_dimm,
- p_o_spd_data->custom[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_SDRAM_BANKS, &i_target_dimm,
- p_o_spd_data->sdram_banks[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_SDRAM_DENSITY, &i_target_dimm,
- p_o_spd_data->sdram_density[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_SDRAM_ROWS, &i_target_dimm,
- p_o_spd_data->sdram_rows[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_SDRAM_COLUMNS, &i_target_dimm,
- p_o_spd_data->sdram_columns[i_port][i_dimm]);
- if(rc) break;
-
- // See mss_volt.C
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_NOMINAL_VOLTAGE, &i_target_dimm,
- //p_o_spd_data->module_nominal_voltage[i_port][i_dimm]);
- //if(rc) break;
-
- rc = FAPI_ATTR_GET(ATTR_SPD_NUM_RANKS, &i_target_dimm,
- p_o_spd_data->num_ranks[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_DRAM_WIDTH, &i_target_dimm,
- p_o_spd_data->dram_width[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_MEMORY_BUS_WIDTH, &i_target_dimm,
- p_o_spd_data->module_memory_bus_width[i_port][i_dimm]);
- if(rc) break;
-
- // See mss_freq.C
- //rc = FAPI_ATTR_GET(ATTR_SPD_TCKMIN, &i_target_dimm,
- //p_o_spd_data->tckmin[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_CAS_LATENCIES_SUPPORTED, &i_target_dimm,
- //p_o_spd_data->cas_latencies_supported[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_TAAMIN, &i_target_dimm,
- //p_o_spd_data->taamin[i_port][i_dimm]);
- //if(rc) break;
-
- if (p_o_spd_data->dram_device_type[i_port][i_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) {
- // DDR3 only
- rc = FAPI_ATTR_GET(ATTR_SPD_FTB_DIVIDEND, &i_target_dimm,
- p_o_spd_data->ftb_dividend[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_FTB_DIVISOR, &i_target_dimm,
- p_o_spd_data->ftb_divisor[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_MTB_DIVIDEND, &i_target_dimm,
- p_o_spd_data->mtb_dividend[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_MTB_DIVISOR, &i_target_dimm,
- p_o_spd_data->mtb_divisor[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRRDMIN, &i_target_dimm,
- p_o_spd_data->trrdmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRFCMIN, &i_target_dimm,
- p_o_spd_data->trfcmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TWTRMIN, &i_target_dimm,
- p_o_spd_data->twtrmin[i_port][i_dimm]);
- if(rc) break;
-
- rc = FAPI_ATTR_GET(ATTR_SPD_TWRMIN, &i_target_dimm,
- p_o_spd_data->twrmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRTPMIN, &i_target_dimm,
- p_o_spd_data->trtpmin[i_port][i_dimm]);
- if(rc) break;
-
- } else if (p_o_spd_data->dram_device_type[i_port][i_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- // DDR4 only
- uint8_t l_spd_tb_mtb_ddr4, l_spd_tb_ftb_ddr4;
- rc = FAPI_ATTR_GET(ATTR_SPD_TIMEBASE_MTB_DDR4, &i_target_dimm,
- l_spd_tb_mtb_ddr4);
- if (rc) break;
-
- rc = FAPI_ATTR_GET(ATTR_SPD_TIMEBASE_FTB_DDR4, &i_target_dimm,
- l_spd_tb_ftb_ddr4);
- if (rc) break;
-
- if ( (l_spd_tb_mtb_ddr4 != 0)||(l_spd_tb_ftb_ddr4 != 0) )
- {
- FAPI_ERR("Invalid DDR4 MTB/FTB Timebase received from SPD attribute on %s!", i_target_dimm.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INVALID_DDR4_SPD_TB);
- break;
- }
- // AST HERE: !If DDR4 spec changes to include other values, this section needs to be updated!
- // for 1000fs = 1ps = 1000 * 1 / 1
- p_o_spd_data->ftb_dividend[i_port][i_dimm] = 1;
- p_o_spd_data->ftb_divisor[i_port][i_dimm] = 1;
- // for 125ps = 1000 * 1 / 8
- p_o_spd_data->mtb_dividend[i_port][i_dimm] = 1;
- p_o_spd_data->mtb_divisor[i_port][i_dimm] = 8;
-
- // not available in ddr4 spd, these are replacements. need to double check
- // 15 ns for all speeds
- p_o_spd_data->twrmin[i_port][i_dimm] = 15000 / (
- (p_o_spd_data->mtb_dividend[i_port][i_dimm] * 1000) /
- p_o_spd_data->mtb_divisor[i_port][i_dimm]);
-
- // 7.5ns = 7500ps; work backwards to figure out value. no FTB
- p_o_spd_data->trtpmin[i_port][i_dimm] = 7500 / (
- (p_o_spd_data->mtb_dividend[i_port][i_dimm] * 1000) /
- p_o_spd_data->mtb_divisor[i_port][i_dimm]);
-
- // 3 trfc values, 1x, 2x, 4x
- rc = FAPI_ATTR_GET(ATTR_SPD_TRFC1MIN_DDR4, &i_target_dimm,
- p_o_spd_data->trfc1min[i_port][i_dimm]);
- if(rc) break;
-
-// FW is reading out and giving the data in big endian format for some reason.
-// need to fix this... XML is documented correctly.
-/* // if (p_o_spd_data->trfc1min[i_port][i_dimm] > 0xFFF) {
- p_o_spd_data->trfc1min[i_port][i_dimm] |=
- (p_o_spd_data->trfc1min[i_port][i_dimm] & 0xFF) << 16;
- p_o_spd_data->trfc1min[i_port][i_dimm] =
- p_o_spd_data->trfc1min[i_port][i_dimm] >> 8;
-// }
-*/
-// need to look at this more sometimes the bytes are swapped in SPD...
- switch(p_o_spd_data->trfc1min[i_port][i_dimm])
- {
- case 0x0005:
- p_o_spd_data->trfc1min[i_port][i_dimm] = 0x0500;
- break;
- case 0x2008:
- p_o_spd_data->trfc1min[i_port][i_dimm] = 0x0820;
- break;
- case 0xF00A:
- p_o_spd_data->trfc1min[i_port][i_dimm] = 0x0AF0;
- break;
- }
-
- rc = FAPI_ATTR_GET(ATTR_SPD_TRFC2MIN_DDR4, &i_target_dimm,
- p_o_spd_data->trfc2min[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRFC4MIN_DDR4, &i_target_dimm,
- p_o_spd_data->trfc4min[i_port][i_dimm]);
- if(rc) break;
-
- // ddr4 has 's' (short; different bank group) and
- // 'l' (long; same bank group) values
- // tRRD needs to be used by Yuen's mba initfile...
- rc = FAPI_ATTR_GET(ATTR_SPD_TRRDSMIN_DDR4, &i_target_dimm,
- p_o_spd_data->trrdsmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRRDLMIN_DDR4, &i_target_dimm,
- p_o_spd_data->trrdlmin[i_port][i_dimm]);
- if(rc) break;
-
- // tccdl
- rc = FAPI_ATTR_GET(ATTR_SPD_TCCDLMIN_DDR4, &i_target_dimm,
- p_o_spd_data->tccdlmin[i_port][i_dimm]);
- if(rc) break;
-
- // should be constant based on MTB and FTB after calculations
- // where is this used??
-/* SPD attributes not available yet
- rc = FAPI_ATTR_GET(ATTR_SPD_TWTRSMIN_DDR4, &i_target_dimm,
- p_o_spd_data->twtrsmin[i_port][i_dimm]); // 2.5ns
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TWTRLMIN_DDR4, &i_target_dimm,
- p_o_spd_data->twtrlmin[i_port][i_dimm]); // 7.5ns
- if(rc) break;
-*/
- p_o_spd_data->twtrsmin[i_port][i_dimm] = 2500 / ( // 2.5 ns
- (p_o_spd_data->mtb_dividend[i_port][i_dimm] * 1000) /
- p_o_spd_data->mtb_divisor[i_port][i_dimm]);
- p_o_spd_data->twtrlmin[i_port][i_dimm] = 7500 / ( // 7.5 ns
- (p_o_spd_data->mtb_dividend[i_port][i_dimm] * 1000) /
- p_o_spd_data->mtb_divisor[i_port][i_dimm]);
- } else {
- FAPI_ERR("Incompatable SPD DRAM generation on %s!", i_target_dimm.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_SPD_DRAM_GEN);
- return rc;
- }
-
- // Common for DDR3 and DDR4
- rc = FAPI_ATTR_GET(ATTR_SPD_TRCDMIN, &i_target_dimm,
- p_o_spd_data->trcdmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRPMIN, &i_target_dimm,
- p_o_spd_data->trpmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRASMIN, &i_target_dimm,
- p_o_spd_data->trasmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TRCMIN, &i_target_dimm,
- p_o_spd_data->trcmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_TFAWMIN, &i_target_dimm,
- p_o_spd_data->tfawmin[i_port][i_dimm]);
- if(rc) break;
-
- // Not needed for GA1 CDIMM, will need to enable check for ISDIMM.
- //rc = FAPI_ATTR_GET(ATTR_SPD_SDRAM_OPTIONAL_FEATURES, &i_target_dimm,
- //p_o_spd_data->sdram_optional_features[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_SDRAM_THERMAL_AND_REFRESH_OPTIONS,
- //&i_target_dimm,
- //p_o_spd_data->sdram_thermal_and_refresh_options[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_THERMAL_SENSOR, &i_target_dimm,
- //p_o_spd_data->module_thermal_sensor[i_port][i_dimm]);
- //if(rc) break;
-
- rc = FAPI_ATTR_GET(ATTR_SPD_FINE_OFFSET_TCKMIN, &i_target_dimm,
- p_o_spd_data->fine_offset_tckmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_FINE_OFFSET_TAAMIN, &i_target_dimm,
- p_o_spd_data->fine_offset_taamin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_FINE_OFFSET_TRCDMIN, &i_target_dimm,
- p_o_spd_data->fine_offset_trcdmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_FINE_OFFSET_TRPMIN, &i_target_dimm,
- p_o_spd_data->fine_offset_trpmin[i_port][i_dimm]);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_SPD_FINE_OFFSET_TRCMIN, &i_target_dimm,
- p_o_spd_data->fine_offset_trcmin[i_port][i_dimm]);
- if(rc) break;
-
-
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_SPECIFIC_SECTION, // LRDIMM needed.
- //&i_target_dimm,
- //p_o_spd_data->module_specific_section[i_port][i_dimm]);
- //if(rc) break;
-
-
- rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_RCD_CNTL_WORD_0_15, // Needed for RDIMM.
- &i_target_dimm,
- p_o_spd_data->rdimm_rcd_cntl_word_0_15[i_port][i_dimm]);
- if(rc) break;
-
- // Moved from DIMM to MBA[port][dimm] attr per DanC. see dimm_spd_attributes.xml v1.40
- //rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_RCD_IBT, // Needed for RDIMM.
- // &i_target_dimm,
- // p_o_spd_data->rdimm_rcd_ibt[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_RCD_OUTPUT_TIMING, // Needed for RDIMM.
- // &i_target_dimm,
- // p_o_spd_data->rdimm_rcd_output_timing[i_port][i_dimm]);
- //if(rc) break;
-
-
- // See "svpdMFGtool --inventory"
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_ID_MODULE_MANUFACTURERS_
- //JEDEC_ID_CODE,
- //&i_target_dimm,
- //p_o_spd_data->
- //module_id_module_manufacturers_jedec_id_code[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_ID_MODULE_MANUFACTURING_LOCATION,
- //&i_target_dimm,
- //p_o_spd_data->module_id_module_manufacturing_location
- //[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_ID_MODULE_MANUFACTURING_DATE,
- //&i_target_dimm,
- //p_o_spd_data->module_id_module_manufacturing_date
- //[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_ID_MODULE_SERIAL_NUMBER,
- //&i_target_dimm,
- //p_o_spd_data->module_id_module_serial_number[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_CYCLICAL_REDUNDANCY_CODE,
- //&i_target_dimm,
- //p_o_spd_data->cyclical_redundancy_code[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_PART_NUMBER,
- //&i_target_dimm,
- //p_o_spd_data->module_part_number[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_MODULE_REVISION_CODE,
- //&i_target_dimm,
- //p_o_spd_data->module_revision_code[i_port][i_dimm]);
- //if(rc) break;
- //rc = FAPI_ATTR_GET(ATTR_SPD_DRAM_MANUFACTURER_JEDEC_ID_CODE,
- //&i_target_dimm,
- //p_o_spd_data->dram_manufacturer_jedec_id_code[i_port][i_dimm]);
- //if(rc) break;
-
- // See VPD parser #A keyword
- //rc = FAPI_ATTR_GET(ATTR_SPD_BAD_DQ_DATA, &i_target_dimm,
- //p_o_spd_data->bad_dq_data[i_port][i_dimm]);
- //if(rc) break;
-
- rc = FAPI_ATTR_GET(ATTR_VPD_VERSION, &i_target_dimm,
- p_o_spd_data->vpd_version[i_port][i_dimm]);
- if(rc) break;
-
- } while(0);
-
- return rc;
-} // end of mss_eff_config_read_spd_data()
-
-//------------------------------------------------------------------------------
-// @brief mss_eff_config_get_spd_data(): This function sets gathers the
-// DIMM info then uses mss_eff_config_read_spd_data() as a
-// helper function to read the spd data
-//
-// @param const fapi::Target &i_target_mba: the fapi target
-// @param mss_eff_config_data *p_i_mss_eff_config_data: Pointer to
-// mss_eff_config_data variable structure
-// @param const mss_eff_config_spd_data *p_o_spd_data: Pointer to mss_eff
-// configuration spd data structure
-//
-// @return fapi::ReturnCode
-//------------------------------------------------------------------------------
-fapi::ReturnCode mss_eff_config_get_spd_data(
- const fapi::Target &i_target_mba,
- mss_eff_config_data *p_i_mss_eff_config_data,
- mss_eff_config_spd_data *p_o_spd_data,
- mss_eff_config_atts *p_i_atts)
-{
- fapi::ReturnCode rc;
- std::vector<fapi::Target> l_target_dimm_array;
- uint8_t l_cur_mba_port = 0;
- uint8_t l_cur_mba_dimm = 0;
- // Grab all DIMM/SPD data.
- do
- {
- //------------------------------------------------------------------------------
-// initialize vpd_version
- for(l_cur_mba_port=0; l_cur_mba_port < PORT_SIZE ; l_cur_mba_port++)
- for(l_cur_mba_dimm=0; l_cur_mba_dimm < DIMM_SIZE ; l_cur_mba_dimm++)
- p_o_spd_data->vpd_version[l_cur_mba_port][l_cur_mba_dimm]=0xFFFFFFFF;
-//------------------------------------------------------------------------------
-
- rc = fapiGetAssociatedDimms(i_target_mba, l_target_dimm_array);
- if(rc)
- {
- FAPI_ERR("Error retrieving assodiated dimms");
- break;
- }
-//------------------------------------------------------------------------------
- // call mss_eff_config_read_spd_data()
- for (uint8_t l_dimm_index = 0; l_dimm_index <
- l_target_dimm_array.size(); l_dimm_index += 1)
- {
- rc = FAPI_ATTR_GET(ATTR_MBA_PORT, &l_target_dimm_array[l_dimm_index],
- l_cur_mba_port);
- if(rc)
- {
- FAPI_ERR("Error retrieving ATTR_MBA_PORT");
- break;
- }
-//------------------------------------------------------------------------------
- rc = FAPI_ATTR_GET(ATTR_MBA_DIMM, &l_target_dimm_array[l_dimm_index
- ], l_cur_mba_dimm);
- if(rc)
- {
- FAPI_ERR("Error retrieving ATTR_MBA_DIMM");
- break;
- }
-//------------------------------------------------------------------------------
- p_i_mss_eff_config_data->cur_dimm_spd_valid_u8array
- [l_cur_mba_port][l_cur_mba_dimm] = MSS_EFF_VALID;
- rc = FAPI_ATTR_GET(ATTR_FUNCTIONAL,
- &l_target_dimm_array[l_dimm_index],
- p_i_mss_eff_config_data->dimm_functional);
- if(rc)
- {
- FAPI_ERR("Error retrieving functional fapi attribute");
- break;
- }
-//------------------------------------------------------------------------------
- (p_i_mss_eff_config_data->dimm_functional ==
- fapi::ENUM_ATTR_FUNCTIONAL_FUNCTIONAL)
- ? p_i_mss_eff_config_data->dimm_functional=1
- : p_i_mss_eff_config_data->dimm_functional=0;
- p_i_atts->dimm_functional_vector |=
- p_i_mss_eff_config_data->dimm_functional
- << ((4*(1-(l_cur_mba_port)))+(4-(l_cur_mba_dimm))-1);
-
- rc = mss_eff_config_read_spd_data(l_target_dimm_array[l_dimm_index],
- p_o_spd_data, l_cur_mba_port, l_cur_mba_dimm);
- if(rc)
- {
- FAPI_ERR("Error reading spd data from caller");
- break;
- }
- }
- } while(0);
-
- return rc;
-} // end of mss_eff_config_get_spd_data()
-
-//------------------------------------------------------------------------------
-// @brief mss_eff_config_verify_plug_rules(): This function verifies DIMM
-// plug rules based on which dimms are present
-//
-// @param mss_eff_config_data *p_i_mss_eff_config_data: Pointer to
-// mss_eff_config_data variable structure
-// @param const fapi::Target &i_target_mba: the fapi target
-// @param mss_eff_config_data *p_i_mss_eff_config_data: Pointer to
-// mss_eff_config_data variable structure
-// @param mss_eff_config_atts *p_i_atts: Pointer to mss_eff
-// configuration attributes structure
-//
-// @return fapi::ReturnCode
-//------------------------------------------------------------------------------
-fapi::ReturnCode mss_eff_config_verify_plug_rules(
- const fapi::Target &i_target_mba,
- mss_eff_config_data *p_i_mss_eff_config_data,
- mss_eff_config_atts *p_i_atts)
-{
- fapi::ReturnCode rc;
- const fapi::Target& TARGET_MBA = i_target_mba;
- uint8_t& CUR_DIMM_SPD_VALID_U8ARRAY_0_0 =
- p_i_mss_eff_config_data->cur_dimm_spd_valid_u8array[0][0];
- uint8_t& CUR_DIMM_SPD_VALID_U8ARRAY_0_1 =
- p_i_mss_eff_config_data->cur_dimm_spd_valid_u8array[0][1];
- uint8_t& CUR_DIMM_SPD_VALID_U8ARRAY_1_0 =
- p_i_mss_eff_config_data->cur_dimm_spd_valid_u8array[1][0];
- uint8_t& CUR_DIMM_SPD_VALID_U8ARRAY_1_1 =
- p_i_mss_eff_config_data->cur_dimm_spd_valid_u8array[1][1];
-
- // Identify/Verify DIMM plug rule
- if (
- (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][0] == MSS_EFF_EMPTY)
- &&
- (
- (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][1] == MSS_EFF_VALID)
- ||
- (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[1][0] == MSS_EFF_VALID)
- ||
- (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[1][1] == MSS_EFF_VALID)
- )
- )
- {
- FAPI_ERR("Plug rule violation on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_MISMATCH_EMPTY);
- return rc;
- }
- if ( (
- ((p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][0] == MSS_EFF_VALID)
- && (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[1][0] == MSS_EFF_EMPTY))
- ||
- ((p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][1] == MSS_EFF_VALID)
- && (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[1][1] == MSS_EFF_EMPTY))
- ) && (p_i_mss_eff_config_data->allow_single_port == fapi::ENUM_ATTR_MSS_ALLOW_SINGLE_PORT_FALSE) )
- {
- FAPI_ERR("Plug rule violation on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_MISMATCH_SIDE);
- return rc;
- }
- if ( (
- (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][1] == MSS_EFF_VALID)
- || (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[1][0] == MSS_EFF_VALID)
- || (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[1][1] == MSS_EFF_VALID)
- ) && (p_i_mss_eff_config_data->allow_single_port == fapi::ENUM_ATTR_MSS_ALLOW_SINGLE_PORT_TRUE) )
- {
- FAPI_ERR("Plug rule violation on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_MISMATCH_TOP);
- return rc;
- }
- if ((p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][0] == MSS_EFF_VALID)
- && (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][1] == MSS_EFF_VALID))
- {
- p_i_atts->eff_num_drops_per_port
- = fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL;
- }
- else if ((p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][0] == MSS_EFF_VALID)
- && (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[0][1] == MSS_EFF_EMPTY))
- {
- p_i_atts->eff_num_drops_per_port
- = fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_SINGLE;
- }
- else
- {
- p_i_atts->eff_num_drops_per_port
- = fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_EMPTY;
- }
- // end Indetify/Verify DIMM plug rule
-
- return rc;
-} // end of mss_eff_config_verify_plug_rules()
-
-//------------------------------------------------------------------------------
-// @brief mss_eff_config_verify_spd_data(): This function verifies DIMM
-// SPD data
-//
-// @param const fapi::Target &i_target_mba: the fapi target
-// @param mss_eff_config_atts *p_i_atts: Pointer to mss_eff
-// configuration attributes structure
-// @param mss_eff_config_spd_data *p_i_data: Pointer to mss_eff
-// configuration spd data structure
-//
-// @return fapi::ReturnCode
-//------------------------------------------------------------------------------
-fapi::ReturnCode mss_eff_config_verify_spd_data(
- const fapi::Target &i_target_mba,
- mss_eff_config_atts *p_i_atts,
- mss_eff_config_spd_data *p_i_data)
-{
- fapi::ReturnCode rc;
- const fapi::Target& TARGET_MBA = i_target_mba;
-
- // Start Identify/Verify/Assigning values to attributes
- // Identify/Verify DIMM compatability
-//------------------------------------------------------------------------------
- if (
- (p_i_data->dram_device_type[0][0]
- != p_i_data->dram_device_type[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->dram_device_type[0][1]
- != p_i_data->dram_device_type[1][1])
- ||
- (p_i_data->dram_device_type[0][0]
- != p_i_data->dram_device_type[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DRAM generation on %s!",
- i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (
- (p_i_data->module_type[0][0]
- != p_i_data->module_type[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->module_type[0][1]
- != p_i_data->module_type[1][1])
- ||
- (p_i_data->module_type[0][0]
- != p_i_data->module_type[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DIMM type on %s!", i_target_mba.toEcmdString());
- uint8_t& MODULE_TYPE_0_0 = p_i_data->module_type[0][0];
- uint8_t& MODULE_TYPE_0_1 = p_i_data->module_type[0][1];
- uint8_t& MODULE_TYPE_1_0 = p_i_data->module_type[1][0];
- uint8_t& MODULE_TYPE_1_1 = p_i_data->module_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DIMM_TYPE);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (
- (p_i_data->num_ranks[0][0]
- != p_i_data->num_ranks[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->num_ranks[0][1]
- != p_i_data->num_ranks[1][1])
- ||
- (p_i_data->num_ranks[0][0]
- != p_i_data->num_ranks[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DIMM ranks on %s!", i_target_mba.toEcmdString());
- uint8_t& NUM_RANKS_0_0 = p_i_data->num_ranks[0][0];
- uint8_t& NUM_RANKS_0_1 = p_i_data->num_ranks[0][1];
- uint8_t& NUM_RANKS_1_0 = p_i_data->num_ranks[1][0];
- uint8_t& NUM_RANKS_1_1 = p_i_data->num_ranks[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DIMM_RANKS);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (
- (p_i_data->sdram_banks[0][0]
- != p_i_data->sdram_banks[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->sdram_banks[0][1]
- != p_i_data->sdram_banks[1][1])
- ||
- (p_i_data->sdram_banks[0][0]
- != p_i_data->sdram_banks[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DIMM banks on %s!", i_target_mba.toEcmdString());
- uint8_t& SDRAM_BANKS_0_0 = p_i_data->sdram_banks[0][0];
- uint8_t& SDRAM_BANKS_0_1 = p_i_data->sdram_banks[0][1];
- uint8_t& SDRAM_BANKS_1_0 = p_i_data->sdram_banks[1][0];
- uint8_t& SDRAM_BANKS_1_1 = p_i_data->sdram_banks[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DIMM_BANKS);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (
- (p_i_data->sdram_rows[0][0]
- != p_i_data->sdram_rows[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->sdram_rows[0][1]
- != p_i_data->sdram_rows[1][1])
- ||
- (p_i_data->sdram_rows[0][0]
- != p_i_data->sdram_rows[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DIMM rows on %s!", i_target_mba.toEcmdString());
- uint8_t& SDRAM_ROWS_0_0 = p_i_data->sdram_rows[0][0];
- uint8_t& SDRAM_ROWS_0_1 = p_i_data->sdram_rows[0][1];
- uint8_t& SDRAM_ROWS_1_0 = p_i_data->sdram_rows[1][0];
- uint8_t& SDRAM_ROWS_1_1 = p_i_data->sdram_rows[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DIMM_ROWS);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (
- (p_i_data->sdram_columns[0][0]
- != p_i_data->sdram_columns[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->sdram_columns[0][1]
- != p_i_data->sdram_columns[1][1])
- ||
- (p_i_data->sdram_columns[0][0]
- != p_i_data->sdram_columns[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DIMM cols on %s!", i_target_mba.toEcmdString());
- uint8_t& SDRAM_COLS_0_0 = p_i_data->sdram_columns[0][0];
- uint8_t& SDRAM_COLS_0_1 = p_i_data->sdram_columns[0][1];
- uint8_t& SDRAM_COLS_1_0 = p_i_data->sdram_columns[1][0];
- uint8_t& SDRAM_COLS_1_1 = p_i_data->sdram_columns[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DIMM_COLUMNS);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (
- (p_i_data->module_memory_bus_width[0][0]
- != p_i_data->module_memory_bus_width[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->module_memory_bus_width[0][1]
- != p_i_data->module_memory_bus_width[1][1])
- ||
- (p_i_data->module_memory_bus_width[0][0]
- != p_i_data->module_memory_bus_width[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DRAM primary bus width on %s!",
- i_target_mba.toEcmdString());
- uint8_t& BUS_WIDTH_0_0 = p_i_data->module_memory_bus_width[0][0];
- uint8_t& BUS_WIDTH_0_1 = p_i_data->module_memory_bus_width[0][1];
- uint8_t& BUS_WIDTH_1_0 = p_i_data->module_memory_bus_width[1][0];
- uint8_t& BUS_WIDTH_1_1 = p_i_data->module_memory_bus_width[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_BUS_WIDTH);
- return rc;
- }
-//------------------------------------------------------------------------------
- // ATTR_SPD_MODULE_MEMORY_BUS_WIDTH, SPD byte8[4:3], only 64bit with ECC extension is allowed
- if ( p_i_data->module_memory_bus_width[0][0] !=
- fapi::ENUM_ATTR_SPD_MODULE_MEMORY_BUS_WIDTH_WE64 )
- {
- FAPI_ERR("Unsupported DRAM bus width on %s!",
- i_target_mba.toEcmdString());
- uint8_t& MODULE_MEMORY_BUS_WIDTH = p_i_data->module_memory_bus_width[0][0];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_UNSUPPORTED_MODULE_MEMORY_BUS_WIDTH);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (
- (p_i_data->dram_width[0][0]
- != p_i_data->dram_width[1][0])
- ||
- (
- (p_i_atts->eff_num_drops_per_port
- == fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_DUAL)
- &&
- (
- (p_i_data->dram_width[0][1]
- != p_i_data->dram_width[1][1])
- ||
- (p_i_data->dram_width[0][0]
- != p_i_data->dram_width[0][1])
- )
- )
- )
- {
- FAPI_ERR("Incompatable DRAM width on %s!", i_target_mba.toEcmdString());
- uint8_t& DRAM_WIDTH_0_0 = p_i_data->dram_width[0][0];
- uint8_t& DRAM_WIDTH_0_1 = p_i_data->dram_width[0][1];
- uint8_t& DRAM_WIDTH_1_0 = p_i_data->dram_width[1][0];
- uint8_t& DRAM_WIDTH_1_1 = p_i_data->dram_width[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_WIDTH);
- return rc;
- }
-//------------------------------------------------------------------------------
- return rc;
-} // end of mss_eff_config_verify_spd_data()
-
-//------------------------------------------------------------------------------
-// @brief mss_eff_config_setup_eff_atts(): This function sets up the
-// effective configuration attributes and does some extra
-// verification of SPD data
-//
-// @param const fapi::Target &i_target_mba: the fapi target
-// @param mss_eff_config_data *p_i_mss_eff_config_data: Pointer to
-// mss_eff_config_data variable structure
-// @param mss_eff_config_spd_data *p_i_data: Pointer to mss_eff
-// configuration spd data structure
-// @param mss_eff_config_atts *p_o_atts: Pointer to mss_eff
-// configuration attributes structure
-//
-// @return fapi::ReturnCode
-//------------------------------------------------------------------------------
-fapi::ReturnCode mss_eff_config_setup_eff_atts(
- const fapi::Target &i_target_mba,
- mss_eff_config_data *p_i_mss_eff_config_data,
- mss_eff_config_spd_data *p_i_data,
- mss_eff_config_atts *p_o_atts)
-{
- fapi::ReturnCode rc;
- const fapi::Target& TARGET_MBA = i_target_mba;
-
- uint8_t mss_dram_2n_mode_enable;
- rc = FAPI_ATTR_GET(ATTR_VPD_DRAM_2N_MODE_ENABLED, &i_target_mba, mss_dram_2n_mode_enable);
- if(rc) return rc;
- // set select atts members to non-zero
- if ( mss_dram_2n_mode_enable == fapi::ENUM_ATTR_VPD_DRAM_2N_MODE_ENABLED_TRUE ) {
- p_o_atts->eff_dram_al = fapi::ENUM_ATTR_EFF_DRAM_AL_CL_MINUS_2; // Always use AL = CL - 2 for 2N/2T mode
- } else {
- p_o_atts->eff_dram_al = fapi::ENUM_ATTR_EFF_DRAM_AL_CL_MINUS_1; // Always use AL = CL - 1 for 1N/1T mode
- }
-
- // Transfer powerdown request from system attr to DRAM attr
- uint8_t mss_power_control_requested;
- rc = FAPI_ATTR_GET(ATTR_MRW_POWER_CONTROL_REQUESTED, NULL, mss_power_control_requested);
- if(rc) return rc;
- if ( mss_power_control_requested == fapi::ENUM_ATTR_MRW_POWER_CONTROL_REQUESTED_FASTEXIT) {
- p_o_atts->eff_dram_dll_ppd = fapi::ENUM_ATTR_EFF_DRAM_DLL_PPD_FASTEXIT;
- } else {
- p_o_atts->eff_dram_dll_ppd = fapi::ENUM_ATTR_EFF_DRAM_DLL_PPD_SLOWEXIT; // if "OFF" default to SLOWEXIT, FASTEXIT settings in mba_def.initfile are causing fails. Workaround to use SLOWEXIT.
- }
-
- p_o_atts->eff_dram_dll_reset = fapi::ENUM_ATTR_EFF_DRAM_DLL_RESET_YES; // Always reset DLL at start of IPL.
- p_o_atts->eff_dram_srt = fapi::ENUM_ATTR_EFF_DRAM_SRT_EXTEND; // Always use extended operating temp range.
- p_o_atts->mss_cal_step_enable = 0xFF; // Always run all cal steps
- // array init
- for(int i = 0; i < PORT_SIZE; i++)
- {
- for(int j = 0; j < DIMM_SIZE; j++)
- {
- // i <-> PORT_SIZE, j <-> DIMM_SIZE
- p_o_atts->eff_stack_type[i][j] = 0;
- p_o_atts->eff_ibm_type[i][j] = 0;
- }
- }
-
- // Assigning values to attributes
-//------------------------------------------------------------------------------
- p_o_atts->eff_schmoo_wr_eye_min_margin = 70;
- p_o_atts->eff_schmoo_rd_eye_min_margin = 70;
- p_o_atts->eff_schmoo_dqs_clk_min_margin = 140;
- p_o_atts->eff_schmoo_rd_gate_min_margin = 100;
- p_o_atts->eff_schmoo_addr_cmd_min_margin = 140;
-//------------------------------------------------------------------------------
- switch(p_i_data->dram_device_type[0][0])
- {
- case fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3:
- p_o_atts->eff_dram_gen = fapi::ENUM_ATTR_EFF_DRAM_GEN_DDR3;
- break;
- case fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4:
- p_o_atts->eff_dram_gen = fapi::ENUM_ATTR_EFF_DRAM_GEN_DDR4;
- break;
- default:
- uint8_t& DRAM_DEVICE_TYPE=p_i_data->dram_device_type[0][0];
- FAPI_ERR("Unknown DRAM type on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_DRAM_DEVICE_ERROR);
- return rc;
- }
-//------------------------------------------------------------------------------
- switch(p_i_data->module_type[0][0])
- {
- // Removed CDIMM as a valid EFF_DIMM_TYPE.
- //case fapi::ENUM_ATTR_SPD_MODULE_TYPE_CDIMM:
- // p_o_atts->eff_dimm_type = fapi::ENUM_ATTR_EFF_DIMM_TYPE_CDIMM;
- // FAPI_INF("WARNING: ATTR_SPD_MODULE_TYPE_CDIMM is obsolete. Check your VPD for correct definition on %s!", i_target_mba.toEcmdString());
- // break;
- case fapi::ENUM_ATTR_SPD_MODULE_TYPE_RDIMM:
- p_o_atts->eff_dimm_type = fapi::ENUM_ATTR_EFF_DIMM_TYPE_RDIMM;
- break;
- case fapi::ENUM_ATTR_SPD_MODULE_TYPE_UDIMM:
- // Removed CDIMM as a valid EFF_DIMM_TYPE.
- //if(p_i_data->custom[0][0]) {
- // p_o_atts->eff_dimm_type = fapi::ENUM_ATTR_EFF_DIMM_TYPE_CDIMM;
- //}
- //else {
- p_o_atts->eff_dimm_type = fapi::ENUM_ATTR_EFF_DIMM_TYPE_UDIMM;
- //}
- break;
- case fapi::ENUM_ATTR_SPD_MODULE_TYPE_LRDIMM:
- p_o_atts->eff_dimm_type = fapi::ENUM_ATTR_EFF_DIMM_TYPE_LRDIMM;
- break;
- default:
- FAPI_ERR("Unknown DIMM type on %s!", i_target_mba.toEcmdString());
- uint8_t& MOD_TYPE = p_i_data->module_type[0][0];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_MOD_TYPE_ERROR);
- return rc;
- }
-//------------------------------------------------------------------------------
- // Moved from DIMM to MBA[port][dimm] attr per DanC. see dimm_spd_attributes.xml v1.40
- uint32_t l_rdimm_rcd_ibt[PORT_SIZE][DIMM_SIZE];
- uint8_t l_rdimm_rcd_output_timing[PORT_SIZE][DIMM_SIZE];
- if ( p_o_atts->eff_dimm_type == fapi::ENUM_ATTR_EFF_DIMM_TYPE_RDIMM ) {
- rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_RCD_IBT, &i_target_mba, l_rdimm_rcd_ibt);
- if (rc) return rc;
- rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_RCD_OUTPUT_TIMING, &i_target_mba, l_rdimm_rcd_output_timing);
- if (rc) return rc;
- }
-//------------------------------------------------------------------------------
- if(p_i_data->custom[0][0] == fapi::ENUM_ATTR_SPD_CUSTOM_YES) {
- p_o_atts->eff_custom_dimm = fapi::ENUM_ATTR_EFF_CUSTOM_DIMM_YES;
- }
- else {
- p_o_atts->eff_custom_dimm = fapi::ENUM_ATTR_EFF_CUSTOM_DIMM_NO;
- }
-//------------------------------------------------------------------------------
- switch(p_i_data->sdram_banks[0][0])
- {
- case fapi::ENUM_ATTR_SPD_SDRAM_BANKS_B4:
- p_o_atts->eff_dram_banks = 4; // DDR4 only
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_BANKS_B8:
- p_o_atts->eff_dram_banks = 8;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_BANKS_B16:
- p_o_atts->eff_dram_banks = 16;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_BANKS_B32:
- p_o_atts->eff_dram_banks = 32;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_BANKS_B64:
- p_o_atts->eff_dram_banks = 64;
- break;
- default:
- FAPI_ERR("Unknown DRAM banks on %s!", i_target_mba.toEcmdString());
- uint8_t& SDRAM_BANKS= p_i_data->sdram_banks[0][0];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_SDRAM_BANK_ERROR);
- return rc;
- }
-//------------------------------------------------------------------------------
- switch (p_i_data->sdram_rows[0][0])
- {
- case fapi::ENUM_ATTR_SPD_SDRAM_ROWS_R12:
- p_o_atts->eff_dram_rows = 12;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_ROWS_R13:
- p_o_atts->eff_dram_rows = 13;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_ROWS_R14:
- p_o_atts->eff_dram_rows = 14;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_ROWS_R15:
- p_o_atts->eff_dram_rows = 15;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_ROWS_R16:
- p_o_atts->eff_dram_rows = 16;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_ROWS_R17:
- p_o_atts->eff_dram_rows = 17;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_ROWS_R18:
- p_o_atts->eff_dram_rows = 18;
- break;
- default:
- FAPI_ERR("Unknown DRAM rows on %s!", i_target_mba.toEcmdString());
- uint8_t& SDRAM_ROWS= p_i_data->sdram_rows[0][0];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_SDRAM_ROWS_ERROR);
- return rc;
- }
-//------------------------------------------------------------------------------
- switch (p_i_data->sdram_columns[0][0])
- {
- case fapi::ENUM_ATTR_SPD_SDRAM_COLUMNS_C9:
- p_o_atts->eff_dram_cols = 9;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_COLUMNS_C10:
- p_o_atts->eff_dram_cols = 10;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_COLUMNS_C11:
- p_o_atts->eff_dram_cols = 11;
- break;
- case fapi::ENUM_ATTR_SPD_SDRAM_COLUMNS_C12:
- p_o_atts->eff_dram_cols = 12;
- break;
- default:
- FAPI_ERR("Unknown DRAM cols on %s!", i_target_mba.toEcmdString());
- uint8_t& SDRAM_COLS= p_i_data->sdram_columns[0][0];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_SDRAM_COLS_ERROR);
- return rc;
- }
-//------------------------------------------------------------------------------
- uint8_t& DRAM_WIDTH= p_i_data->dram_width[0][0];
- if (p_i_data->dram_width[0][0]
- == fapi::ENUM_ATTR_SPD_DRAM_WIDTH_W4)
- {
- p_o_atts->eff_dram_width = fapi::ENUM_ATTR_EFF_DRAM_WIDTH_X4;
- p_o_atts->eff_dram_tdqs = fapi::ENUM_ATTR_EFF_DRAM_TDQS_DISABLE;
- }
- else if (p_i_data->dram_width[0][0]
- == fapi::ENUM_ATTR_SPD_DRAM_WIDTH_W8)
- {
- p_o_atts->eff_dram_width = fapi::ENUM_ATTR_EFF_DRAM_WIDTH_X8;
- // NOTE: TDQS enable MR1(A11) is only avaliable for X8 in DDR3
- // TDQS disabled for X8 DDR3 CDIMM, enable for ISDIMM
- if ( p_o_atts->eff_custom_dimm == fapi::ENUM_ATTR_EFF_CUSTOM_DIMM_NO ) {
- p_o_atts->eff_dram_tdqs = fapi::ENUM_ATTR_EFF_DRAM_TDQS_ENABLE;
- } else {
- p_o_atts->eff_dram_tdqs = fapi::ENUM_ATTR_EFF_DRAM_TDQS_DISABLE;
- }
- }
- else if (p_i_data->dram_width[0][0]
- == fapi::ENUM_ATTR_SPD_DRAM_WIDTH_W16)
- {
- p_o_atts->eff_dram_width = fapi::ENUM_ATTR_EFF_DRAM_WIDTH_X16;
- FAPI_ERR("Unsupported DRAM width x16 on %s!",
- i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_DRAM_WIDTH_16_ERROR);
- return rc;
- }
- else if (p_i_data->dram_width[0][0]
- == fapi::ENUM_ATTR_SPD_DRAM_WIDTH_W32)
- {
- p_o_atts->eff_dram_width = fapi::ENUM_ATTR_EFF_DRAM_WIDTH_X32;
- FAPI_ERR("Unsupported DRAM width x32 on %s!",
- i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_DRAM_WIDTH_32_ERROR);
- return rc;
-
- }
- else
- {
- FAPI_ERR("Unknown DRAM width on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_DRAM_WIDTH_ERROR);
- return rc;
- }
-//------------------------------------------------------------------------------
- p_o_atts->eff_dram_density = 16;
-
- uint8_t allow_port_size = 1;
- if (p_i_mss_eff_config_data->allow_single_port == fapi::ENUM_ATTR_MSS_ALLOW_SINGLE_PORT_FALSE) {
- allow_port_size = PORT_SIZE;
- }
- for (int l_cur_mba_port = 0; l_cur_mba_port < allow_port_size; l_cur_mba_port += 1)
- {
- for (int l_cur_mba_dimm = 0; l_cur_mba_dimm <
- p_o_atts->eff_num_drops_per_port; l_cur_mba_dimm += 1)
- {
- if (p_i_data->sdram_density[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_SDRAM_DENSITY_D16GB)
- {
- p_i_mss_eff_config_data->cur_dram_density = 16;
- }
- else if (p_i_data->sdram_density[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_SDRAM_DENSITY_D8GB)
- {
- p_i_mss_eff_config_data->cur_dram_density = 8;
- }
- else if (p_i_data->sdram_density[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_SDRAM_DENSITY_D4GB)
- {
- p_i_mss_eff_config_data->cur_dram_density = 4;
- }
- else if (p_i_data->sdram_density[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_SDRAM_DENSITY_D2GB)
- {
- p_i_mss_eff_config_data->cur_dram_density = 2;
- }
- else if (p_i_data->sdram_density[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_SDRAM_DENSITY_D1GB)
- {
- p_i_mss_eff_config_data->cur_dram_density = 1;
- }
- else
- {
- uint8_t& SDRAM_DENSITY = p_i_data->sdram_density[l_cur_mba_port][l_cur_mba_dimm];
- p_i_mss_eff_config_data->cur_dram_density = 1;
- if (p_i_mss_eff_config_data->allow_single_port == fapi::ENUM_ATTR_MSS_ALLOW_SINGLE_PORT_FALSE) {
- FAPI_ERR("Unsupported DRAM density on %s!",
- i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_DRAM_DENSITY_ERR);
- return rc;
- }
- }
-//------------------------------------------------------------------------------
- if (p_o_atts->eff_dram_density >
- p_i_mss_eff_config_data->cur_dram_density)
- {
- p_o_atts->eff_dram_density =
- p_i_mss_eff_config_data->cur_dram_density;
- }
-//------------------------------------------------------------------------------
- // Identify/Verify DIMM voltage compatability
- // See mss_volt.C
-//------------------------------------------------------------------------------
- // Identify/Assign minimum timing
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm] =
- (p_i_data->mtb_dividend[l_cur_mba_port]
- [l_cur_mba_dimm] * 1000)
- /
- p_i_data->mtb_divisor[l_cur_mba_port]
- [l_cur_mba_dimm];
-//------------------------------------------------------------------------------
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm] =
- (p_i_data->ftb_dividend[l_cur_mba_port]
- [l_cur_mba_dimm] * 1000)
- /
- p_i_data->ftb_divisor[l_cur_mba_port]
- [l_cur_mba_dimm];
-//------------------------------------------------------------------------------
- // Calculate CL
- // See mss_freq.C
- // call calc_timing_in_clk()
- p_i_mss_eff_config_data->dram_wr = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->twrmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
-
- );
- if (p_i_mss_eff_config_data->dram_wr > p_o_atts->eff_dram_wr)
- {
- p_o_atts->eff_dram_wr = p_i_mss_eff_config_data->dram_wr;
- }
-//------------------------------------------------------------------------------
- // call calc_timing_in_clk()
- p_i_mss_eff_config_data->dram_trcd = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trcdmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->fine_offset_trcdmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_trcd >
- p_o_atts->eff_dram_trcd)
- {
- p_o_atts->eff_dram_trcd =
- p_i_mss_eff_config_data->dram_trcd;
- }
-//------------------------------------------------------------------------------
- if (p_i_data->dram_device_type[0][0] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) {
- // DDR3
- p_i_mss_eff_config_data->dram_trrd = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trrdmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_trrd >
- p_o_atts->eff_dram_trrd)
- {
- p_o_atts->eff_dram_trrd =
- p_i_mss_eff_config_data->dram_trrd;
- }
- } else if (p_i_data->dram_device_type[0][0] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- // DDR4
- FAPI_INF("DDR4 Check: spd tRRDs=0x%x, tRRDl=0x%x, mtb=%i, ftb=%i, width=%i",
- p_i_data->trrdsmin[l_cur_mba_port][l_cur_mba_dimm],
- p_i_data->trrdlmin[l_cur_mba_port][l_cur_mba_dimm],
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_o_atts->eff_dram_width);
- const uint8_t min_delay_clocks = 4;
- uint32_t max_delay; // in ps
- // bool is_2K_page = 0;
-
- // get the spd min trrd in clocks
- p_i_mss_eff_config_data->dram_trrd = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_i_data->trrdsmin[l_cur_mba_port][l_cur_mba_dimm],
- 0, // need to put in the trrdsmin_ftb here...
- p_i_mss_eff_config_data->mss_freq
- );
-
- // trrdsmin from SPD is absolute min of DIMM.
- // need to know page size, then use 6ns for (2k page) otherwise 5ns
-
- FAPI_INF("DDR4 Check: p_i_tRRD_s(nCK) = %i", p_i_mss_eff_config_data->dram_trrd);
- FAPI_INF("Attribute p_o_eff_dram_trrd = %i", p_o_atts->eff_dram_trrd);
- // need a table here for other speeds/page sizes
-
- // trrd_s = 2K page @ 1600, max(4nCK,6ns) since min nCK=1.25ns, const 6ns
- // 1/2 or 1K page @ 1600, max(4nCK, 5ns)
-
- // 1600 1866 2133 2400 (data rate)
- // 6, 5.3, 5.3, 5.3 ns for 2k page size (x16)
- // 5, 4.2, 3.7, 3.3 ns for 0.5k or 1k page size (x8)
- // !! NOTE !! NOT supporting 2k page size (with check for width above should cause error out).
-
- if (p_i_mss_eff_config_data->mss_freq < 1733) // 1600
- {
- max_delay = 5000; // in ps
- }
- else if (p_i_mss_eff_config_data->mss_freq < 2000) // 1866
- {
- max_delay = 4200; // in ps
- }
- else if (p_i_mss_eff_config_data->mss_freq < 2267) // 2133
- {
- max_delay = 3700; // in ps
- }
- else // if (p_i_mss_eff_config_data->mss_freq < 2533) // 2400
- {
- max_delay = 3300; // in ps
- }
-/* else if (p_i_mss_eff_config_data->mss_freq < 2933) // 2666
- {
- max_delay = ??00; // in ps
- }
- else // if (p_i_mss_eff_config_data->mss_freq < ????) // 3200
- {
- max_delay = ??00; // in ps
- }
-
-*/
- uint8_t max_delay_clocks = calc_timing_in_clk
- (1, 0, max_delay, 0, p_i_mss_eff_config_data->mss_freq);
-
- // find max between min_delay_clocks, max_delay_clocks and dev_min
-
- if (min_delay_clocks > max_delay_clocks)
- max_delay_clocks = min_delay_clocks;
-
- if (p_i_mss_eff_config_data->dram_trrd > max_delay_clocks)
- max_delay_clocks = p_i_mss_eff_config_data->dram_trrd;
-
- if (max_delay_clocks > p_o_atts->eff_dram_trrd)
- p_o_atts->eff_dram_trrd = max_delay_clocks;
-
-//---------------------------------------------------------------------------------------
-// trrd_l = max(4nCK,7.5ns)
- // 1600 1866 2133 2400 (data rate)
- // 7.5 6.4, 6.4, 6.4 ns for 2k page size (x16)
- // 6, 5.3, 5.3, 4.9 ns for 0.5k or 1k page size (x8)
- // !! NOTE !! NOT supporting 2k page size (with check for width above should cause error out).
- p_i_mss_eff_config_data->dram_trrdl = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_i_data->trrdlmin[l_cur_mba_port][l_cur_mba_dimm],
- 0, // need to put in the trrdlmin_ftb here...
- p_i_mss_eff_config_data->mss_freq
- );
-
- // condense this later with the if/else above...
- if (p_i_mss_eff_config_data->mss_freq < 1733) // 1600
- {
- max_delay = 6000; // in ps
- }
- else if (p_i_mss_eff_config_data->mss_freq < 2000) // 1866
- {
- max_delay = 5300; // in ps
- }
- else if (p_i_mss_eff_config_data->mss_freq < 2267) // 2133
- {
- max_delay = 5300; // in ps
- }
- else // if (p_i_mss_eff_config_data->mss_freq < 2533) // 2400
- {
- max_delay = 4900; // in ps
- }
-/* else if (p_i_mss_eff_config_data->mss_freq < 2933) // 2666
- {
- max_delay = ??00; // in ps
- }
- else // if (p_i_mss_eff_config_data->mss_freq < ????) // 3200
- {
- max_delay = ??00; // in ps
- }
-
-*/
- max_delay_clocks = calc_timing_in_clk
- (1, 0, max_delay, 0, p_i_mss_eff_config_data->mss_freq);
- if (max_delay_clocks > p_o_atts->eff_dram_trrdl)
- {
- p_o_atts->eff_dram_trrdl = max_delay_clocks;
- }
- else if (p_i_mss_eff_config_data->dram_trrdl > p_o_atts->eff_dram_trrdl)
- {
- p_o_atts->eff_dram_trrdl = p_i_mss_eff_config_data->dram_trrdl;
- }
- FAPI_INF("DDR4 tRRDs = %i, tRRDl = %i", p_o_atts->eff_dram_trrd, p_o_atts->eff_dram_trrdl);
- } else {
- FAPI_ERR("Incompatable DRAM generation on %s!",i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (p_i_data->dram_device_type[0][0] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- p_i_mss_eff_config_data->dram_tccdl = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->tccdlmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_tccdl >
- p_o_atts->eff_dram_tccdl)
- {
- p_o_atts->eff_dram_tccdl =
- p_i_mss_eff_config_data->dram_tccdl;
- }
- }
-//------------------------------------------------------------------------------
- p_i_mss_eff_config_data->dram_trp = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trpmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->fine_offset_trpmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_trp > p_o_atts->eff_dram_trp)
- {
- p_o_atts->eff_dram_trp = p_i_mss_eff_config_data->dram_trp;
- }
-//------------------------------------------------------------------------------
- if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) {
- p_i_mss_eff_config_data->dram_twtr = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->twtrmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_twtr > p_o_atts->eff_dram_twtr)
- {
- p_o_atts->eff_dram_twtr = p_i_mss_eff_config_data->dram_twtr;
- }
- } else if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- p_i_mss_eff_config_data->dram_twtr = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->twtrsmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- // twtr_s = max(2nCK,2.5ns) since min nCK=1.25ns, const 2.5ns
- //FAPI_INF("DDR4 Check: tWTR in CLKS = %i (2.5ns)", p_i_mss_eff_config_data->dram_twtr);
- //FAPI_INF("Attribute eff_dram_twtr = %i", p_o_atts->eff_dram_twtr);
- p_o_atts->eff_dram_twtr = p_i_mss_eff_config_data->dram_twtr;
-
- // twtr_l = max(4nCK,7.5ns)
- p_i_mss_eff_config_data->dram_twtrl = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->twtrlmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
-
- if (p_i_mss_eff_config_data->dram_twtrl < 4) {
- p_o_atts->eff_dram_twtrl = 4;
- } else {
- p_o_atts->eff_dram_twtrl = p_i_mss_eff_config_data->dram_twtrl;
- }
- FAPI_INF("DDR4 twtrs = %i, twtrl = %i", p_o_atts->eff_dram_twtr, p_o_atts->eff_dram_twtrl);
- } else {
- FAPI_ERR("Incompatable DRAM generation on %s!",i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
-//------------------------------------------------------------------------------
- p_i_mss_eff_config_data->dram_trtp = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trtpmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) {
- if (p_i_mss_eff_config_data->dram_trtp > p_o_atts->eff_dram_trtp) {
- p_o_atts->eff_dram_trtp = p_i_mss_eff_config_data->dram_trtp;
- }
- } else if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- // max (4nCK, 7.5ns), 7.5ns=
- //FAPI_INF("DDR4 Check: tRTP in CLKS = %i (should be 6)", p_i_mss_eff_config_data->dram_trtp);
- //FAPI_INF("Attribute eff_dram_trtp= %i", p_o_atts->eff_dram_trtp);
- if (p_i_mss_eff_config_data->dram_trtp < 4)
- {
- p_o_atts->eff_dram_trtp = 4;
- } else {
- p_o_atts->eff_dram_trtp = p_i_mss_eff_config_data->dram_trtp;
- }
- } else {
- FAPI_ERR("Incompatable DRAM generation on %s!",i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
-
-//------------------------------------------------------------------------------
- p_i_mss_eff_config_data->dram_tras = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trasmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_tras >
- p_o_atts->eff_dram_tras_u32)
- {
- p_o_atts->eff_dram_tras_u32 =
- p_i_mss_eff_config_data->dram_tras;
- }
-//------------------------------------------------------------------------------
- p_i_mss_eff_config_data->dram_trc = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trcmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->fine_offset_trcmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_trc >
- p_o_atts->eff_dram_trc_u32)
- {
- p_o_atts->eff_dram_trc_u32 =
- p_i_mss_eff_config_data->dram_trc;
- }
-//------------------------------------------------------------------------------
- if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) {
- p_i_mss_eff_config_data->dram_trfc = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trfcmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_trfc >
- p_o_atts->eff_dram_trfc)
- {
- p_o_atts->eff_dram_trfc =
- p_i_mss_eff_config_data->dram_trfc;
- }
- } else if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- p_i_mss_eff_config_data->dram_trfc = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->trfc1min[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- FAPI_INF("DDR4 Check: spd trfc = 0x%x (%i clks), o_attr=0x%x",
- p_i_data->trfc1min[l_cur_mba_port][l_cur_mba_dimm],
- p_i_mss_eff_config_data->dram_trfc,
- p_o_atts->eff_dram_trfc
- );
- if (p_i_mss_eff_config_data->dram_trfc >
- p_o_atts->eff_dram_trfc)
- {
- p_o_atts->eff_dram_trfc =
- p_i_mss_eff_config_data->dram_trfc;
- }
- // AST HERE: Need DDR4 attributes for other refresh rates, 2x, 4x
-
- } else {
- FAPI_ERR("Incompatable DRAM generation on %s!",i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
-//------------------------------------------------------------------------------
- if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) {
- p_i_mss_eff_config_data->dram_tfaw = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port]
- [l_cur_mba_dimm],
- p_i_data->tfawmin[l_cur_mba_port]
- [l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
- if (p_i_mss_eff_config_data->dram_tfaw >
- p_o_atts->eff_dram_tfaw_u32)
- {
- p_o_atts->eff_dram_tfaw_u32 =
- p_i_mss_eff_config_data->dram_tfaw;
- }
- } else if (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- p_i_mss_eff_config_data->dram_tfaw = calc_timing_in_clk
- (
- p_i_mss_eff_config_data->mtb_in_ps_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_i_mss_eff_config_data->ftb_in_fs_u32array[l_cur_mba_port][l_cur_mba_dimm],
- p_i_data->tfawmin[l_cur_mba_port][l_cur_mba_dimm],
- 0,
- p_i_mss_eff_config_data->mss_freq
- );
-FAPI_DBG("DDR4 Check: SPD=0x%x, p_i_tFAWmin (nCK) = %i",
- p_i_data->tfawmin[l_cur_mba_port][l_cur_mba_dimm], p_i_mss_eff_config_data->dram_tfaw);
-
- // example x8, 1600, min= 25ns => 25/1.25 = 20 clocks
- const uint8_t min_clks [][6] = { // width, data rate
- // NOTE: 2666 and 3200 are TBD, using guess values
- // 1600 1866 2133 2400 2666 3200
- { 16, 16, 16, 16, 16, 16}, // x4 (page size = 1/2K)
- { 20, 22, 23, 26, 29, 32} // x8 (page size = 1K)
- //{ xx, xx, xx, xx, TBD, TBD}, // x16(page size = 2K)
- };
-
- uint8_t speed_idx;
- uint8_t width_idx;
-
- if (p_i_data->dram_width[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_WIDTH_W4)
- {
- width_idx = 0;
- }
- else //(p_i_data->dram_width[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_DRAM_WIDTH_W8)
- {
- width_idx = 1;
- }
- //else (p_i_data->dram_width == fapi::ENUM_ATTR_SPD_DRAM_WIDTH_W16)
-
-
- if (p_i_mss_eff_config_data->mss_freq < 1733) // 1600
- {
- speed_idx = 0; // 1.25ns
- }
- else if (p_i_mss_eff_config_data->mss_freq < 2000) // 1866
- {
- speed_idx = 1; // 1.0718ns
- }
- else if (p_i_mss_eff_config_data->mss_freq < 2267) // 2133
- {
- speed_idx = 2; // 0.9376ns
- }
- else // if (p_i_mss_eff_config_data->mss_freq < 2533) // 2400
- {
- speed_idx = 3; // 0.8333ns
- }
- // else if (p_i_mss_eff_config_data->mss_freq < 2933) // 2666
- // {
- // speed_idx = 4; // 0.7502ns
- // }
- // else // if (p_i_mss_eff_config_data->mss_freq < ????) // 3200
- // {
- // speed_idx = 5; // 0.625ns
- // }
-
- if (p_o_atts->eff_dram_tfaw_u32 < min_clks[width_idx][speed_idx])
- {
- p_o_atts->eff_dram_tfaw_u32 = min_clks[width_idx][speed_idx];
- }
-/*
- fapi::Target l_target_centaur;
- rc = fapiGetParentChip(i_target_mba, l_target_centaur);
- if(rc) break;
- uint8_t ec_tfaw_16_problem;
- // need ATTRIBUTE for this....
- rc = FAPI_ATTR_GET(ATTR_MSS_DISABLE1_REG_FIXED, &i_target_centaur, ec_tfaw_16_problem);
- if(rc) break;
-*/
- if (p_o_atts->eff_dram_tfaw_u32 == 16) // due to logic bug above
- {
- p_o_atts->eff_dram_tfaw_u32 = 15;
- FAPI_INF("setting tFAW to 15 due to bug");
- }
- FAPI_DBG("Attribute p_o_eff_dram_tfaw = %i", p_o_atts->eff_dram_tfaw_u32);
- } else {
- FAPI_ERR("Incompatable DRAM generation on %s!",i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
-//------------------------------------------------------------------------------
- } // inner for loop
- } // outter for loop
-
- // Calculate CWL
- if (p_i_data->dram_device_type[0][0] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) {
- if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 2500)
- {
- p_o_atts->eff_dram_cwl = 5;
- }
- else if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 1875)
- {
- p_o_atts->eff_dram_cwl = 6;
- }
- else if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 1500)
- {
- p_o_atts->eff_dram_cwl = 7;
- }
- else if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 1250)
- {
- p_o_atts->eff_dram_cwl = 8;
- }
- else if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 1070)
- {
- p_o_atts->eff_dram_cwl = 9;
- }
- else if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 935)
- {
- p_o_atts->eff_dram_cwl = 10;
- }
- else if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 833)
- {
- p_o_atts->eff_dram_cwl = 11;
- }
- else if ((TWO_MHZ/p_i_mss_eff_config_data->mss_freq) >= 750)
- {
- p_o_atts->eff_dram_cwl = 12;
- }
- else
- {
- const uint16_t& CWL_VAL = (TWO_MHZ/p_i_mss_eff_config_data->mss_freq);
- FAPI_ERR("Error calculating CWL");
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_CWL_CALC_ERR);
- return rc;
- }
- } else if (p_i_data->dram_device_type[0][0] == fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR4) {
- // 1st set only
- // need to look at this again...
- if (p_i_mss_eff_config_data->mss_freq <= (1600 * 1.05)) // 1600
- {
- p_o_atts->eff_dram_cwl = 9;
- }
- else if (p_i_mss_eff_config_data->mss_freq <= (1866 * 1.05)) // 1866
- {
- p_o_atts->eff_dram_cwl = 10;
- }
- else if (p_i_mss_eff_config_data->mss_freq <= (2133 * 1.05)) // 2133
- {
- p_o_atts->eff_dram_cwl = 11;
- }
- else if (p_i_mss_eff_config_data->mss_freq <= (2400 * 1.05)) // 2400
- {
- p_o_atts->eff_dram_cwl = 12;
- }
- else if (p_i_mss_eff_config_data->mss_freq <= (2666 * 1.05)) // 2666
- {
- p_o_atts->eff_dram_cwl = 14;
- }
- else if (p_i_mss_eff_config_data->mss_freq <= (3200 * 1.05)) // 2666
- {
- p_o_atts->eff_dram_cwl = 16;
- }
- else
- {
- const uint16_t& CWL_VAL = (TWO_MHZ/p_i_mss_eff_config_data->mss_freq);
- FAPI_ERR("Error calculating CWL");
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_CWL_CALC_ERR);
- return rc;
- }
- } else {
- FAPI_ERR("Incompatable DRAM generation on %s!",i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
-//------------------------------------------------------------------------------
- // Calculate ZQCAL Interval based on the following equation from Ken:
- // 0.5
- // ------------------------------ = 13.333ms
- // (1.5 * 10) + (0.15 * 150)
-
- //p_o_atts->eff_zqcal_interval = 0;
- p_o_atts->eff_zqcal_interval = ( 13333 *
- p_i_mss_eff_config_data->mss_freq) / 2;
-//------------------------------------------------------------------------------
- // Calculate MEMCAL Interval based on 1sec interval across all bits per DP18
-
- //p_o_atts->eff_memcal_interval = 0;
- p_o_atts->eff_memcal_interval = (62500 *
- p_i_mss_eff_config_data->mss_freq) / 2;
-//------------------------------------------------------------------------------
- // Calculate tRFI
- p_o_atts->eff_dram_trfi = (3900 *
- p_i_mss_eff_config_data->mss_freq) / 2000;
- // Added 10% margin to TRFI per defect HW248225
- p_o_atts->eff_dram_trfi = (p_o_atts->eff_dram_trfi * 9) / 10;
-
- p_o_atts->eff_vpd_version = 0xFFFFFF; // set VPD version to a large number, searching for smallest
- // the VPD version is 2 ASCI characters, so this is always later than that
-
- // Assigning dependent values to attributes
- for (int l_cur_mba_port = 0; l_cur_mba_port <
- PORT_SIZE; l_cur_mba_port += 1)
- {
- for (int l_cur_mba_dimm = 0; l_cur_mba_dimm <
- DIMM_SIZE; l_cur_mba_dimm += 1)
- {
- if (p_i_mss_eff_config_data->
- cur_dimm_spd_valid_u8array[l_cur_mba_port][l_cur_mba_dimm] == MSS_EFF_VALID)
- {
- if (p_i_data->num_ranks[l_cur_mba_port]
- [l_cur_mba_dimm] == 0x04) // for 8R LRDIMM since no ENUM defined yet for SPD of 8R
-// [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_NUM_RANKS_R8)
- {
- p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] = 8;
- p_o_atts->eff_dimm_ranks_configed[l_cur_mba_port]
- [l_cur_mba_dimm] = 0x80; // DD0/1: 1 master rank
- }
- else if (p_i_data->num_ranks[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_NUM_RANKS_R4)
- {
- p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] = 4;
- p_o_atts->eff_dimm_ranks_configed[l_cur_mba_port]
- [l_cur_mba_dimm] = 0xF0;
- }
- else if (p_i_data->num_ranks[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_NUM_RANKS_R2)
- {
- p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] = 2;
- p_o_atts->eff_dimm_ranks_configed[l_cur_mba_port]
- [l_cur_mba_dimm] = 0xC0;
- }
- else if (p_i_data->num_ranks[l_cur_mba_port]
- [l_cur_mba_dimm] == fapi::ENUM_ATTR_SPD_NUM_RANKS_R1)
- {
- p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] = 1;
- p_o_atts->eff_dimm_ranks_configed[l_cur_mba_port]
- [l_cur_mba_dimm] = 0x80;
- } else
- {
- p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] = 0;
- p_o_atts->eff_dimm_ranks_configed[l_cur_mba_port]
- [l_cur_mba_dimm] = 0x00;
- }
-
- if ( p_i_data->sdram_device_type[l_cur_mba_port][l_cur_mba_dimm] ==
- fapi::ENUM_ATTR_SPD_SDRAM_DEVICE_TYPE_NON_STANDARD) {
- p_o_atts->eff_stack_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_STACK_TYPE_DDP_QDP;
- } else {
- p_o_atts->eff_stack_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_STACK_TYPE_NONE;
- }
-
- uint8_t& UNSUPPORTED_VAL = p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm];
- // AST HERE: Needed SPD byte33[7,1:0], for expanded IBM_TYPE
- if ( p_o_atts->eff_dimm_type == fapi::ENUM_ATTR_EFF_DIMM_TYPE_RDIMM ) {
- if (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] == 1) {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_TYPE_1A;
- } else if (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] == 2) {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_TYPE_1B;
- } else if (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] == 4) {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_TYPE_1D;
- } else {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_UNDEFINED;
- FAPI_ERR("Currently unsupported IBM_TYPE on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_RDIMM_UNSUPPORTED_TYPE); return rc;
- }
- } else if (( p_o_atts->eff_dimm_type == fapi::ENUM_ATTR_EFF_DIMM_TYPE_UDIMM ) && ( p_o_atts->eff_custom_dimm == fapi::ENUM_ATTR_EFF_CUSTOM_DIMM_YES )) {
- if (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] == 1) {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_TYPE_1A;
- } else if (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] == 2) {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_TYPE_1B;
- } else {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_UNDEFINED;
- FAPI_ERR("Currently unsupported IBM_TYPE on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_UDIMM_UNSUPPORTED_TYPE); return rc;
- }
- } else if ( p_o_atts->eff_dimm_type == fapi::ENUM_ATTR_EFF_DIMM_TYPE_LRDIMM ) {
- if (p_o_atts->eff_dram_gen == fapi::ENUM_ATTR_EFF_DRAM_GEN_DDR3) {
- FAPI_INF("Will set LR atts after orig eff_config functions");
- } else if (p_o_atts->eff_dram_gen == fapi::ENUM_ATTR_EFF_DRAM_GEN_DDR4) { // need to update this later...
- if (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] == 4) {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_TYPE_5C;
- } else {
- FAPI_INF("Will set LR atts after orig eff_config functions");
- }
- } else {
- FAPI_ERR("Incompatable DRAM generation on %s!",i_target_mba.toEcmdString());
- uint8_t& DRAM_DEVICE_TYPE_0_0 = p_i_data->dram_device_type[0][0];
- uint8_t& DRAM_DEVICE_TYPE_0_1 = p_i_data->dram_device_type[0][1];
- uint8_t& DRAM_DEVICE_TYPE_1_0 = p_i_data->dram_device_type[1][0];
- uint8_t& DRAM_DEVICE_TYPE_1_1 = p_i_data->dram_device_type[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INCOMPATABLE_DRAM_GEN);
- return rc;
- }
- } else {
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_UNDEFINED;
- FAPI_ERR("Currently unsupported DIMM_TYPE on %s!", i_target_mba.toEcmdString());
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_DIMM_UNSUPPORTED_TYPE); return rc;
- }
- } else {
- p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] = 0;
- p_o_atts->eff_dimm_ranks_configed[l_cur_mba_port]
- [l_cur_mba_dimm] = 0x00;
- p_o_atts->eff_stack_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_STACK_TYPE_NONE;
- p_o_atts->eff_ibm_type[l_cur_mba_port][l_cur_mba_dimm] = fapi::ENUM_ATTR_EFF_IBM_TYPE_UNDEFINED;
- }
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
- if (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] != 0)
- {
- // structured equations as such due to long names
- // example: answer = ((num1)*(num2)*(const)) / ((const) * (num3));
- // becomes:
- // answer =
- // (
- // (num1)
- // *
- // (num2)
- // *
- // (const)
- // )
- // /
- // (
- // (const)
- // *
- // (num3)
- // );
- //
- // dimm_size = dram_density / 8 * primary_bus_width
- // / dram_width * num_ranks_per_dimm
- p_o_atts->eff_dimm_size[l_cur_mba_port][l_cur_mba_dimm] =
- (
- (p_o_atts->eff_dram_density)
- *
- (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm])
- *
- 64
- )
- /
- (
- 8
- *
- (p_o_atts->eff_dram_width)
- );
- }
- else
- {
- p_o_atts->eff_dimm_size[l_cur_mba_port]
- [l_cur_mba_dimm] = 0;
- }
-
-
- if ( (p_o_atts->eff_dimm_type == fapi::ENUM_ATTR_EFF_DIMM_TYPE_LRDIMM) &&
- (p_i_data->dram_device_type[l_cur_mba_port][l_cur_mba_dimm] ==
- fapi::ENUM_ATTR_SPD_DRAM_DEVICE_TYPE_DDR3) &&
- (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] == 8) )
- {
- p_o_atts->eff_num_master_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] = 1;
- }
- else
- {
- // AST HERE: Needs SPD byte33[7,1:0],
- // currently hard coded to no stacking
- p_o_atts->eff_num_master_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm] =
- p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port]
- [l_cur_mba_dimm];
- }
-
- // Populate RCD_CNTL_WORD for RDIMM, add hardcode to RC0-DA4=0b0 RC9-DBA1-DBA0-DA4-DA3=0b00X0, merge in ATTR_VPD_DIMM_RCD_IBT ATTR_VPD_DIMM_RCD_OUTPUT_TIMING, and adjust in RC10 and RC11 for freq/voltage
- if (( p_o_atts->eff_dimm_type == fapi::ENUM_ATTR_EFF_DIMM_TYPE_RDIMM ) && (p_o_atts->eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm] != 0)) {
-
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_i_data->rdimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm];
-
- uint64_t l_rcd_hardcode_mask = 0xDFFFFFFFF2FFFFFFLL;
- uint64_t l_mss_freq_mask = 0xFFFFFFFFFF8FFFFFLL;
- uint64_t l_mss_volt_mask = 0xFFFFFFFFFFFCFFFFLL;
- uint64_t l_rcd_ibt_mask = 0xFFBFFFFF8FFFFFFFLL;
- uint64_t l_rcd_output_timing_mask = 0xFFDFFFFFFFFFFFFFLL;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] & l_rcd_hardcode_mask;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] & l_mss_freq_mask;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] & l_mss_volt_mask;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] & l_rcd_ibt_mask;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] & l_rcd_output_timing_mask;
-
- if ( p_i_mss_eff_config_data->mss_freq <= 933 ) { // 800Mbps
- l_mss_freq_mask = 0x0000000000000000LL;
- } else if ( p_i_mss_eff_config_data->mss_freq <= 1200 ) { // 1066Mbps
- l_mss_freq_mask = 0x0000000000100000LL;
- } else if ( p_i_mss_eff_config_data->mss_freq <= 1466 ) { // 1333Mbps
- l_mss_freq_mask = 0x0000000000200000LL;
- } else if ( p_i_mss_eff_config_data->mss_freq <= 1733 ) { // 1600Mbps
- l_mss_freq_mask = 0x0000000000300000LL;
- } else { // 1866Mbps
- FAPI_ERR("Invalid RDIMM ATTR_MSS_FREQ = %d on %s!", p_i_mss_eff_config_data->mss_freq, i_target_mba.toEcmdString());
- uint32_t& INVALID_RDIMM_FREQ = p_i_mss_eff_config_data->mss_freq;
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INVALID_RDIMM_FREQ); return rc;
- }
-
- //1.5V DDR3 or 1.2V DDR4
- if ( p_i_mss_eff_config_data->mss_volt >= 1420 || (p_o_atts->eff_dram_gen == fapi::ENUM_ATTR_EFF_DRAM_GEN_DDR4 && p_i_mss_eff_config_data->mss_volt >= 1130 && p_i_mss_eff_config_data->mss_volt <= 1270)) { // 1.5V
- l_mss_volt_mask = 0x0000000000000000LL;
- } else if ( p_i_mss_eff_config_data->mss_volt >= 1270 && p_o_atts->eff_dram_gen == fapi::ENUM_ATTR_EFF_DRAM_GEN_DDR3) { // 1.35V and DDR3
- l_mss_volt_mask = 0x0000000000010000LL;
- } else { // not valid DDR3 or DDR4 setting
- FAPI_ERR("Invalid RDIMM ATTR_MSS_VOLT = %d on %s!", p_i_mss_eff_config_data->mss_volt, i_target_mba.toEcmdString());
- uint32_t& INVALID_RDIMM_VOLT = p_i_mss_eff_config_data->mss_volt;
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INVALID_RDIMM_VOLT); return rc;
- }
-
- if ( l_rdimm_rcd_ibt[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_VPD_DIMM_RCD_IBT_IBT_OFF ) {
- l_rcd_ibt_mask = 0x0000000070000000LL;
- } else if ( l_rdimm_rcd_ibt[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_VPD_DIMM_RCD_IBT_IBT_100 ) {
- l_rcd_ibt_mask = 0x0000000000000000LL;
- } else if ( l_rdimm_rcd_ibt[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_VPD_DIMM_RCD_IBT_IBT_150 ) {
- l_rcd_ibt_mask = 0x0040000000000000LL;
- } else if ( l_rdimm_rcd_ibt[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_VPD_DIMM_RCD_IBT_IBT_200 ) {
- l_rcd_ibt_mask = 0x0000000020000000LL;
- } else if ( l_rdimm_rcd_ibt[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_VPD_DIMM_RCD_IBT_IBT_300 ) {
- l_rcd_ibt_mask = 0x0000000040000000LL;
- } else {
- FAPI_ERR("Invalid RDIMM_RCD_IBT = %d port %d dimm %d on %s!", l_rdimm_rcd_ibt[l_cur_mba_port][l_cur_mba_dimm], l_cur_mba_port, l_cur_mba_dimm, i_target_mba.toEcmdString());
- uint32_t& INVALID_RDIMM_RCD_IBT_U32ARRAY_0_0 = l_rdimm_rcd_ibt[0][0];
- uint32_t& INVALID_RDIMM_RCD_IBT_U32ARRAY_0_1 = l_rdimm_rcd_ibt[0][1];
- uint32_t& INVALID_RDIMM_RCD_IBT_U32ARRAY_1_0 = l_rdimm_rcd_ibt[1][0];
- uint32_t& INVALID_RDIMM_RCD_IBT_U32ARRAY_1_1 = l_rdimm_rcd_ibt[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INVALID_RDIMM_RCD_IBT); return rc;
- }
-
- if ( l_rdimm_rcd_output_timing[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_VPD_DIMM_RCD_OUTPUT_TIMING_1T ) {
- l_rcd_output_timing_mask = 0x0000000000000000LL;
- } else if ( l_rdimm_rcd_output_timing[l_cur_mba_port][l_cur_mba_dimm] == fapi::ENUM_ATTR_VPD_DIMM_RCD_OUTPUT_TIMING_3T ) {
- l_rcd_output_timing_mask = 0x0020000000000000LL;
- } else {
- FAPI_ERR("Invalid RDIMM_RCD_OUTPUT_TIMING = %d port %d dimm %d on %s!", l_rdimm_rcd_output_timing[l_cur_mba_port][l_cur_mba_dimm], l_cur_mba_port, l_cur_mba_dimm, i_target_mba.toEcmdString());
- uint8_t& INVALID_RDIMM_RCD_OUTPUT_TIMING_U8ARRAY_0_0 = l_rdimm_rcd_output_timing[0][0];
- uint8_t& INVALID_RDIMM_RCD_OUTPUT_TIMING_U8ARRAY_0_1 = l_rdimm_rcd_output_timing[0][1];
- uint8_t& INVALID_RDIMM_RCD_OUTPUT_TIMING_U8ARRAY_1_0 = l_rdimm_rcd_output_timing[1][0];
- uint8_t& INVALID_RDIMM_RCD_OUTPUT_TIMING_U8ARRAY_1_1 = l_rdimm_rcd_output_timing[1][1];
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_INVALID_RDIMM_RCD_OUTPUT_TIMING); return rc;
- }
-
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] | l_mss_freq_mask;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] | l_mss_volt_mask;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] | l_rcd_ibt_mask;
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] | l_rcd_output_timing_mask;
- } else {
- p_o_atts->eff_dimm_rcd_cntl_word_0_15[l_cur_mba_port][l_cur_mba_dimm] = 0x0000000000000000LL;
- }
-
- // DEBUG HERE:
- //FAPI_INF("size=%d density=%d ranks=%d width=%d on %s",
- // p_o_atts->eff_dimm_size[l_cur_mba_port][l_cur_mba_dimm],
- // p_o_atts->eff_dram_density, p_o_atts->
- // attr_eff_num_ranks_per_dimm[l_cur_mba_port][l_cur_mba_dimm],
- // p_o_atts->eff_dram_width, i_target_mba.toEcmdString());
-//------------------------------------------------------------------------------
- if(p_o_atts->eff_vpd_version == 0xFFFFFF ||
- p_i_data->vpd_version[l_cur_mba_port][l_cur_mba_dimm] < p_o_atts->eff_vpd_version ) { // find the smallest VPD
- p_o_atts->eff_vpd_version = p_i_data->vpd_version[l_cur_mba_port][l_cur_mba_dimm];
- }
-//------------------------------------------------------------------------------
-
- } // inner for loop
- } // outer for loop
- return rc;
-} // end mss_eff_config_setup_eff_atts()
-
-//------------------------------------------------------------------------------
-// @brief mss_eff_config_write_eff_atts(): This function writes the
-// effective configuration attributes
-//
-// @param const fapi::Target &i_target_mba: the fapi target
-// @param mss_eff_config_data *p_i_mss_eff_config_data: Pointer to
-// mss_eff_config_data variable structure
-// @param const mss_eff_config_atts *p_i_atts: Pointer to mss_eff
-// configuration attributes structure
-//
-// @return fapi::ReturnCode
-//------------------------------------------------------------------------------
-fapi::ReturnCode mss_eff_config_write_eff_atts(
- const fapi::Target &i_target_mba,
- mss_eff_config_atts *p_i_atts)
-{
- fapi::ReturnCode rc;
-
- p_i_atts->eff_dram_tras = uint8_t (p_i_atts->eff_dram_tras_u32);
- p_i_atts->eff_dram_trc = uint8_t (p_i_atts->eff_dram_trc_u32);
- p_i_atts->eff_dram_tfaw = uint8_t (p_i_atts->eff_dram_tfaw_u32);
-
- do
- {
- // Set attributes
- rc = FAPI_ATTR_SET(ATTR_EFF_DIMM_RANKS_CONFIGED, &i_target_mba,
- p_i_atts->eff_dimm_ranks_configed);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_LRDIMM_ADDITIONAL_CNTL_WORDS, &i_target_mba,
- p_i_atts->eff_lrdimm_additional_cntl_words);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_LRDIMM_ADDITIONAL_CNTL_WORDS, &i_target_mba,
- p_i_atts->eff_lrdimm_additional_cntl_words);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DIMM_RCD_CNTL_WORD_0_15, &i_target_mba,
- p_i_atts->eff_dimm_rcd_cntl_word_0_15);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DIMM_SIZE, &i_target_mba,
- p_i_atts->eff_dimm_size);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DIMM_TYPE, &i_target_mba,
- p_i_atts->eff_dimm_type);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CUSTOM_DIMM, &i_target_mba,
- p_i_atts->eff_custom_dimm);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_AL, &i_target_mba,
- p_i_atts->eff_dram_al);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_ASR, &i_target_mba,
- p_i_atts->eff_dram_asr);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_BANKS, &i_target_mba,
- p_i_atts->eff_dram_banks);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_BL, &i_target_mba,
- p_i_atts->eff_dram_bl);
- if(rc) break;
-
- // See mss_freq.C
- //rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_CL, &i_target_mba,
- //p_i_atts->eff_dram_cl);
- //if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_COLS, &i_target_mba,
- p_i_atts->eff_dram_cols);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_CWL, &i_target_mba,
- p_i_atts->eff_dram_cwl);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_DENSITY, &i_target_mba,
- p_i_atts->eff_dram_density);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_DLL_ENABLE, &i_target_mba,
- p_i_atts->eff_dram_dll_enable);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_DLL_PPD, &i_target_mba,
- p_i_atts->eff_dram_dll_ppd);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_DLL_RESET, &i_target_mba,
- p_i_atts->eff_dram_dll_reset);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_GEN, &i_target_mba,
- p_i_atts->eff_dram_gen);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_OUTPUT_BUFFER, &i_target_mba,
- p_i_atts->eff_dram_output_buffer);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_PASR, &i_target_mba,
- p_i_atts->eff_dram_pasr);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_RBT, &i_target_mba,
- p_i_atts->eff_dram_rbt);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_ROWS, &i_target_mba,
- p_i_atts->eff_dram_rows);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_SRT, &i_target_mba,
- p_i_atts->eff_dram_srt);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TDQS, &i_target_mba,
- p_i_atts->eff_dram_tdqs);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TFAW, &i_target_mba,
- p_i_atts->eff_dram_tfaw);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TM, &i_target_mba,
- p_i_atts->eff_dram_tm);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRAS, &i_target_mba,
- p_i_atts->eff_dram_tras);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRC, &i_target_mba,
- p_i_atts->eff_dram_trc);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRCD, &i_target_mba,
- p_i_atts->eff_dram_trcd);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRFC, &i_target_mba,
- p_i_atts->eff_dram_trfc);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRFI, &i_target_mba,
- p_i_atts->eff_dram_trfi);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRP, &i_target_mba,
- p_i_atts->eff_dram_trp);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRRD, &i_target_mba,
- p_i_atts->eff_dram_trrd);
- if(rc) break;
- // DDR4 only
- // AST HERE: Need ATTR added
- //rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRRD_L, &i_target_mba,
- // p_i_atts->eff_dram_trrd);
- //if(rc) break;
- // DDR4 only
- rc = FAPI_ATTR_SET(ATTR_TCCD_L, &i_target_mba,
- p_i_atts->eff_dram_tccdl);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TCCD_L, &i_target_mba,
- p_i_atts->eff_dram_tccdl);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TRTP, &i_target_mba,
- p_i_atts->eff_dram_trtp);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TWTR, &i_target_mba,
- p_i_atts->eff_dram_twtr);
- if(rc) break;
- // DDR4 only
- // AST HERE: Need ATTR added
- //rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_TWTRL, &i_target_mba,
- //p_i_atts->eff_dram_twtrl);
- //if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_WIDTH, &i_target_mba,
- p_i_atts->eff_dram_width);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_WR, &i_target_mba,
- p_i_atts->eff_dram_wr);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_WR_LVL_ENABLE, &i_target_mba,
- p_i_atts->eff_dram_wr_lvl_enable);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_IBM_TYPE, &i_target_mba,
- p_i_atts->eff_ibm_type);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_MEMCAL_INTERVAL, &i_target_mba,
- p_i_atts->eff_memcal_interval);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_MPR_LOC, &i_target_mba,
- p_i_atts->eff_mpr_loc);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_MPR_MODE, &i_target_mba,
- p_i_atts->eff_mpr_mode);
- if(rc) break;
-
- // AST HERE: Needs SPD byte33[6:4], currently hard coded to 0, removed for GA1
- rc = FAPI_ATTR_SET(ATTR_EFF_NUM_DIES_PER_PACKAGE, &i_target_mba,
- p_i_atts->eff_num_dies_per_package);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_NUM_DROPS_PER_PORT, &i_target_mba,
- p_i_atts->eff_num_drops_per_port);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM, &i_target_mba,
- p_i_atts->eff_num_master_ranks_per_dimm);
- if(rc) break;
-
- // AST HERE: Needs source data, currently hard coded to 0, removed for GA1
- rc = FAPI_ATTR_SET(ATTR_EFF_NUM_PACKAGES_PER_RANK, &i_target_mba,
- p_i_atts->eff_num_packages_per_rank);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target_mba,
- p_i_atts->eff_num_ranks_per_dimm);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_MODE, &i_target_mba,
- p_i_atts->eff_schmoo_mode);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_ADDR_MODE, &i_target_mba,
- p_i_atts->eff_schmoo_addr_mode);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_PARAM_VALID, &i_target_mba,
- p_i_atts->eff_schmoo_param_valid);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_TEST_VALID, &i_target_mba,
- p_i_atts->eff_schmoo_test_valid);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_WR_EYE_MIN_MARGIN, &i_target_mba,
- p_i_atts->eff_schmoo_wr_eye_min_margin);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_RD_EYE_MIN_MARGIN, &i_target_mba,
- p_i_atts->eff_schmoo_rd_eye_min_margin);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_DQS_CLK_MIN_MARGIN, &i_target_mba,
- p_i_atts->eff_schmoo_dqs_clk_min_margin);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_RD_GATE_MIN_MARGIN, &i_target_mba,
- p_i_atts->eff_schmoo_rd_gate_min_margin);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_SCHMOO_ADDR_CMD_MIN_MARGIN, &i_target_mba,
- p_i_atts->eff_schmoo_addr_cmd_min_margin);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_RD_VREF_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_rd_vref_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_DRAM_WR_VREF_SCHMOO, &i_target_mba,
- p_i_atts->eff_dram_wr_vref_schmoo);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_RCV_IMP_DQ_DQS_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_rcv_imp_dq_dqs_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_DRV_IMP_DQ_DQS_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_drv_imp_dq_dqs_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_DRV_IMP_CNTL_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_drv_imp_cntl_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_DRV_IMP_CLK_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_drv_imp_clk_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_DRV_IMP_SPCKE_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_drv_imp_spcke_schmoo);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_SLEW_RATE_DQ_DQS_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_slew_rate_dq_dqs_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_SLEW_RATE_CNTL_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_slew_rate_cntl_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_SLEW_RATE_ADDR_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_slew_rate_addr_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_SLEW_RATE_CLK_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_slew_rate_clk_schmoo);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_CEN_SLEW_RATE_SPCKE_SCHMOO, &i_target_mba,
- p_i_atts->eff_cen_slew_rate_spcke_schmoo);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_EFF_STACK_TYPE, &i_target_mba,
- p_i_atts->eff_stack_type);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_EFF_ZQCAL_INTERVAL, &i_target_mba,
- p_i_atts->eff_zqcal_interval);
- if(rc) break;
- rc = FAPI_ATTR_SET(ATTR_MSS_EFF_DIMM_FUNCTIONAL_VECTOR, &i_target_mba,
- p_i_atts->dimm_functional_vector);
- if(rc) break;
-
- rc = FAPI_ATTR_SET(ATTR_MSS_CAL_STEP_ENABLE, &i_target_mba,
- p_i_atts->mss_cal_step_enable);
- if(rc) break;
-
- // Make the final VPD version be a number and not ascii
- p_i_atts->eff_vpd_version=((p_i_atts->eff_vpd_version & 0x0f00)>> 4)|
- ((p_i_atts->eff_vpd_version & 0x000f)>> 0);
- rc = FAPI_ATTR_SET(ATTR_MSS_EFF_VPD_VERSION, &i_target_mba,
- p_i_atts->eff_vpd_version);
- if(rc) break;
-
- } while(0);
-
- return rc;
-}
-
-//------------------------------------------------------------------------------
-// @brief mss_eff_config(): This function is the main function which calls
-// helper functions that read and verify spd data as
-// well as configure effective attributes.
-//
-// @param const fapi::Target i_target_mba: the fapi target
-//
-// @return fapi::ReturnCode
-//------------------------------------------------------------------------------
-fapi::ReturnCode mss_eff_config(const fapi::Target i_target_mba)
-{
- /* Initialize Variables */
- const fapi::Target& TARGET_MBA = i_target_mba;
- fapi::ReturnCode rc;
- fapi::Target l_target_centaur;
- // Changed l_mss_volt to p_l_mss_eff_config_data->mss_volt.
- //uint32_t l_mss_volt;
- // mss_eff_config_data_variable struct
- mss_eff_config_data *p_l_mss_eff_config_data = new mss_eff_config_data();
- // mss_eff_config_spd_data struct
- mss_eff_config_spd_data *p_l_spd_data = new mss_eff_config_spd_data();
- // mss_eff_config_atts struct
- mss_eff_config_atts *p_l_atts = new mss_eff_config_atts();
- /* End Variable Initialization */
-
- /* zero out struct elements */
- memset( p_l_mss_eff_config_data, 0, sizeof(mss_eff_config_data) );
- memset( p_l_spd_data, 0, sizeof(mss_eff_config_spd_data) );
- memset( p_l_atts, 0, sizeof(mss_eff_config_atts) );
-
- FAPI_INF("STARTING mss_eff_config on %s \n",
- i_target_mba.toEcmdString());
-
- do
- {
- FAPI_INF("Setup and VPD attributes if needbe\n");
-
-#ifdef FAPI_MSSLABONLY
- FAPI_INF("Lab only: Setup and VPD attributes if needbe\n");
-
- rc = mss_eff_config_termination_vpd(i_target_mba); if(rc) break;
- if(rc)
- {
- FAPI_ERR("Error from mss_eff_config_termination_vpd()");
- break;
- }
-#endif
-
- // Added call to mss_eff_pre_config() for Mike Pardeik (power/thermal).
- rc = mss_eff_pre_config(i_target_mba); if(rc) return rc;
-
-
-//------------------------------------------------------------------------------
- // Grab allow single port data
- rc = FAPI_ATTR_GET(ATTR_MSS_ALLOW_SINGLE_PORT, &i_target_mba, p_l_mss_eff_config_data->allow_single_port);
- if(rc) break;
- if ( p_l_mss_eff_config_data->allow_single_port == fapi::ENUM_ATTR_MSS_ALLOW_SINGLE_PORT_TRUE ) {
- FAPI_INF("WARNING: allow_single_port = %d on %s.", p_l_mss_eff_config_data->allow_single_port, i_target_mba.toEcmdString());
- }
-//------------------------------------------------------------------------------
- // Grab freq/volt data
- rc = fapiGetParentChip(i_target_mba, l_target_centaur);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_MSS_FREQ, &l_target_centaur,
- p_l_mss_eff_config_data->mss_freq);
- if(rc) break;
- rc = FAPI_ATTR_GET(ATTR_MSS_VOLT, &l_target_centaur, p_l_mss_eff_config_data->mss_volt);
- if(rc) break;
- if (p_l_mss_eff_config_data->mss_freq == 0)
- {
- FAPI_ERR("Invalid ATTR_MSS_FREQ = %d on %s!",
- p_l_mss_eff_config_data->mss_freq,
- i_target_mba.toEcmdString());
- uint32_t& FREQ_VAL = p_l_mss_eff_config_data->mss_freq;
- FAPI_SET_HWP_ERROR(rc, RC_MSS_EFF_CONFIG_MSS_FREQ);
- break;
- }
- FAPI_INF("mss_freq = %d, tCK_in_ps= %d on %s.",
- p_l_mss_eff_config_data->mss_freq,
- TWO_MHZ/p_l_mss_eff_config_data->mss_freq,
- l_target_centaur.toEcmdString());
- FAPI_INF("mss_volt = %d on %s.", p_l_mss_eff_config_data->mss_volt,
- l_target_centaur.toEcmdString());
-
-//------------------------------------------------------------------------------
- /* Function calls */
- // get SPD data
- rc = mss_eff_config_get_spd_data( i_target_mba,
- p_l_mss_eff_config_data, p_l_spd_data, p_l_atts );
- if(rc)
- {
- FAPI_ERR("Error from mss_eff_config_get_spd_data()");
- break;
- }
-
- // verify dimm plug rules
- rc = mss_eff_config_verify_plug_rules( i_target_mba,
- p_l_mss_eff_config_data, p_l_atts );
- if(rc)
- {
- FAPI_ERR("Error from mss_eff_config_verify_plug_rules()");
- break;
- }
-
- // verify SPD data
- if(( p_l_atts->eff_num_drops_per_port
- != fapi::ENUM_ATTR_EFF_NUM_DROPS_PER_PORT_EMPTY )
- && ( p_l_mss_eff_config_data->allow_single_port == fapi::ENUM_ATTR_MSS_ALLOW_SINGLE_PORT_FALSE ))
- {
- rc = mss_eff_config_verify_spd_data( i_target_mba,
- p_l_atts, p_l_spd_data );
- if(rc)
- {
- FAPI_ERR("Error from mss_eff_config_verify_spd_data()");
- break;
- }
- }
-
- // setup effective configuration attributes
- rc = mss_eff_config_setup_eff_atts( i_target_mba,
- p_l_mss_eff_config_data, p_l_spd_data, p_l_atts );
- if(rc)
- {
- FAPI_ERR("Error from mss_eff_config_setup_eff_atts()");
- break;
- }
-
- // write effective configuration attributes
- rc = mss_eff_config_write_eff_atts( i_target_mba,
- p_l_atts );
- if(rc)
- {
- FAPI_ERR("Error from mss_eff_config_write_eff_atts()");
- break;
- }
-
-
-
- // Calls to sub-procedures
-
- // LRDIMM attributes
- if ( p_l_atts->eff_dimm_type == fapi::ENUM_ATTR_EFF_DIMM_TYPE_LRDIMM )
- {
- rc = mss_lrdimm_eff_config(i_target_mba, p_l_mss_eff_config_data->cur_dimm_spd_valid_u8array,
- p_l_mss_eff_config_data->mss_freq, p_l_atts->eff_num_ranks_per_dimm);
- if(rc)
- {
- FAPI_ERR("Error from mss_lrdimm_eff_config()");
- break;
- }
- }
-
- rc = mss_eff_config_rank_group(i_target_mba); if(rc) break;
-
- // Removed call to mss_eff_config_cke_map(),
- //rc = mss_eff_config_cke_map(i_target_mba); if(rc) break;
-
-
-// Removed call to mss_eff_config_termination() for Palmetto and Habanero using ifdef "FAPI_MSSLABONLY", moving to liveVPD.
-// Note: Stradale, KG3, and DDR4 will still need ifdef "FAPI_MSSLABONLY"
-#ifdef FAPI_MSSLABONLY
- // If MSS Lab/Development override, for now everything except DDR3 CDIMMs
- if ((p_l_atts->eff_custom_dimm == fapi::ENUM_ATTR_EFF_CUSTOM_DIMM_NO) || (p_l_atts->eff_dram_gen == fapi::ENUM_ATTR_EFF_DRAM_GEN_DDR4)) {
- rc = mss_eff_config_termination(i_target_mba); if(rc) break;
- if(rc)
- {
- FAPI_ERR("Error from mss_eff_config_termination()");
- break;
- }
- }
-#endif
-
-
- // Removed call to mss_eff_config_thermal(), it is now called externally.
- //rc = mss_eff_config_thermal(i_target_mba); if(rc) break;
-
- rc = mss_eff_config_shmoo(i_target_mba); if(rc) break;
-
-
-
- FAPI_INF("mss_eff_config on %s COMPLETE\n",
- i_target_mba.toEcmdString());
-
- } while(0);
- /* free memory */
- delete p_l_mss_eff_config_data;
- delete p_l_spd_data;
- delete p_l_atts;
-
- return rc;
-} // end mss_eff_config()
-} // extern "C"
-
OpenPOWER on IntegriCloud