summaryrefslogtreecommitdiffstats
path: root/src/import/chips/centaur
diff options
context:
space:
mode:
authorLouis Stermole <stermole@us.ibm.com>2018-07-17 08:26:41 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-08-06 09:32:33 -0500
commit12289773b37d426e8f281a064d977d4aad741bdd (patch)
treee9b5a09416ecd79c7d21779ead05fcce434b0958 /src/import/chips/centaur
parent8f2be4b1063a95e66d602e6baa4f9baab16d27ab (diff)
downloadtalos-hostboot-12289773b37d426e8f281a064d977d4aad741bdd.tar.gz
talos-hostboot-12289773b37d426e8f281a064d977d4aad741bdd.zip
Setup terminations on non-calibrating ranks during WR_LVL on DDR3
Change-Id: I5b2ebdd972ddb122099b688f87340f23336c0cb1 CQ:SW440427 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63165 Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: ANDRE A. MARIN <aamarin@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63174 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> 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: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/centaur')
-rwxr-xr-xsrc/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.C207
-rwxr-xr-xsrc/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.H64
-rwxr-xr-xsrc/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.C119
-rwxr-xr-xsrc/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.H29
-rwxr-xr-xsrc/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.C438
-rwxr-xr-xsrc/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.H60
-rw-r--r--src/import/chips/centaur/procedures/xml/error_info/p9c_mss_funcs_errors.xml22
7 files changed, 742 insertions, 197 deletions
diff --git a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.C b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.C
index 1c6f9e1db..ccb9b195c 100755
--- a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.C
+++ b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.C
@@ -2519,82 +2519,6 @@ uint8_t convert_rtt_wr_to_rtt_nom(uint8_t i_rtt_wr, uint8_t& i_rtt_nom)
}
///
-/// @brief Set non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
-/// @param[in] i_target mba target being calibrated
-/// @param[in] i_port port being calibrated
-/// @param[in] i_rank_pair_group rank pair group being calibrated
-/// @param[in] i_state 1 turn on (confiugre) or 0 turn off (cleanup)
-/// @param[in,out] CCS instruction Number
-/// @return FAPI2_RC_SUCCESS iff successful
-///
-fapi2::ReturnCode configure_non_calibrating_ranks(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
- const uint8_t i_port,
- const uint32_t i_rank_pair_group,
- const uint8_t i_state,
- uint32_t& io_ccs_inst_cnt)
-{
- uint8_t l_dram_gen = 0;
- uint8_t l_ranks_array[MAX_RANKS_PER_RANK_GROUP][NUM_RANK_GROUPS][MAX_PORTS_PER_MBA] = {0};
- uint8_t l_rank_to_cal = 0;
-
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP0, i_target, l_ranks_array[0][0]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP1, i_target, l_ranks_array[0][1]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP2, i_target, l_ranks_array[0][2]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP3, i_target, l_ranks_array[0][3]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP0, i_target, l_ranks_array[1][0]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP1, i_target, l_ranks_array[1][1]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP2, i_target, l_ranks_array[1][2]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP3, i_target, l_ranks_array[1][3]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP0, i_target, l_ranks_array[2][0]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP1, i_target, l_ranks_array[2][1]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP2, i_target, l_ranks_array[2][2]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP3, i_target, l_ranks_array[2][3]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP0, i_target, l_ranks_array[3][0]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP1, i_target, l_ranks_array[3][1]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP2, i_target, l_ranks_array[3][2]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP3, i_target, l_ranks_array[3][3]));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_GEN, i_target, l_dram_gen));
- l_rank_to_cal = l_ranks_array[0][i_rank_pair_group][i_port];
-
- FAPI_DBG("Rank Group Under Cal: %d Rank: %d on %s", i_rank_pair_group, l_rank_to_cal, mss::c_str(i_target));
-
- for(uint8_t l_rankgroup = 0; l_rankgroup < NUM_RANK_GROUPS; l_rankgroup++)
- {
- FAPI_DBG("Checking rankgroup %d on %s port %d: rank: %d ", l_rankgroup, mss::c_str(i_target), i_port,
- l_ranks_array[0][l_rankgroup][i_port]);
-
- // If rankgroup is valid and is not the rankgroup being calibrated, send MRS
- if((l_ranks_array[0][l_rankgroup][i_port] != fapi2::ENUM_ATTR_CEN_EFF_PRIMARY_RANK_GROUP0_INVALID)
- && (l_rankgroup != i_rank_pair_group))
- {
- // Send MRS
- FAPI_INF("Sending WRLVL MRS to rank group %d rank %d on target %s", l_rankgroup,
- l_ranks_array[0][l_rankgroup][i_port], mss::c_str(i_target));
- FAPI_TRY(send_wr_lvl_mrs(i_target, i_port, l_ranks_array[0][l_rankgroup][i_port], i_state, io_ccs_inst_cnt),
- "Failed to send wr lvl mrs to non calibrating ranks on %s port %d rank %d", mss::c_str(i_target), i_port,
- l_ranks_array[0][l_rankgroup][i_port]);
- }
-
- // Disable any other valid ranks
- for(uint8_t l_rank = 1; l_rank < MAX_RANKS_PER_RANK_GROUP; l_rank++)
- {
- if(l_ranks_array[l_rank][l_rankgroup][i_port] != fapi2::ENUM_ATTR_CEN_EFF_PRIMARY_RANK_GROUP0_INVALID)
- {
- // Send MRS
- FAPI_INF("Sending WRLVL MRS to rank group %d rank %d on target %s", l_rankgroup,
- l_ranks_array[l_rank][l_rankgroup][i_port], mss::c_str(i_target));
- FAPI_TRY(send_wr_lvl_mrs(i_target, i_port, l_ranks_array[l_rank][l_rankgroup][i_port], i_state, io_ccs_inst_cnt),
- "Failed to send wr lvl mrs to non calibrating ranks on %s port %d rank %d", mss::c_str(i_target), i_port,
- l_ranks_array[l_rank][l_rankgroup][i_port]);
- }
- }
- }
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
/// @brief Setup CCS for B-side writes
/// @param[in] i_target mba target being calibrated
/// @param[in] i_port port being calibrated
@@ -2724,19 +2648,17 @@ fapi_try_exit:
/// @brief Set non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
/// @param[in] i_target mba target being calibrated
/// @param[in] i_port port being calibrated
-/// @param[in] i_rank_pair_group rank pair group being calibrated
+/// @param[in] i_rank rank pair group being calibrated
/// @param[in] i_state 1 turn on (configure) or 0 turn off (cleanup)
-/// @param[in,out] CCS instruction Number
+/// @param[in,out] io_ccs_inst_cnt CCS instruction Number
/// @return FAPI2_RC_SUCCESS iff successful
///
-fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
- const uint8_t i_port,
- const uint32_t i_rank,
- const uint8_t i_state,
- uint32_t& io_ccs_inst_cnt)
-
+fapi2::ReturnCode setup_wr_lvl_mrs_ddr4(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt)
{
- fapi2::buffer<uint16_t> l_data_16;
fapi2::variable_buffer l_data_buffer_16(16);
fapi2::variable_buffer l_bank_3(3);
fapi2::variable_buffer l_activate_1(1);
@@ -2750,67 +2672,28 @@ fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i
fapi2::variable_buffer l_bank_3_backup(3);
fapi2::variable_buffer l_odt_4(4);
fapi2::variable_buffer l_num_idles_16(16);
- fapi2::variable_buffer l_num_idles_16_vref_train(16);
fapi2::variable_buffer l_num_repeat_16(16);
fapi2::variable_buffer l_data_20(20);
fapi2::variable_buffer l_read_compare_1(1);
fapi2::variable_buffer l_rank_cal_4(4);
fapi2::variable_buffer l_ddr_cal_enable_1(1);
fapi2::variable_buffer l_ccs_end_1(1);
- uint8_t l_dimm_type = 0;
uint8_t l_is_sim = 0;
- uint8_t l_dram_stack[MAX_PORTS_PER_MBA][MAX_DIMM_PER_PORT] = {0};
uint8_t l_address_mirror_map[MAX_PORTS_PER_MBA][MAX_DIMM_PER_PORT] = {0}; //address_mirror_map[port][dimm]
- uint32_t l_port_number = i_port;
// dimm 0, dimm_rank 0-3 = ranks 0-3; dimm 1, dimm_rank 0-3 = ranks 4-7
const uint8_t l_dimm = (i_rank) / MAX_RANKS_PER_DIMM;
const uint8_t l_dimm_rank = i_rank - MAX_RANKS_PER_DIMM * l_dimm;
+ access_address l_addr = {0, 0, 0, 0, 0};
+ uint32_t l_delay = 0;
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DIMM_TYPE, i_target, l_dimm_type));
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), l_is_sim));
- FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_STACK_TYPE, i_target, l_dram_stack));
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_ADDRESS_MIRRORING, i_target, l_address_mirror_map));
- FAPI_TRY(l_activate_1.setBit(0));
- FAPI_TRY(l_rasn_1.clearBit(0));
- FAPI_TRY(l_casn_1.clearBit(0));
- FAPI_TRY(l_wen_1.clearBit(0));
- FAPI_TRY(l_cke_4.setBit(0, 4));
- FAPI_TRY(l_csn_8.setBit(0, 8));
- FAPI_TRY(l_odt_4.clearBit(0, 4));
-
// Raise CKE high with NOPS, waiting min Reset CKE exit time (tXPR) - 400 cycles
- FAPI_TRY(l_csn_8.setBit(0, 8));
- FAPI_TRY(l_data_buffer_16.clearBit(0, 16));
- FAPI_TRY(l_num_idles_16.insertFromRight((uint32_t) 400, 0, 16));
- FAPI_TRY(mss_ccs_inst_arry_0( i_target,
- io_ccs_inst_cnt,
- l_data_buffer_16,
- l_bank_3,
- l_activate_1,
- l_rasn_1,
- l_casn_1,
- l_wen_1,
- l_cke_4,
- l_csn_8,
- l_odt_4,
- l_ddr_cal_type_4,
- l_port_number), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
-
- FAPI_TRY(mss_ccs_inst_arry_1( i_target,
- io_ccs_inst_cnt,
- l_num_idles_16,
- l_num_repeat_16,
- l_data_20,
- l_read_compare_1,
- l_rank_cal_4,
- l_ddr_cal_enable_1,
- l_ccs_end_1), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
-
- io_ccs_inst_cnt++;
-
-
+ l_delay = 400;
+ FAPI_TRY(add_nop_to_ccs(i_target, l_addr, l_delay, io_ccs_inst_cnt));
+ // Load nominal MRS values for the MR1, which contains RTT_NOM
FAPI_INF("Sending MRS to rank %d on %s", i_rank, mss::c_str(i_target));
FAPI_TRY(l_num_idles_16.insertFromRight((uint32_t) 12, 0, 16));
FAPI_TRY(l_activate_1.setBit(0));
@@ -2820,11 +2703,11 @@ fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i
FAPI_TRY(l_cke_4.setBit(0, 4));
FAPI_TRY(l_csn_8.clearBit(0, 8));
FAPI_TRY(l_odt_4.clearBit(0, 4));
- //load nominal MRS values for the MR1, which contains RTT_NOM
+
FAPI_TRY(mss_ddr4_load_nominal_mrs_pda(i_target, l_bank_3, l_data_buffer_16, MRS1_BA, i_port, l_dimm,
l_dimm_rank), "mss_ddr4_load_nominal_mrs_pda failed on %s", mss::c_str(i_target));
- //insert on or off to wr lvl enable and qoff
+ // Insert on or off to wr lvl enable and qoff
FAPI_TRY(l_data_buffer_16.insert(i_state, 7, 1, 0));
FAPI_TRY(l_data_buffer_16.insert(i_state, 12, 1, 0));
@@ -2840,19 +2723,19 @@ fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i
FAPI_TRY(l_data_buffer_16_backup.insert(l_data_buffer_16, 0, 16, 0));
FAPI_TRY(l_bank_3_backup.insert(l_bank_3, 0 , 3, 0));
- //loads the previous DRAM
- if (( l_address_mirror_map[l_port_number][l_dimm] & (0x08 >> l_dimm_rank) ) && (l_is_sim == 0))
+ // Do the mirror swizzle if needed
+ if (( l_address_mirror_map[i_port][l_dimm] & (0x08 >> l_dimm_rank) ) && (l_is_sim == 0))
{
- FAPI_INF("Doing address_mirroring_swizzle for %d %d %d %02x", l_port_number, l_dimm, l_dimm_rank,
- l_address_mirror_map[l_port_number][l_dimm] );
+ FAPI_INF("Doing address_mirroring_swizzle for %d %d %d %02x", i_port, l_dimm, l_dimm_rank,
+ l_address_mirror_map[i_port][l_dimm] );
FAPI_TRY(mss_address_mirror_swizzle(i_target, l_data_buffer_16, l_bank_3), "mss_address_mirror_swizzle failed on %s",
mss::c_str(i_target));
}
else
{
- FAPI_INF("No swizzle for address_mirroring_swizzle necessary for %d %d %d 0x%02x", l_port_number, l_dimm, l_dimm_rank,
- l_address_mirror_map[l_port_number][l_dimm] );
+ FAPI_INF("No swizzle for address_mirroring_swizzle necessary for %d %d %d 0x%02x", i_port, l_dimm, l_dimm_rank,
+ l_address_mirror_map[i_port][l_dimm] );
}
FAPI_TRY(mss_ccs_inst_arry_0( i_target,
@@ -2867,7 +2750,7 @@ fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i
l_csn_8,
l_odt_4,
l_ddr_cal_type_4,
- l_port_number), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
+ i_port), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
FAPI_TRY(mss_ccs_inst_arry_1( i_target,
io_ccs_inst_cnt,
@@ -2880,56 +2763,25 @@ fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i
l_ccs_end_1), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
io_ccs_inst_cnt++;
- //do a B side MRS write if needed
- FAPI_TRY( setup_b_side_ccs(i_target, l_port_number, i_rank, l_data_buffer_16_backup,
+ // Do a B side MRS write
+ FAPI_TRY( setup_b_side_ccs(i_target, i_port, i_rank, l_data_buffer_16_backup,
l_bank_3_backup, l_activate_1, l_rasn_1, l_casn_1, l_wen_1,
l_cke_4, l_odt_4, l_ddr_cal_type_4, l_num_idles_16, l_num_repeat_16,
l_data_20, l_read_compare_1, l_rank_cal_4, l_ddr_cal_enable_1,
l_ccs_end_1, io_ccs_inst_cnt) );
- //sets a NOP as the last command
- FAPI_TRY(l_cke_4.setBit(0, 4));
- FAPI_TRY(l_csn_8.setBit(0, 8));
- FAPI_TRY(l_data_buffer_16.clearBit(0, 16));
- FAPI_TRY(l_rasn_1.setBit(0, 1));
- FAPI_TRY(l_casn_1.setBit(0, 1));
- FAPI_TRY(l_wen_1.setBit(0, 1));
-
- // Send out to the CCS array
- FAPI_TRY(mss_ccs_inst_arry_0( i_target,
- io_ccs_inst_cnt,
- l_data_buffer_16,
- l_bank_3,
- l_activate_1,
- l_rasn_1,
- l_casn_1,
- l_wen_1,
- l_cke_4,
- l_csn_8,
- l_odt_4,
- l_ddr_cal_type_4,
- l_port_number), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
+ // Set a NOP as the last command
+ l_addr.port = i_port;
+ l_delay = 12;
+ FAPI_TRY(add_nop_to_ccs(i_target, l_addr, l_delay, io_ccs_inst_cnt));
- FAPI_TRY(mss_ccs_inst_arry_1( i_target,
- io_ccs_inst_cnt,
- l_num_idles_16,
- l_num_repeat_16,
- l_data_20,
- l_read_compare_1,
- l_rank_cal_4,
- l_ddr_cal_enable_1,
- l_ccs_end_1), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
-
- io_ccs_inst_cnt++;
+ // Setup end bit for CCS
+ FAPI_TRY(mss_ccs_set_end_bit(i_target, io_ccs_inst_cnt - 1), "mss_ccs_set_end_bit failed on %s", mss::c_str(i_target));
- //Setup end bit for CCS
- FAPI_TRY(mss_ccs_set_end_bit (i_target, io_ccs_inst_cnt - 1), "mss_ccs_set_end_bit failed on %s", mss::c_str(i_target));
- FAPI_TRY(mss_execute_ccs_inst_array(i_target, 10, 10), " EXECUTE_CCS_INST_ARRAY FAILED FAPI_TRY");
fapi_try_exit:
return fapi2::current_err;
}
-
/// @brief Swaps RTT_NOM and RTT_WR
/// @param[in] target: Reference to centaur.mba target,
/// @param[in] MBA Position
@@ -3205,7 +3057,6 @@ fapi_try_exit:
}
-
/// @brief Modifies the passed in address_16 buffer based upon the given attribute and data
/// @param[in] target: Reference to l_centaur.mba target,
/// @param[in,out] fapi2::variable_buffer& address_16: MRS values - this is modified by the given attribute name and data
diff --git a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.H b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.H
index fa373ad3c..eb20a97fd 100755
--- a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.H
+++ b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_ddr4_funcs.H
@@ -151,36 +151,66 @@ fapi2::ReturnCode mss_ddr4_rtt_nom_rtt_wr_swap(const fapi2::Target<fapi2::TARGET
const uint8_t i_mbaPosition,
const uint32_t i_port_number, const uint8_t i_rank, const uint32_t i_rank_pair_group, uint32_t& io_ccs_inst_cnt,
uint8_t& io_dram_rtt_nom_original);
+
///
/// @brief Set non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
/// @param[in] i_target mba target being calibrated
/// @param[in] i_port port being calibrated
-/// @param[in] i_rank_pair_group rank pair group being calibrated
-/// @param[in] i_state 1 turn on (configure) 0 turn off (cleanup)
-/// @param[in,out] CCS instruction Number
+/// @param[in] i_rank rank pair group being calibrated
+/// @param[in] i_state 1 turn on (configure) or 0 turn off (cleanup)
+/// @param[in,out] io_ccs_inst_cnt CCS instruction Number
/// @return FAPI2_RC_SUCCESS iff successful
///
-fapi2::ReturnCode configure_non_calibrating_ranks(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
- const uint8_t i_port,
- const uint32_t i_rank_pair_group,
- const uint8_t i_state,
- uint32_t& io_ccs_inst_cnt);
-
+fapi2::ReturnCode setup_wr_lvl_mrs_ddr4(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt);
///
-/// @brief Send mrs to non calibrating ranks to turn wr lvl mode on and qoff disabled during wr lvling
+/// @brief Setup CCS for B-side writes
/// @param[in] i_target mba target being calibrated
/// @param[in] i_port port being calibrated
-/// @param[in] i_rank_pair_group rank pair group being calibrated
-/// @param[in] i_state 1 turn on (confiugre) or 0 turn off (cleanup)
+/// @param[in] i_rank rank being calibrated
+/// @param[in] i_address_16 A-side DRAM address
+/// @param[in] i_bank_3 A-side bank address
+/// @param[in] i_activate_1 activate bit
+/// @param[in] i_rasn_1 rasn bit
+/// @param[in] i_casn_1 casn bit
+/// @param[in] i_wen_1 wen bit
+/// @param[in] i_cke_4 cke bits
+/// @param[in] i_odt_4 odt bits
+/// @param[in] i_ddr_cal_type_4 ddr cal type
+/// @param[in] i_num_idles_16 number of idles
+/// @param[in] i_num_repeat_16 number of repeats
+/// @param[in] i_data_20 ccs data
+/// @param[in] i_read_compare_1 read compare bit
+/// @param[in] i_rank_cal_4 rank cal bits
+/// @param[in] i_ddr_cal_enable_1 ddr cal enable bit
+/// @param[in] i_ccs_end_1 ccs end bit
/// @param[in,out] CCS instruction Number
/// @return FAPI2_RC_SUCCESS iff successful
///
-fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
- const uint8_t i_port,
- const uint32_t i_rank_pair_group,
- const uint8_t i_state,
- uint32_t& io_ccs_inst_cnt);
+fapi2::ReturnCode setup_b_side_ccs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ const fapi2::variable_buffer& i_address_16,
+ const fapi2::variable_buffer& i_bank_3,
+ const fapi2::variable_buffer& i_activate_1,
+ const fapi2::variable_buffer& i_rasn_1,
+ const fapi2::variable_buffer& i_casn_1,
+ const fapi2::variable_buffer& i_wen_1,
+ const fapi2::variable_buffer& i_cke_4,
+ const fapi2::variable_buffer& i_odt_4,
+ const fapi2::variable_buffer& i_ddr_cal_type_4,
+ const fapi2::variable_buffer& i_num_idles_16,
+ const fapi2::variable_buffer& i_num_repeat_16,
+ const fapi2::variable_buffer& i_data_20,
+ const fapi2::variable_buffer& i_read_compare_1,
+ const fapi2::variable_buffer& i_rank_cal_4,
+ const fapi2::variable_buffer& i_ddr_cal_enable_1,
+ const fapi2::variable_buffer& i_ccs_end_1,
+ uint32_t& io_ccs_inst_cnt);
#endif /* _MSS_DDR4_FUNCS_H */
diff --git a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.C b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.C
index 8990b704b..7771de39f 100755
--- a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.C
+++ b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.C
@@ -271,7 +271,10 @@ extern "C" {
l_primary_ranks_array[l_group][l_port],
l_group,
l_instruction_number,
- l_dram_rtt_nom_original));
+ l_dram_rtt_nom_original), "mss_rtt_nom_rtt_wr_swap failed!");
+ // Set non-calibrating ranks wr lvl == enable and qoff
+ FAPI_TRY(configure_non_calibrating_ranks(i_target, l_port, l_group, CONFIGURE_QOFF_WRLVL_ON, l_instruction_number),
+ "Failed to configure non calibrating ranks with wr lvl settings on %s", mss::c_str(i_target));
}
//DDR4 RDIMM, do the swap of the RTT_WR to RTT_NOM
@@ -351,6 +354,9 @@ extern "C" {
l_group,
l_instruction_number,
l_dram_rtt_nom_original));
+ //cleanup non calibrating ranks wr_lvl enable and qoff
+ FAPI_TRY(configure_non_calibrating_ranks(i_target, l_port, l_group, CLEANUP_QOFF_WRLVL_OFF, l_instruction_number),
+ "Failed to cleanup non calibrating ranks with wr lvl settings on %s", mss::c_str(i_target));
}
// Following WR_LVL -- Restore RTT_NOM to orignal value post-wr_lvl
@@ -3218,4 +3224,115 @@ extern "C" {
fapi_try_exit:
return fapi2::current_err;
}
+
+///
+/// @brief Setup CCS instructions for setting non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank_pair_group rank pair group being calibrated
+/// @param[in] i_state 1 turn on (confiugre) or 0 turn off (cleanup)
+/// @param[in,out] CCS instruction Number
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+ fapi2::ReturnCode configure_non_calibrating_ranks(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank_pair_group,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt)
+ {
+ uint8_t l_dram_gen = 0;
+ uint8_t l_ranks_array[MAX_RANKS_PER_RANK_GROUP][NUM_RANK_GROUPS][MAX_PORTS_PER_MBA] = {0};
+ uint8_t l_rank_to_cal = 0;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP0, i_target, l_ranks_array[0][0]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP1, i_target, l_ranks_array[0][1]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP2, i_target, l_ranks_array[0][2]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_PRIMARY_RANK_GROUP3, i_target, l_ranks_array[0][3]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP0, i_target, l_ranks_array[1][0]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP1, i_target, l_ranks_array[1][1]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP2, i_target, l_ranks_array[1][2]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_SECONDARY_RANK_GROUP3, i_target, l_ranks_array[1][3]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP0, i_target, l_ranks_array[2][0]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP1, i_target, l_ranks_array[2][1]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP2, i_target, l_ranks_array[2][2]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_TERTIARY_RANK_GROUP3, i_target, l_ranks_array[2][3]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP0, i_target, l_ranks_array[3][0]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP1, i_target, l_ranks_array[3][1]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP2, i_target, l_ranks_array[3][2]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_QUATERNARY_RANK_GROUP3, i_target, l_ranks_array[3][3]));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_GEN, i_target, l_dram_gen));
+ l_rank_to_cal = l_ranks_array[0][i_rank_pair_group][i_port];
+
+ FAPI_DBG("Rank Group Under Cal: %d Rank: %d on %s", i_rank_pair_group, l_rank_to_cal, mss::c_str(i_target));
+
+ for(uint8_t l_rankgroup = 0; l_rankgroup < NUM_RANK_GROUPS; l_rankgroup++)
+ {
+ FAPI_DBG("Checking rankgroup %d on %s port %d: rank: %d ", l_rankgroup, mss::c_str(i_target), i_port,
+ l_ranks_array[0][l_rankgroup][i_port]);
+
+ // If rankgroup is valid and is not the rankgroup being calibrated, send MRS
+ if((l_ranks_array[0][l_rankgroup][i_port] != fapi2::ENUM_ATTR_CEN_EFF_PRIMARY_RANK_GROUP0_INVALID)
+ && (l_rankgroup != i_rank_pair_group))
+ {
+ // Send MRS
+ FAPI_INF("Sending WRLVL MRS to rank group %d rank %d on target %s", l_rankgroup,
+ l_ranks_array[0][l_rankgroup][i_port], mss::c_str(i_target));
+ FAPI_TRY(send_wr_lvl_mrs(i_target, i_port, l_ranks_array[0][l_rankgroup][i_port], i_state, io_ccs_inst_cnt),
+ "Failed to send wr lvl mrs to non calibrating ranks on %s port %d rank %d", mss::c_str(i_target), i_port,
+ l_ranks_array[0][l_rankgroup][i_port]);
+ }
+
+ // Disable any other valid ranks
+ for(uint8_t l_rank = 1; l_rank < MAX_RANKS_PER_RANK_GROUP; l_rank++)
+ {
+ if(l_ranks_array[l_rank][l_rankgroup][i_port] != fapi2::ENUM_ATTR_CEN_EFF_PRIMARY_RANK_GROUP0_INVALID)
+ {
+ // Send MRS
+ FAPI_INF("Sending WRLVL MRS to rank group %d rank %d on target %s", l_rankgroup,
+ l_ranks_array[l_rank][l_rankgroup][i_port], mss::c_str(i_target));
+ FAPI_TRY(send_wr_lvl_mrs(i_target, i_port, l_ranks_array[l_rank][l_rankgroup][i_port], i_state, io_ccs_inst_cnt),
+ "Failed to send wr lvl mrs to non calibrating ranks on %s port %d rank %d", mss::c_str(i_target), i_port,
+ l_ranks_array[l_rank][l_rankgroup][i_port]);
+ }
+ }
+ }
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+///
+/// @brief Set non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank_pair_group rank pair group being calibrated
+/// @param[in] i_state 1 turn on (configure) or 0 turn off (cleanup)
+/// @param[in,out] CCS instruction Number
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+ fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt)
+ {
+ uint8_t l_dram_gen = 0;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_GEN, i_target, l_dram_gen));
+
+ if (l_dram_gen == fapi2::ENUM_ATTR_EFF_DRAM_GEN_DDR4)
+ {
+ FAPI_TRY(setup_wr_lvl_mrs_ddr4(i_target, i_port, i_rank, i_state, io_ccs_inst_cnt));
+ }
+ else
+ {
+ FAPI_TRY(setup_wr_lvl_mrs(i_target, i_port, i_rank, i_state, io_ccs_inst_cnt));
+ }
+
+ FAPI_TRY(mss_execute_ccs_inst_array(i_target, 10, 10), " EXECUTE_CCS_INST_ARRAY FAILED FAPI_TRY");
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
} //end extern C
diff --git a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.H b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.H
index 79562a4bc..c5e7f5708 100755
--- a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.H
+++ b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_draminit_training.H
@@ -192,6 +192,35 @@ extern "C"
const uint8_t l_cur_cal_step,
const fapi2::buffer<uint8_t>& i_cal_steps);
+///
+/// @brief Setup CCS instructions for setting non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank_pair_group rank pair group being calibrated
+/// @param[in] i_state 1 turn on (confiugre) or 0 turn off (cleanup)
+/// @param[in,out] CCS instruction Number
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+ fapi2::ReturnCode configure_non_calibrating_ranks(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank_pair_group,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt);
+
+///
+/// @brief Set non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank_pair_group rank pair group being calibrated
+/// @param[in] i_state 1 turn on (configure) or 0 turn off (cleanup)
+/// @param[in,out] CCS instruction Number
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+ fapi2::ReturnCode send_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt);
} // extern "C"
diff --git a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.C b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.C
index 6e483d81f..716d31e7b 100755
--- a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.C
+++ b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.C
@@ -250,6 +250,160 @@ fapi_try_exit:
}
///
+/// @brief Setup address CCS field for a nominal MRS for MR1
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank rank pair being calibrated
+/// @param[out] o_address_16 CCS address field
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+fapi2::ReturnCode mss_nominal_mrs1_address(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ fapi2::variable_buffer& o_address_16)
+{
+ const uint8_t l_dimm = (i_rank) / MAX_RANKS_PER_DIMM;
+ const uint8_t l_dimm_rank = i_rank - MAX_RANKS_PER_DIMM * l_dimm;
+ uint8_t l_dll_enable = 0;
+ uint8_t l_out_drv_imp_cntl[MAX_PORTS_PER_MBA][MAX_DIMM_PER_PORT] = {0};
+ uint8_t l_dram_rtt_nom[MAX_PORTS_PER_MBA][MAX_DIMM_PER_PORT][MAX_RANKS_PER_DIMM] = {0};
+ uint8_t l_dram_al = 0;
+ uint8_t l_wr_lvl = 0;
+ uint8_t l_tdqs_enable = 0;
+ uint8_t l_q_off = 0;
+ uint8_t l_lrdimm_rank_mult_mode = 0;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_DLL_ENABLE, i_target, l_dll_enable));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_VPD_DRAM_RON, i_target, l_out_drv_imp_cntl));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_VPD_DRAM_RTT_NOM, i_target, l_dram_rtt_nom));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_AL, i_target, l_dram_al));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_WR_LVL_ENABLE, i_target, l_wr_lvl));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_TDQS, i_target, l_tdqs_enable));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_OUTPUT_BUFFER, i_target, l_q_off));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_LRDIMM_RANK_MULT_MODE, i_target, l_lrdimm_rank_mult_mode));
+
+ if (l_dll_enable == fapi2::ENUM_ATTR_CEN_EFF_DRAM_DLL_ENABLE_ENABLE)
+ {
+ l_dll_enable = 0x00;
+ }
+ else if (l_dll_enable == fapi2::ENUM_ATTR_CEN_EFF_DRAM_DLL_ENABLE_DISABLE)
+ {
+ l_dll_enable = 0xFF;
+ }
+
+ if (l_dram_al == fapi2::ENUM_ATTR_CEN_EFF_DRAM_AL_DISABLE)
+ {
+ l_dram_al = 0x00;
+ }
+ else if (l_dram_al == fapi2::ENUM_ATTR_CEN_EFF_DRAM_AL_CL_MINUS_1)
+ {
+ l_dram_al = 0x80;
+ }
+ else if (l_dram_al == fapi2::ENUM_ATTR_CEN_EFF_DRAM_AL_CL_MINUS_2)
+ {
+ l_dram_al = 0x40;
+ }
+ else if (l_dram_al == fapi2::ENUM_ATTR_CEN_EFF_DRAM_AL_CL_MINUS_3)
+ {
+ l_dram_al = 0xC0;
+ }
+
+ if (l_wr_lvl == fapi2::ENUM_ATTR_CEN_EFF_DRAM_WR_LVL_ENABLE_DISABLE)
+ {
+ l_wr_lvl = 0x00;
+ }
+ else if (l_wr_lvl == fapi2::ENUM_ATTR_CEN_EFF_DRAM_WR_LVL_ENABLE_ENABLE)
+ {
+ l_wr_lvl = 0xFF;
+ }
+
+ if (l_tdqs_enable == fapi2::ENUM_ATTR_CEN_EFF_DRAM_TDQS_DISABLE)
+ {
+ l_tdqs_enable = 0x00;
+ }
+ else if (l_tdqs_enable == fapi2::ENUM_ATTR_CEN_EFF_DRAM_TDQS_ENABLE)
+ {
+ l_tdqs_enable = 0xFF;
+ }
+
+ if (l_q_off == fapi2::ENUM_ATTR_CEN_EFF_DRAM_OUTPUT_BUFFER_DISABLE)
+ {
+ l_q_off = 0xFF;
+ }
+ else if (l_q_off == fapi2::ENUM_ATTR_CEN_EFF_DRAM_OUTPUT_BUFFER_ENABLE)
+ {
+ l_q_off = 0x00;
+ }
+
+ if ( l_lrdimm_rank_mult_mode != 0 )
+ {
+ l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] = 0x00;
+ }
+ else if (l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RTT_NOM_DISABLE)
+ {
+ l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] = 0x00;
+ }
+ else if (l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RTT_NOM_OHM20)
+ {
+ l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] = 0x20;
+ }
+ else if (l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RTT_NOM_OHM30)
+ {
+ l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] = 0xA0;
+ }
+ else if (l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RTT_NOM_OHM40)
+ {
+ l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] = 0xC0;
+ }
+ else if (l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RTT_NOM_OHM60)
+ {
+ l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] = 0x80;
+ }
+ else if (l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RTT_NOM_OHM120)
+ {
+ l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank] = 0x40;
+ }
+ else
+ {
+ FAPI_ASSERT(false,
+ fapi2::CEN_MSS_DRAMINIT_RTT_NOM_IMP_INPUT_ERROR().
+ set_TARGET_MBA_ERROR(i_target).
+ set_IMP(l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank]).
+ set_PORT(i_port).
+ set_DIMM(l_dimm).
+ set_RANK(l_dimm_rank),
+ "mss_mrs_load: %s Error determining ATTR_VPD_DRAM_RTT_NOM value: %d from attribute",
+ mss::c_str(i_target), l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank]);
+ }
+
+ if (l_out_drv_imp_cntl[i_port][l_dimm] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RON_OHM40)
+ {
+ l_out_drv_imp_cntl[i_port][l_dimm] = 0x00;
+ }
+ else if (l_out_drv_imp_cntl[i_port][l_dimm] == fapi2::ENUM_ATTR_CEN_VPD_DRAM_RON_OHM34)
+ {
+ l_out_drv_imp_cntl[i_port][l_dimm] = 0x80;
+ }
+
+ FAPI_TRY(o_address_16.insert((uint8_t) l_dll_enable, 0, 1, 0));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_out_drv_imp_cntl[i_port][l_dimm], 1, 1, 0));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank], 2, 1, 0));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_dram_al, 3, 2, 0));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_out_drv_imp_cntl[i_port][l_dimm], 5, 1, 1));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank], 6, 1, 1));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_wr_lvl, 7, 1, 0));
+ FAPI_TRY(o_address_16.insert((uint8_t) 0x00, 8, 1));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_dram_rtt_nom[i_port][l_dimm][l_dimm_rank], 9, 1, 2));
+ FAPI_TRY(o_address_16.insert((uint8_t) 0x00, 10, 1));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_tdqs_enable, 11, 1, 0));
+ FAPI_TRY(o_address_16.insert((uint8_t) l_q_off, 12, 1, 0));
+ FAPI_TRY(o_address_16.insert((uint8_t) 0x00, 13, 3));
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
/// @function mss_ccs_inst_arry_0
/// @brief Adding information to the CCS - 0 instruction array by index
/// @param[in] i_target, Target<fapi2::TARGET_TYPE_MBA> = centaur.mba
@@ -2106,3 +2260,287 @@ fapi2::ReturnCode mss_assert_resetn (
fapi_try_exit:
return fapi2::current_err;
}
+
+///
+/// @brief Set non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank rank pair group being calibrated
+/// @param[in] i_state 1 turn on (configure) or 0 turn off (cleanup)
+/// @param[in,out] io_ccs_inst_cnt CCS instruction Number
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+fapi2::ReturnCode setup_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt)
+{
+ fapi2::variable_buffer l_data_buffer_16(16);
+ fapi2::variable_buffer l_bank_3(3);
+ fapi2::variable_buffer l_activate_1(1);
+ fapi2::variable_buffer l_rasn_1(1);
+ fapi2::variable_buffer l_casn_1(1);
+ fapi2::variable_buffer l_wen_1(1);
+ fapi2::variable_buffer l_cke_4(4);
+ fapi2::variable_buffer l_csn_8(8);
+ fapi2::variable_buffer l_ddr_cal_type_4(4);
+ fapi2::variable_buffer l_odt_4(4);
+ fapi2::variable_buffer l_num_idles_16(16);
+ fapi2::variable_buffer l_num_repeat_16(16);
+ fapi2::variable_buffer l_data_20(20);
+ fapi2::variable_buffer l_read_compare_1(1);
+ fapi2::variable_buffer l_rank_cal_4(4);
+ fapi2::variable_buffer l_ddr_cal_enable_1(1);
+ fapi2::variable_buffer l_ccs_end_1(1);
+ uint8_t l_is_sim = 0;
+ uint8_t l_address_mirror_map[MAX_PORTS_PER_MBA][MAX_DIMM_PER_PORT] = {0}; //address_mirror_map[port][dimm]
+ // dimm 0, dimm_rank 0-3 = ranks 0-3; dimm 1, dimm_rank 0-3 = ranks 4-7
+ const uint8_t l_dimm = (i_rank) / MAX_RANKS_PER_DIMM;
+ const uint8_t l_dimm_rank = i_rank - MAX_RANKS_PER_DIMM * l_dimm;
+ access_address l_addr = {0, 0, 0, 0, 0};
+ uint32_t l_delay = 0;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), l_is_sim));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CEN_EFF_DRAM_ADDRESS_MIRRORING, i_target, l_address_mirror_map));
+
+ // Raise CKE high with NOPS, waiting min Reset CKE exit time (tXPR) - 400 cycles
+ l_delay = 400;
+ FAPI_TRY(add_nop_to_ccs(i_target, l_addr, l_delay, io_ccs_inst_cnt));
+
+ // Load nominal MRS values for the MR1, which contains RTT_NOM
+ FAPI_INF("Sending MRS to rank %d on %s", i_rank, mss::c_str(i_target));
+ FAPI_TRY(l_num_idles_16.insertFromRight((uint32_t) 12, 0, 16));
+ FAPI_TRY(l_activate_1.setBit(0));
+ FAPI_TRY(l_rasn_1.clearBit(0));
+ FAPI_TRY(l_casn_1.clearBit(0));
+ FAPI_TRY(l_wen_1.clearBit(0));
+ FAPI_TRY(l_cke_4.setBit(0, 4));
+ FAPI_TRY(l_csn_8.clearBit(0, 8));
+ FAPI_TRY(l_odt_4.clearBit(0, 4));
+
+ FAPI_TRY(mss_nominal_mrs1_address(i_target, i_port, i_rank, l_data_buffer_16));
+
+ // Insert on or off to wr lvl enable and qoff
+ FAPI_TRY(l_data_buffer_16.insert(i_state, 7, 1, 0));
+ FAPI_TRY(l_data_buffer_16.insert(i_state, 12, 1, 0));
+
+ // Only corresponding CS to rank
+ FAPI_TRY(l_csn_8.setBit(0, 8));
+ FAPI_TRY(l_csn_8.clearBit(i_rank));
+
+ FAPI_TRY(mss_disable_cid(i_target, l_csn_8, l_cke_4));
+
+ FAPI_TRY(l_bank_3.insert((uint8_t) MRS1_BA, 0, 1, 7));
+ FAPI_TRY(l_bank_3.insert((uint8_t) MRS1_BA, 1, 1, 6));
+ FAPI_TRY(l_bank_3.insert((uint8_t) MRS1_BA, 2, 1, 5));
+
+ // Do the mirror swizzle if needed
+ if (( l_address_mirror_map[i_port][l_dimm] & (0x08 >> l_dimm_rank) ) && (l_is_sim == 0))
+ {
+ FAPI_INF("Doing address_mirroring_swizzle for %d %d %d %02x", i_port, l_dimm, l_dimm_rank,
+ l_address_mirror_map[i_port][l_dimm] );
+ FAPI_TRY(mss_address_mirror_swizzle(i_target, l_data_buffer_16, l_bank_3), "mss_address_mirror_swizzle failed on %s",
+ mss::c_str(i_target));
+
+ }
+ else
+ {
+ FAPI_INF("No swizzle for address_mirroring_swizzle necessary for %d %d %d 0x%02x", i_port, l_dimm, l_dimm_rank,
+ l_address_mirror_map[i_port][l_dimm] );
+ }
+
+ FAPI_TRY(mss_ccs_inst_arry_0( i_target,
+ io_ccs_inst_cnt,
+ l_data_buffer_16,
+ l_bank_3,
+ l_activate_1,
+ l_rasn_1,
+ l_casn_1,
+ l_wen_1,
+ l_cke_4,
+ l_csn_8,
+ l_odt_4,
+ l_ddr_cal_type_4,
+ i_port), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
+
+ FAPI_TRY(mss_ccs_inst_arry_1( i_target,
+ io_ccs_inst_cnt,
+ l_num_idles_16,
+ l_num_repeat_16,
+ l_data_20,
+ l_read_compare_1,
+ l_rank_cal_4,
+ l_ddr_cal_enable_1,
+ l_ccs_end_1), "ccs_inst_arry_0 failed on %s", mss::c_str(i_target));
+ io_ccs_inst_cnt++;
+
+ // Set a NOP as the last command
+ l_addr.port = i_port;
+ l_delay = 12;
+ FAPI_TRY(add_nop_to_ccs(i_target, l_addr, l_delay, io_ccs_inst_cnt));
+
+ // Setup end bit for CCS
+ FAPI_TRY(mss_ccs_set_end_bit(i_target, io_ccs_inst_cnt - 1), "mss_ccs_set_end_bit failed on %s", mss::c_str(i_target));
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+/// @brief Add a NOP command to the CCS program
+/// @param[in] i_target_mba mba target
+/// @param[in] i_addr address struct for command
+/// @param[in] i_delay delay associated with this instruction
+/// @param[in,out] io_instruction_number position in CCS program in which to insert command (will be incremented)
+/// @return FAPI2_RC_SUCCESS iff successful
+fapi2::ReturnCode add_nop_to_ccs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target_mba,
+ const access_address i_addr,
+ const uint32_t i_delay,
+ uint32_t& io_instruction_number)
+{
+ uint8_t l_is_sim = 0;
+
+ // CCS Array 0 buffers
+ fapi2::variable_buffer addr_16(16);
+ fapi2::variable_buffer bank_3(3);
+ fapi2::variable_buffer ddr4_activate_1(1);
+ fapi2::variable_buffer rasn_1(1);
+ fapi2::variable_buffer casn_1(1);
+ fapi2::variable_buffer wen_1(1);
+ fapi2::variable_buffer cke_4(4);
+ fapi2::variable_buffer csn_8(8);
+ fapi2::variable_buffer odt_4(4);
+ fapi2::variable_buffer cal_type_4(4);
+
+ // CCS Array 1 buffers
+ fapi2::variable_buffer idles_16(16);
+ fapi2::variable_buffer repeat_16(16);
+ fapi2::variable_buffer pattern_20(20);
+ fapi2::variable_buffer read_compare_1(1);
+ fapi2::variable_buffer rank_cal_4(4);
+ fapi2::variable_buffer cal_enable_1(1);
+ fapi2::variable_buffer ccs_end_1(1);
+ uint32_t l_port = i_addr.port;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), l_is_sim));
+
+ // CCS Array 0 Setup
+
+ // Command structure setup
+ addr_16.flush<0>();
+ bank_3.flush<0>();
+ cke_4.flush<1>();
+ csn_8.flush<1>();
+ FAPI_TRY(rasn_1.setBit(0));
+ FAPI_TRY(casn_1.setBit(0));
+ FAPI_TRY(wen_1.setBit(0));
+
+ FAPI_TRY(read_compare_1.clearBit(0));
+
+ // Final setup
+ odt_4.flush<0>();
+ cal_type_4.flush<0>();
+ FAPI_TRY(ddr4_activate_1.setBit(0));
+
+ FAPI_TRY(mss_ccs_inst_arry_0(i_target_mba,
+ io_instruction_number,
+ addr_16,
+ bank_3,
+ ddr4_activate_1,
+ rasn_1,
+ casn_1,
+ wen_1,
+ cke_4,
+ csn_8,
+ odt_4,
+ cal_type_4,
+ l_port));
+
+
+ // CCS Array 1 Setup
+ FAPI_TRY(idles_16.insertFromRight(i_delay, 0, 16));
+ repeat_16.flush<0>();
+ pattern_20.flush<0>();
+ read_compare_1.flush<0>();
+ rank_cal_4.flush<0>();
+ cal_enable_1.flush<0>();
+ ccs_end_1.flush<0>();
+
+ FAPI_TRY(mss_ccs_inst_arry_1(i_target_mba,
+ io_instruction_number,
+ idles_16,
+ repeat_16,
+ pattern_20,
+ read_compare_1,
+ rank_cal_4,
+ cal_enable_1,
+ ccs_end_1));
+
+ ++io_instruction_number;
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+/// @brief Get the CSN representation of a given address
+/// @param[in] i_target_mba mba target
+/// @param[in] i_addr address struct for MRS
+/// @param[in] i_stack_type value of ATTR_CEN_EFF_STACK_TYPE for given MBA
+/// @param[out] o_csn_8 CSN encoding
+/// @return FAPI2_RC_SUCCESS iff successful
+fapi2::ReturnCode cs_decode(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target_mba,
+ const access_address i_addr,
+ const uint8_t i_stack_type,
+ fapi2::variable_buffer& o_csn_8)
+{
+ fapi2::variable_buffer mrank(8);
+ fapi2::variable_buffer cid(8);
+ fapi2::buffer<uint64_t> data_buffer;
+
+ o_csn_8.flush<1>();
+
+ if(i_stack_type == fapi2::ENUM_ATTR_CEN_EFF_STACK_TYPE_STACK_3DS)
+ {
+ FAPI_TRY(mrank.insert(i_addr.rank, 4, 4 , 0));
+ FAPI_TRY(cid.insert(i_addr.rank, 4, 4, 4));
+
+ uint8_t mrank_u8 = 0;
+ mrank.extract(mrank_u8, 0, 8);
+ uint8_t cid_u8 = 0;
+ cid.extract(cid_u8, 0, 8);
+
+ FAPI_ASSERT((mrank_u8 == 0 || mrank_u8 == 1 || mrank_u8 == 4 || mrank_u8 == 5),
+ fapi2::CEN_MSS_CCS_MRANK_OUT_OF_BOUNDS()
+ .set_INDEX_VALUE(mrank_u8),
+ "mrank value: 0x%02X not supported\n", mrank_u8);
+ FAPI_ASSERT(cid_u8 < 8,
+ fapi2::CEN_MSS_CCS_SRANK_OUT_OF_BOUNDS()
+ .set_INDEX_VALUE(cid_u8),
+ "srank/cid value: 0x%X not Supported", cid_u8);
+
+ FAPI_TRY(o_csn_8.clearBit(mrank_u8));
+
+ if (mrank_u8 >= MAX_RANKS_PER_DIMM)
+ {
+ FAPI_TRY(o_csn_8.insert(cid_u8, 6, 1, 7));
+ FAPI_TRY(o_csn_8.insert(cid_u8, 7, 1, 6));
+ }
+ else
+ {
+ FAPI_TRY(o_csn_8.insert(cid_u8, 2, 1, 7));
+ FAPI_TRY(o_csn_8.insert(cid_u8, 3, 1, 6));
+ }
+
+ FAPI_DBG("%s Row: 0x%04x, Col: 0x%04x, Mrank: %d, Srank: %d, Bank: %d, Port: %d\n",
+ mss::c_str(i_target_mba), i_addr.row_addr, i_addr.col_addr, mrank_u8, cid_u8, i_addr.bank, i_addr.port);
+ }
+ else
+ {
+ FAPI_TRY(o_csn_8.clearBit(i_addr.rank));
+ FAPI_DBG("%s Row: 0x%04x, Col: 0x%04x, Rank: %d, Bank: %d, Port: %d\n",
+ mss::c_str(i_target_mba), i_addr.row_addr, i_addr.col_addr, i_addr.rank, i_addr.bank, i_addr.port);
+ }
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
diff --git a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.H b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.H
index 1ff845aa9..a1fa20c31 100755
--- a/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.H
+++ b/src/import/chips/centaur/procedures/hwp/memory/p9c_mss_funcs.H
@@ -37,6 +37,16 @@
#define _MSS_FUNCS_H
#include <dimmConsts.H>
+/// @brief Struct to contain DRAM address bits
+struct access_address
+{
+ uint32_t row_addr;
+ uint32_t col_addr;
+ uint8_t rank;
+ uint8_t bank;
+ uint8_t port;
+};
+
///
/// @brief Disables all CID's
/// @param[in] i_target - the MBA target on which to operate
@@ -49,6 +59,19 @@ fapi2::ReturnCode mss_disable_cid( const fapi2::Target<fapi2::TARGET_TYPE_MBA>&
fapi2::variable_buffer& io_cke);
///
+/// @brief Setup address CCS field for a nominal MRS for MR1
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank rank pair being calibrated
+/// @param[out] o_address_16 CCS address field
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+fapi2::ReturnCode mss_nominal_mrs1_address(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ fapi2::variable_buffer& o_address_16);
+
+///
/// @brief Adding information to the CCS - 0 instruction array by index
/// @param[in] Target<fapi2::TARGET_TYPE_MBA> = centaur.mba
/// @param[in] Instruction Number
@@ -311,5 +334,42 @@ fapi2::ReturnCode mss_assert_resetn (const fapi2::Target<fapi2::TARGET_TYPE_MBA>
///
fapi2::ReturnCode mss_assert_resetn_drive_mem_clks(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target);
+///
+/// @brief Set non calibrating ranks to wr lvl mode on and qoff disabled during wr lvling
+/// @param[in] i_target mba target being calibrated
+/// @param[in] i_port port being calibrated
+/// @param[in] i_rank rank pair group being calibrated
+/// @param[in] i_state 1 turn on (configure) or 0 turn off (cleanup)
+/// @param[in,out] io_ccs_inst_cnt CCS instruction Number
+/// @return FAPI2_RC_SUCCESS iff successful
+///
+fapi2::ReturnCode setup_wr_lvl_mrs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target,
+ const uint8_t i_port,
+ const uint32_t i_rank,
+ const uint8_t i_state,
+ uint32_t& io_ccs_inst_cnt);
+
+/// @brief Add a NOP command to the CCS program
+/// @param[in] i_target_mba mba target
+/// @param[in] i_addr address struct for command
+/// @param[in] i_delay delay associated with this instruction
+/// @param[in,out] io_instruction_number position in CCS program in which to insert command (will be incremented)
+/// @return FAPI2_RC_SUCCESS iff successful
+fapi2::ReturnCode add_nop_to_ccs(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target_mba,
+ const access_address i_addr,
+ const uint32_t i_delay,
+ uint32_t& io_instruction_number);
+
+/// @brief Get the CSN representation of a given address
+/// @param[in] i_target_mba mba target
+/// @param[in] i_addr address struct for MRS
+/// @param[in] i_stack_type value of ATTR_CEN_EFF_STACK_TYPE for given MBA
+/// @param[out] o_csn_8 CSN encoding
+/// @return FAPI2_RC_SUCCESS iff successful
+fapi2::ReturnCode cs_decode(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target_mba,
+ const access_address i_addr,
+ const uint8_t i_stack_type,
+ fapi2::variable_buffer& o_csn_8);
+
#endif /* _MSS_FUNCS_H */
diff --git a/src/import/chips/centaur/procedures/xml/error_info/p9c_mss_funcs_errors.xml b/src/import/chips/centaur/procedures/xml/error_info/p9c_mss_funcs_errors.xml
index ce94d7d63..61a54bfb5 100644
--- a/src/import/chips/centaur/procedures/xml/error_info/p9c_mss_funcs_errors.xml
+++ b/src/import/chips/centaur/procedures/xml/error_info/p9c_mss_funcs_errors.xml
@@ -5,7 +5,7 @@
<!-- -->
<!-- OpenPOWER HostBoot Project -->
<!-- -->
-<!-- Contributors Listed Below - COPYRIGHT 2016,2017 -->
+<!-- Contributors Listed Below - COPYRIGHT 2016,2018 -->
<!-- [+] International Business Machines Corp. -->
<!-- -->
<!-- -->
@@ -186,4 +186,24 @@
</callout>
</hwpError>
+ <hwpError>
+ <rc>RC_CEN_MSS_CCS_MRANK_OUT_OF_BOUNDS</rc>
+ <description>An invalid mrank value was passsed to the function.</description>
+ <ffdc>INDEX_VALUE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+
+ <hwpError>
+ <rc>RC_CEN_MSS_CCS_SRANK_OUT_OF_BOUNDS</rc>
+ <description>An invalid srank or cid value was passsed to the function.</description>
+ <ffdc>INDEX_VALUE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+
</hwpErrors>
OpenPOWER on IntegriCloud