summaryrefslogtreecommitdiffstats
path: root/src/import/chips
diff options
context:
space:
mode:
authorJacob Harvey <jlharvey@us.ibm.com>2017-10-12 14:35:34 -0500
committerChristian R. Geddes <crgeddes@us.ibm.com>2017-11-14 12:22:24 -0500
commitf7dfd17dfc996414b5989aa464817dd595b5623b (patch)
treec0503431fe6a9f6efc8da89c1ac48c0af7be12b4 /src/import/chips
parentd6c5b55b7f06dde471f63c0c275fe16b67418405 (diff)
downloadtalos-hostboot-f7dfd17dfc996414b5989aa464817dd595b5623b.tar.gz
talos-hostboot-f7dfd17dfc996414b5989aa464817dd595b5623b.zip
Fix RCW structure and make a default option
Change-Id: I7b0a2c66e78a6d05aa213cd2a51f637c808c857e Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48323 Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Dev-Ready: JACOB L. HARVEY <jlharvey@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48528 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src/import/chips')
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C150
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.C66
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.H15
3 files changed, 169 insertions, 62 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C
index 097ffc26c..6e9c4398e 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C
@@ -1111,6 +1111,7 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC00
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Global Features Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc00()
{
@@ -1121,7 +1122,7 @@ fapi2::ReturnCode eff_dimm::dimm_rc00()
// Update MCS attribute
l_attrs_dimm_rc00[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc00;
- FAPI_INF("%s: RC00 settting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc00[iv_port_index][iv_dimm_index] );
+ FAPI_INF("%s: RC00 settting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc00[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC00, iv_mcs, l_attrs_dimm_rc00) );
fapi_try_exit:
@@ -1131,6 +1132,7 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC01
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Clock Driver Enable Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc01()
{
@@ -1249,7 +1251,7 @@ fapi2::ReturnCode eff_dimm::dimm_rc04()
// Update MCS attribute
l_attrs_dimm_rc04[iv_port_index][iv_dimm_index] = l_buffer;
- FAPI_INF("%s: RC04 setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc04[iv_port_index][iv_dimm_index] );
+ FAPI_INF("%s: RC04 setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc04[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC04, iv_mcs, l_attrs_dimm_rc04) );
fapi_try_exit:
@@ -1291,7 +1293,7 @@ fapi2::ReturnCode eff_dimm::dimm_rc05()
// Update MCS attribute
l_attrs_dimm_rc05[iv_port_index][iv_dimm_index] = l_buffer;
- FAPI_INF( "%s: RC05 setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc05[iv_port_index][iv_dimm_index] )
+ FAPI_INF( "%s: RC05 setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc05[iv_port_index][iv_dimm_index] )
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC05, iv_mcs, l_attrs_dimm_rc05) );
fapi_try_exit:
@@ -1301,17 +1303,20 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC06_07
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Command Space Control Word -- used to issue register commands
///
fapi2::ReturnCode eff_dimm::dimm_rc06_07()
{
+ constexpr uint64_t NO_OP = 0x0F;
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc06_07[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc06_07(iv_mcs, &l_attrs_dimm_rc06_07[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc06_07[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc06_07;
+ // Set to NO_OP state. Will be used for rcd commands
+ l_attrs_dimm_rc06_07[iv_port_index][iv_dimm_index] = NO_OP;
- FAPI_INF( "%s: RC06_07 setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc06_07[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC06_07 setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc06_07[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC06_07, iv_mcs, l_attrs_dimm_rc06_07) );
fapi_try_exit:
@@ -1482,25 +1487,30 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC09
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Power Saving Settings Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc09()
{
// Sets up constant values
- constexpr uint64_t CKE_POWER_DOWN_MODE_ENABLE = 4;
- constexpr uint64_t CKE_POWER_DOWN_MODE_TOTAL_LEN = 1;
+ constexpr uint64_t CKE_POWER_DOWN_MODE_ENABLE_POS = 4;
+ constexpr uint64_t CKE_POWER_DOWN_MODE_ENABLE = 1;
+
constexpr uint64_t ODT_POS_OFFSET = 4;
constexpr uint64_t ODT_ATTR_LEN = 2;
constexpr uint64_t IBT_OFF_POS = 5;
- const auto l_num_dimms = mss::count_dimm(iv_mca);
+ constexpr uint64_t IBT_OFF = 1;
+ constexpr uint64_t IBT_ON = 0;
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc09[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
- fapi2::buffer<uint8_t> l_rc09(iv_pDecoder->iv_raw_card.iv_rc09);
- FAPI_TRY( eff_dimm_ddr4_rc09(iv_mcs, &l_attrs_dimm_rc09[0][0]) );
+ fapi2::buffer<uint8_t> l_rc09;
+ l_rc09.writeBit<CKE_POWER_DOWN_MODE_ENABLE_POS>(CKE_POWER_DOWN_MODE_ENABLE)
+ .writeBit<IBT_OFF_POS>(IBT_OFF);
// If CKE power down mode is on and we're in dual drop mode, then we need to configure the IBT mode
- if(l_rc09.getBit<CKE_POWER_DOWN_MODE_ENABLE, CKE_POWER_DOWN_MODE_TOTAL_LEN>() && l_num_dimms == 2)
+ if((l_rc09.getBit<CKE_POWER_DOWN_MODE_ENABLE_POS>() == CKE_POWER_DOWN_MODE_ENABLE)
+ && (mss::count_dimm(iv_mca) == MAX_DIMM_PER_PORT))
{
FAPI_INF("%s Checking whether the DIMM needs IBT mode on or off", mss::c_str(iv_dimm));
@@ -1521,7 +1531,7 @@ fapi2::ReturnCode eff_dimm::dimm_rc09()
const auto l_this_dimm_pos = mss::relative_pos<fapi2::TARGET_TYPE_MCA>(iv_dimm);
const auto l_other_dimm_pos = l_this_dimm_pos == 0 ? 1 : 0;
const auto l_other_dimm = l_dimms[l_other_dimm_pos];
- bool l_ibt_off = true;
+ bool l_ibt = IBT_OFF;
// 2) Gets the ODT values for the other DIMM
uint8_t l_wr_odt[MAX_RANK_PER_DIMM] = {};
@@ -1544,23 +1554,23 @@ fapi2::ReturnCode eff_dimm::dimm_rc09()
// Are either the writed or read ODT's enabled for this DIMM?
if(l_temp_wr.getBit(l_this_dimm_odt, ODT_ATTR_LEN) || l_temp_rd.getBit(l_this_dimm_odt, ODT_ATTR_LEN))
{
- // Either write or read ODT is enabled - IBT off needs to be false
- // Note: this is taken from JEDEC so we have a double negative
- l_ibt_off = false;
+ l_ibt = IBT_ON;
break;
}
}
// 4) Modifies the value
- l_rc09.writeBit<IBT_OFF_POS>(l_ibt_off);
- FAPI_INF("%s has IBT value of %s giving a value of 0x%02x", mss::c_str(iv_dimm), l_ibt_off ? "OFF - 1" : "ON - 0",
+ l_rc09.writeBit<IBT_OFF_POS>(l_ibt);
+ FAPI_INF("%s has IBT value of %s giving a value of 0x%02x", mss::c_str(iv_dimm), l_ibt == IBT_OFF ? "OFF" : "ON",
uint8_t(l_rc09));
}
+ FAPI_TRY( eff_dimm_ddr4_rc09(iv_mcs, &l_attrs_dimm_rc09[0][0]) );
+
// Update MCS attribute
l_attrs_dimm_rc09[iv_port_index][iv_dimm_index] = l_rc09;
- FAPI_INF( "%s: RC09 setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc09[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC09 setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc09[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC09, iv_mcs, l_attrs_dimm_rc09) );
fapi_try_exit:
@@ -1606,7 +1616,7 @@ fapi2::ReturnCode eff_dimm::dimm_rc0a()
break;
}
- FAPI_INF( "%s: RC0A setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc0a[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC0A setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc0a[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC0A, iv_mcs, l_attrs_dimm_rc0a) );
fapi_try_exit:
@@ -1616,17 +1626,24 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC0B
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Operating Voltage VDD and VrefCA Source Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc0b()
{
+ // Settings for rc0b:
+ // Input Receiver Vref Source to: External VrefCA input
+ // QVrefCA and BVrefCA Sources to: External VrefCA input connected to QVrefCA and BVrefCA
+ // Register VDD Operating Voltage to: 1.2 V
+ constexpr uint8_t RC0B = 0x0E;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc0b[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc0b(iv_mcs, &l_attrs_dimm_rc0b[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc0b[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc0b;
+ l_attrs_dimm_rc0b[iv_port_index][iv_dimm_index] = RC0B;
- FAPI_INF( "%s: RC0B setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc0b[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC0B setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc0b[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC0B, iv_mcs, l_attrs_dimm_rc0b) );
fapi_try_exit:
@@ -1636,17 +1653,21 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC0C
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Training Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc0c()
{
+ // Setting to normal operating mode
+ constexpr uint8_t NORMAL_OP_MODE = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc0c[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc0c(iv_mcs, &l_attrs_dimm_rc0c[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc0c[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc0c;
+ l_attrs_dimm_rc0c[iv_port_index][iv_dimm_index] = NORMAL_OP_MODE;
- FAPI_INF( "%s: RC0C setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc0c[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC0C setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc0c[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC0C, iv_mcs, l_attrs_dimm_rc0c) );
fapi_try_exit:
@@ -1702,7 +1723,7 @@ fapi2::ReturnCode eff_dimm::dimm_rc0d()
FAPI_TRY( spd::base_module_type(iv_dimm, iv_pDecoder->iv_spd_data, l_dimm_type) );
l_attrs_dimm_rc0d[iv_port_index][iv_dimm_index] = l_buffer;
- FAPI_INF( "%s: RC0D setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc0d[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC0D setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc0d[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC0D, iv_mcs, l_attrs_dimm_rc0d) );
fapi_try_exit:
@@ -1743,17 +1764,23 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC0F
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Command Latency Adder Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc0f()
{
+ // Normal mode:
+ // Set 1 nCK latency adder to Qn1, QxCSn, QxCKEn2, QxODTn
+ // 0nCK latency adder to QxPAR
+ constexpr uint8_t NORMAL_MODE = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc0f[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc0f(iv_mcs, &l_attrs_dimm_rc0f[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc0f[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc0f;
+ l_attrs_dimm_rc0f[iv_port_index][iv_dimm_index] = NORMAL_MODE;
- FAPI_INF( "%s: RC0F setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc0f[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC0F setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc0f[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC0F, iv_mcs, l_attrs_dimm_rc0f) );
fapi_try_exit:
@@ -1763,17 +1790,21 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_1x
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Internal VrefCA Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc1x()
{
+ // Normal Mode: VDDR/2
+ constexpr uint8_t HALF_VDDR = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_1x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_1x(iv_mcs, &l_attrs_dimm_rc_1x[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_1x[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc1x;
+ l_attrs_dimm_rc_1x[iv_port_index][iv_dimm_index] = HALF_VDDR;
- FAPI_INF( "%s: RC1X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_1x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC1X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_1x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_1x, iv_mcs, l_attrs_dimm_rc_1x) );
fapi_try_exit:
@@ -1783,17 +1814,21 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_2x
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note I2C Bus Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc2x()
{
+ //Normal mode
+ constexpr uint8_t NORMAL_MODE = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_2x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_2x(iv_mcs, &l_attrs_dimm_rc_2x[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_2x[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc2x;
+ l_attrs_dimm_rc_2x[iv_port_index][iv_dimm_index] = NORMAL_MODE;
- FAPI_INF( "%s: RC2X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_2x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC2X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_2x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_2x, iv_mcs, l_attrs_dimm_rc_2x) );
fapi_try_exit:
@@ -1841,7 +1876,7 @@ fapi2::ReturnCode eff_dimm::dimm_rc3x()
break;
}
- FAPI_INF( "%s: RC3X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_3x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC3X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_3x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_3x, iv_mcs, l_attrs_dimm_rc_3x) );
@@ -1852,17 +1887,22 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_4x
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note CW Source Selection Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc4x()
{
+ // This will get overwritten when sending rcw's
+ // Defaulting to control word selection function space 0
+ constexpr uint8_t CW_SELECTION_FS0 = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_4x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_4x(iv_mcs, &l_attrs_dimm_rc_4x[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_4x[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc4x;
+ l_attrs_dimm_rc_4x[iv_port_index][iv_dimm_index] = CW_SELECTION_FS0;
- FAPI_INF( "%s: RC4X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_4x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC4X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_4x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_4x, iv_mcs, l_attrs_dimm_rc_4x) );
fapi_try_exit:
@@ -1872,17 +1912,21 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_5x
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note CW Destination Selection & Write/Read Additional QxODT[1:0] Signal High
///
fapi2::ReturnCode eff_dimm::dimm_rc5x()
{
+ // Default 0nCK addition to ODT
+ constexpr uint8_t DEFAULT_0_ODT_ADD = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_5x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_5x(iv_mcs, &l_attrs_dimm_rc_5x[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_5x[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc5x;
+ l_attrs_dimm_rc_5x[iv_port_index][iv_dimm_index] = DEFAULT_0_ODT_ADD;
- FAPI_INF( "%s: RC5X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_5x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC5X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_5x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_5x, iv_mcs, l_attrs_dimm_rc_5x) );
fapi_try_exit:
@@ -1892,17 +1936,21 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_6x
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note CW Data Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc6x()
{
+ // Attribute gets overwritten for rcd commands
+ constexpr uint8_t RC6X = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_6x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_6x(iv_mcs, &l_attrs_dimm_rc_6x[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_6x[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc6x;
+ l_attrs_dimm_rc_6x[iv_port_index][iv_dimm_index] = RC6X;
- FAPI_INF( "%s: RC6X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_6x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC6X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_6x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_6x, iv_mcs, l_attrs_dimm_rc_6x) );
fapi_try_exit:
@@ -1961,17 +2009,23 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_8x
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @notw ODT Input Buffer/IBT, QxODT Output Buffer and Timing Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc8x()
{
+ // Setting to defaults:
+ // QxODT[1:0] asserted same time as Write Command
+ // QxODT[1:0] asserted same time as Read Command
+ constexpr uint8_t DEFAULT_QXODT_TIMING = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_8x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_8x(iv_mcs, &l_attrs_dimm_rc_8x[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_8x[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc8x;
+ l_attrs_dimm_rc_8x[iv_port_index][iv_dimm_index] = DEFAULT_QXODT_TIMING;
- FAPI_INF( "%s: RC8X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_8x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC8X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_8x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_8x, iv_mcs, l_attrs_dimm_rc_8x) );
fapi_try_exit:
@@ -1981,17 +2035,21 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_9x
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note QxODT[1:0] Write Pattern Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rc9x()
{
+ // Setting to Default's : QxODT's are not asserted during writes
+ constexpr uint8_t RC9X = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_9x[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_9x(iv_mcs, &l_attrs_dimm_rc_9x[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_9x[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rc9x;
+ l_attrs_dimm_rc_9x[iv_port_index][iv_dimm_index] = RC9X;
- FAPI_INF( "%s: RC9X setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_9x[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RC9X setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_9x[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_9x, iv_mcs, l_attrs_dimm_rc_9x) );
fapi_try_exit:
@@ -2001,17 +2059,21 @@ fapi_try_exit:
///
/// @brief Determines & sets effective config for DIMM RC_AX
/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note QxODT[1:0] Read Pattern Control Word
///
fapi2::ReturnCode eff_dimm::dimm_rcax()
{
+ // Setting to Default's : QxODT's are not asserted during reads
+ constexpr uint8_t RCAX = 0x00;
+
// Retrieve MCS attribute data
uint8_t l_attrs_dimm_rc_ax[PORTS_PER_MCS][MAX_DIMM_PER_PORT] = {};
FAPI_TRY( eff_dimm_ddr4_rc_ax(iv_mcs, &l_attrs_dimm_rc_ax[0][0]) );
// Update MCS attribute
- l_attrs_dimm_rc_ax[iv_port_index][iv_dimm_index] = iv_pDecoder->iv_raw_card.iv_rcax;
+ l_attrs_dimm_rc_ax[iv_port_index][iv_dimm_index] = RCAX;
- FAPI_INF( "%s: RCAX setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_ax[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RCAX setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_ax[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_Ax, iv_mcs, l_attrs_dimm_rc_ax) );
fapi_try_exit:
@@ -2066,7 +2128,7 @@ fapi2::ReturnCode eff_dimm::dimm_rcbx()
FAPI_TRY( eff_dimm_ddr4_rc_bx(iv_mcs, &l_attrs_dimm_rc_bx[0][0]) );
l_attrs_dimm_rc_bx[iv_port_index][iv_dimm_index] = l_buf;
- FAPI_INF( "%s: RCBX setting: %d", mss::c_str(iv_dimm), l_attrs_dimm_rc_bx[iv_port_index][iv_dimm_index] );
+ FAPI_INF( "%s: RCBX setting: 0x%02x", mss::c_str(iv_dimm), l_attrs_dimm_rc_bx[iv_port_index][iv_dimm_index] );
FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_DDR4_RC_Bx, iv_mcs, l_attrs_dimm_rc_bx) );
fapi_try_exit:
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.C b/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.C
index 87effa9d6..92a3402cf 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.C
@@ -816,29 +816,22 @@ fapi2::ReturnCode raw_card_factory(const fapi2::Target<TARGET_TYPE_DIMM>& i_targ
(l_hybrid_type == fapi2::ENUM_ATTR_EFF_HYBRID_MEMORY_TYPE_NVDIMM))
{
l_ref_raw_card_rev = mss::rdimm::raw_card_rev::NVDIMM;
- FAPI_INF("%s is an NVDIMM, overwrote l_ref_raw_card_rev to be 0x%02x", mss::c_str(i_target), l_ref_raw_card_rev);
+ FAPI_INF("%s is an NVDIMM, overwrote l_ref_raw_card_rev to be 0x%02x",
+ mss::c_str(i_target),
+ l_ref_raw_card_rev);
}
- FAPI_ASSERT( find_value_from_key( mss::rdimm::RAW_CARDS, l_ref_raw_card_rev, o_raw_card),
- fapi2::MSS_INVALID_RAW_CARD()
- .set_DIMM_TYPE(l_dimm_type)
- .set_RAW_CARD_REV(l_ref_raw_card_rev)
- .set_DIMM_TARGET(i_target),
- "Invalid reference raw card received for RDIMM: %d for %s",
- l_ref_raw_card_rev,
- mss::c_str(i_target) );
+ o_raw_card = find_raw_card( i_target,
+ fapi2::ENUM_ATTR_EFF_DIMM_TYPE_RDIMM,
+ l_ref_raw_card_rev,
+ mss::rdimm::RAW_CARDS);
break;
case fapi2::ENUM_ATTR_EFF_DIMM_TYPE_LRDIMM:
-
- FAPI_ASSERT( find_value_from_key( mss::lrdimm::RAW_CARDS, l_ref_raw_card_rev, o_raw_card),
- fapi2::MSS_INVALID_RAW_CARD()
- .set_DIMM_TYPE(l_dimm_type)
- .set_RAW_CARD_REV(l_ref_raw_card_rev)
- .set_DIMM_TARGET(i_target),
- "Invalid reference raw card received for LRDIMM: %d for %s",
- l_ref_raw_card_rev,
- mss::c_str(i_target));
+ o_raw_card = find_raw_card( i_target,
+ fapi2::ENUM_ATTR_EFF_DIMM_TYPE_LRDIMM,
+ l_ref_raw_card_rev,
+ mss::lrdimm::RAW_CARDS);
break;
default:
@@ -950,6 +943,43 @@ fapi_try_exit:
}
///
+/// @brief Wrapper function for finding the raw card
+/// @param[in] i_target the dimm target
+/// @param[in] i_dimm_type
+/// @param[in] i_ref_raw_card_rev for FFDC
+/// @param[in] i_map raw card map
+/// @return rcw_settings vector of rcw settings
+/// @note This specialization is suited for creating a cache with custom
+/// SPD data (e.g. testing custom SPD).
+///
+rcw_settings find_raw_card( const fapi2::Target<TARGET_TYPE_DIMM>& i_target,
+ const uint64_t i_dimm_type,
+ const uint8_t i_ref_raw_card_rev,
+ const std::vector<std::pair<uint8_t, rcw_settings> > i_map)
+{
+ rcw_settings l_raw_card;
+
+ FAPI_ASSERT( find_value_from_key( i_map, i_ref_raw_card_rev, l_raw_card),
+ fapi2::MSS_INVALID_RAW_CARD()
+ .set_DIMM_TYPE(i_dimm_type)
+ .set_RAW_CARD_REV(i_ref_raw_card_rev)
+ .set_DIMM_TARGET(i_target),
+ "Invalid reference raw card received for %s: %d for %s",
+ (i_dimm_type == fapi2::ENUM_ATTR_EFF_DIMM_TYPE_RDIMM) ? "RDIMM" : "LRDIMM",
+ i_ref_raw_card_rev,
+ mss::c_str(i_target) );
+
+ return l_raw_card;
+
+// If we got here there was a raw card we don't have values for, so putting the default
+fapi_try_exit:
+ fapi2::logError(fapi2::current_err, fapi2::FAPI2_ERRL_SEV_RECOVERED);
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ return (i_dimm_type == fapi2::ENUM_ATTR_EFF_DIMM_TYPE_RDIMM) ?
+ rdimm_rc_default : lrdimm_rc_default;
+}
+
+///
/// @brief Creates factory object & SPD data caches
/// @param[in] i_target the dimm target
/// @param[out] o_factory_caches vector of factory objects
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.H b/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.H
index 85eafa8e0..281916d0b 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.H
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_factory.H
@@ -141,6 +141,21 @@ fapi2::ReturnCode dram_device_type(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>&
uint8_t& o_value);
///
+/// @brief Wrapper function for finding the raw card
+/// @param[in] i_target the dimm target
+/// @param[in] i_dimm_type
+/// @param[in] i_ref_raw_card_rev for FFDC
+/// @param[in] i_map raw card map
+/// @return rcw_settings vector of rcw settings
+/// @note This specialization is suited for creating a cache with custom
+/// SPD data (e.g. testing custom SPD).
+///
+rcw_settings find_raw_card( const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
+ const uint64_t i_dimm_type,
+ const uint8_t i_ref_raw_card_rev,
+ const std::vector<std::pair<uint8_t, rcw_settings> > i_map);
+
+///
/// @brief Decodes reference raw card
/// @param[in] i_target dimm target
/// @param[in] i_spd_data SPD data
OpenPOWER on IntegriCloud