summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorMike Jones <mjjones@us.ibm.com>2012-05-07 11:27:58 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-05-07 11:40:22 -0500
commitca1f509428df6418258b8e16b30b49265fd33817 (patch)
tree85dd9116b78ac765dad2c8d052ca9c4aa8f7bce7 /src/usr
parent3b10539019cc09589ba0dfdacc97ba8c206f540e (diff)
downloadblackbird-hostboot-ca1f509428df6418258b8e16b30b49265fd33817.tar.gz
blackbird-hostboot-ca1f509428df6418258b8e16b30b49265fd33817.zip
HWP: Merge updated mss_draminit_training into Hostboot
This is the latest version that Mark Bellows requested we pick up some time ago. The code has already been reviewed in the hwp_review_centaur Gerrit project so no review needs to be done. It works in Simics. This can just be submitted. Change-Id: I7ba3f3710b4743e44d93452182e15f2b97b07355 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1031 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/hwpf/hwp/dram_training/mss_draminit_training/mss_draminit_training.C395
-rw-r--r--src/usr/hwpf/hwp/dram_training/mss_funcs.C112
-rw-r--r--src/usr/hwpf/hwp/dram_training/mss_funcs.H10
3 files changed, 330 insertions, 187 deletions
diff --git a/src/usr/hwpf/hwp/dram_training/mss_draminit_training/mss_draminit_training.C b/src/usr/hwpf/hwp/dram_training/mss_draminit_training/mss_draminit_training.C
index 5fb616e11..dd10ac4c7 100644
--- a/src/usr/hwpf/hwp/dram_training/mss_draminit_training/mss_draminit_training.C
+++ b/src/usr/hwpf/hwp/dram_training/mss_draminit_training/mss_draminit_training.C
@@ -27,7 +27,22 @@
//------------------------------------------------------------------------------
// Version:| Author: | Date: | Comment:
//---------|----------|---------|------------------------------------------------
-// 1.17 | divyakum |20-Feb-12| Adding comments to include target type
+// 1.26 | asaetow |12-Apr-12| Added "if(rc) return rc;" at line 180.
+// 1.25 | asaetow |06-Apr-12| Added "if(rc) return rc;" at line 165.
+// 1.24 | asaetow |03-Apr-12| Changed FAPI_INF to FAPI_ERR where applicable from lines 275 to 324, per Mike Jones.
+// 1.23 | asaetow |29-Mar-12| Fixed FAPI_SET_HWP_ERROR using temp error callout RC_MSS_PLACE_HOLDER_ERROR.
+// | | | Changed uint32_t NUM_POLL to const.
+// 1.22 | divyakum |29-Mar-12| Fixed rc assignment. Added comments for error handling.
+// 1.21 | divyakum |06-Mar-12| Added cal status checking function.
+// | | | Fixed init cal issue via CCS to account for both ports.
+// 1.20 | divyakum | | Modified to execute CCS after every instruction.
+// | | | Added error checking for calibration. Needs cen_scom_addresses.H v.1.15 or newer.
+// 1.19 | divyakum |01-Mar-12| Fixed ddr_cal_enable_buffer_1 value for ZQ cal long
+// 1.18 | divyakum |29-Feb-12| Removed call to ccs_mode function. writing to scom directly
+// | | | Fixed wen_buffer value when re-issuing zqcal
+// | | | Fixed test_buffer value when re-issuing zqcal
+// | | | Added cen_scom_addresses.H in include
+// 1.17 | divyakum |20-Feb-12| Adding comments to include i_target type
// 1.16 | divyakum |20-Feb-12| Replaced calls to insertFromBin with setHalfWord and setBit functions
// 1.15 | divyakum |14-Feb-12| Removed port field from mss_ccs_mode, mss_ccs_inst_arry_1, mss_execute_ccs_inst_array.
// | | | NOTE: compatible with mss_funcs.H v1.19 or newer
@@ -64,15 +79,6 @@
//Enable complex training procedure based on DIMM_TYPE
//Check BAD BYTE attribute with DISABLE DP18
//Figure out DISABLE DP18 mapping for each physical byte.
-//Need to add cal_timer_cnt_mult to CCS_MODE func
-
-/**
- * @brief Draminit Training procedure. Calibrating DRAMs
- *
- * @param[in] i_target Reference to MBA target
- *
- * @return ReturnCode
- */
//----------------------------------------------------------------------
// FAPI function Includes
@@ -83,6 +89,7 @@
//----------------------------------------------------------------------
// Centaur function Includes
//----------------------------------------------------------------------
+#include <cen_scom_addresses.H>
#include <mss_funcs.H>
//------------End My Includes-------------------------------------------
@@ -93,9 +100,10 @@ extern "C" {
using namespace fapi;
-ReturnCode mss_draminit_training(Target& target);
+ReturnCode mss_draminit_training(Target& i_target);
+ReturnCode mss_check_cal_status(Target& i_target, uint8_t i_port, uint8_t i_group);
-ReturnCode mss_draminit_training(Target& target)
+ReturnCode mss_draminit_training(Target& i_target)
{
// Target is centaur.mba
//Enums and Constants
@@ -106,232 +114,247 @@ ReturnCode mss_draminit_training(Target& target)
MAX_NUM_GROUP = 4,
INVALID = 255
};
- uint32_t NUM_POLL = 100;
+ const uint32_t NUM_POLL = 100;
ReturnCode rc;
- ReturnCode buffer_rc;
+ uint32_t rc_num = 0;
//Issue ZQ Cal first per rank
uint32_t instruction_number = 0;
ecmdDataBufferBase address_buffer_16(16);
- buffer_rc = buffer_rc | address_buffer_16.setHalfWord(0, 0x0020); //Set A10 bit for ZQCal Long
+ rc_num = rc_num | address_buffer_16.flushTo0();
ecmdDataBufferBase bank_buffer_8(8);
- buffer_rc = buffer_rc | bank_buffer_8.flushTo0();
+ rc_num = rc_num | bank_buffer_8.flushTo0();
ecmdDataBufferBase activate_buffer_1(1);
- buffer_rc = buffer_rc | activate_buffer_1.flushTo0();
+ rc_num = rc_num | activate_buffer_1.flushTo0();
ecmdDataBufferBase rasn_buffer_1(1);
- buffer_rc = buffer_rc | rasn_buffer_1.flushTo1(); //For ZQCal rasn = 1; casn = 1; wen = 0;
ecmdDataBufferBase casn_buffer_1(1);
- buffer_rc = buffer_rc | casn_buffer_1.flushTo1();
ecmdDataBufferBase wen_buffer_1(1);
- buffer_rc = buffer_rc | wen_buffer_1.flushTo1();
ecmdDataBufferBase cke_buffer_8(8);
- buffer_rc = buffer_rc | cke_buffer_8.flushTo1();
+ rc_num = rc_num | cke_buffer_8.flushTo1();
ecmdDataBufferBase csn_buffer_8(8);
- buffer_rc = buffer_rc | csn_buffer_8.flushTo1();
+ rc_num = rc_num | csn_buffer_8.flushTo1();
ecmdDataBufferBase odt_buffer_8(8);
- buffer_rc = buffer_rc | odt_buffer_8.flushTo0();
+ rc_num = rc_num | odt_buffer_8.flushTo0();
ecmdDataBufferBase test_buffer_4(4);
- buffer_rc = buffer_rc | test_buffer_4.setBit(1); // 11XX:Initial Calibration, 01XX:External ZQ calibration
ecmdDataBufferBase num_idles_buffer_16(16);
- buffer_rc = buffer_rc | num_idles_buffer_16.setHalfWord(0, 0x0400); //1024 for ZQCal
+ rc_num = rc_num | num_idles_buffer_16.flushTo1();
ecmdDataBufferBase num_repeat_buffer_16(16);
- buffer_rc = buffer_rc | num_repeat_buffer_16.flushTo0();
+ rc_num = rc_num | num_repeat_buffer_16.flushTo0();
ecmdDataBufferBase data_buffer_20(20);
- buffer_rc = buffer_rc | data_buffer_20.flushTo0();
+ rc_num = rc_num | data_buffer_20.flushTo0();
ecmdDataBufferBase read_compare_buffer_1(1);
- buffer_rc = buffer_rc | read_compare_buffer_1.flushTo0();
+ rc_num = rc_num | read_compare_buffer_1.flushTo0();
ecmdDataBufferBase rank_cal_buffer_3(3);
- buffer_rc = buffer_rc | rank_cal_buffer_3.flushTo0();
+ rc_num = rc_num | rank_cal_buffer_3.flushTo0();
ecmdDataBufferBase ddr_cal_enable_buffer_1(1);
- buffer_rc = buffer_rc | ddr_cal_enable_buffer_1.flushTo1();
ecmdDataBufferBase ccs_end_buffer_1(1);
- buffer_rc = buffer_rc | ccs_end_buffer_1.flushTo0();
+ rc_num = rc_num | ccs_end_buffer_1.flushTo1();
ecmdDataBufferBase stop_on_err_buffer_1(1);
- buffer_rc = buffer_rc | stop_on_err_buffer_1.flushTo0();
- ecmdDataBufferBase ue_disable_buffer_1(1);
- buffer_rc = buffer_rc | ue_disable_buffer_1.flushTo0();
- ecmdDataBufferBase data_sel_buffer_2(2);
- ecmdDataBufferBase pclk_buffer_2(2);
- ecmdDataBufferBase nclk_buffer_2(2);
- ecmdDataBufferBase cal_time_cnt_buffer_16(16);
- buffer_rc = buffer_rc | cal_time_cnt_buffer_16.flushTo1();
+ rc_num = rc_num | stop_on_err_buffer_1.flushTo0();
+ ecmdDataBufferBase cal_timeout_cnt_buffer_16(16);
+ rc_num = rc_num | cal_timeout_cnt_buffer_16.flushTo1();
ecmdDataBufferBase resetn_buffer_1(1);
- buffer_rc = buffer_rc | resetn_buffer_1.setBit(0);
- ecmdDataBufferBase reset_recover_buffer_1(1);
- ecmdDataBufferBase copy_spare_cke_buffer_1(1);
-
- if(buffer_rc)
+ rc_num = rc_num | resetn_buffer_1.setBit(0);
+ ecmdDataBufferBase cal_timeout_cnt_mult_buffer_2(2);
+ rc_num = rc_num | cal_timeout_cnt_mult_buffer_2.flushTo0();
+
+ ecmdDataBufferBase data_buffer_64(64);
+ if(rc_num)
{
- FAPI_ERR( "Error setting up buffers");
- return buffer_rc;
+ rc.setEcmdError(rc_num);
+ return rc;
}
- uint32_t current_rank = 0;
- uint32_t port = 0;
- uint32_t start_rank = 0;
+ uint8_t port = 0;
+ uint8_t group = 0;
- uint8_t num_ranks_array[2][2]; //num_ranks_array[port][dimm]
uint8_t primary_ranks_array[4][2]; //primary_ranks_array[group][port]
- //populate num_ranks_array
- rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &target, num_ranks_array);
- if(rc) return rc;
//populate primary_ranks_arrays_array
- rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP0, &target, primary_ranks_array[0]);
+ rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP0, &i_target, primary_ranks_array[0]);
+ if(rc) return rc;
+ rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP1, &i_target, primary_ranks_array[1]);
if(rc) return rc;
- rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP1, &target, primary_ranks_array[1]);
+ rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP2, &i_target, primary_ranks_array[2]);
if(rc) return rc;
- rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP2, &target, primary_ranks_array[2]);
+ rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP3, &i_target, primary_ranks_array[3]);
if(rc) return rc;
- rc = FAPI_ATTR_GET(ATTR_EFF_PRIMARY_RANK_GROUP3, &target, primary_ranks_array[3]);
+
+ //Set up CCS Mode Reg for Init cal
+ rc = fapiGetScom(i_target, MEM_MBA01_CCS_MODEQ_0x030106A7, data_buffer_64);
+ if(rc) return rc;
+ rc_num = rc_num | data_buffer_64.insert(stop_on_err_buffer_1, 0, 1, 0);
+ rc_num = rc_num | data_buffer_64.insert(cal_timeout_cnt_buffer_16, 8, 16, 0);
+ rc_num = rc_num | data_buffer_64.insert(resetn_buffer_1, 24, 1, 0);
+ rc_num = rc_num | data_buffer_64.insert(cal_timeout_cnt_mult_buffer_2, 30, 2, 0);
+ if(rc_num)
+ {
+ rc.setEcmdError(rc_num);
+ return rc;
+ }
+ rc = fapiPutScom(i_target, MEM_MBA01_CCS_MODEQ_0x030106A7, data_buffer_64);
if(rc) return rc;
-
+
for(port = 0; port < MAX_NUM_PORT; port++)
{
- for(uint32_t dimm = 0; dimm < MAX_NUM_DIMM; dimm++)
- {
- start_rank=(4 * dimm);
- for(current_rank = start_rank; current_rank < start_rank + num_ranks_array[port][dimm]; current_rank++) {
- FAPI_INF( "+++++++++++++++ Sending zqcal to port: %d rank: %d +++++++++++++++", port, current_rank);
- buffer_rc = buffer_rc | test_buffer_4.setBit(1);
- buffer_rc = buffer_rc | num_idles_buffer_16.setHalfWord(0,0x0400);
- if(buffer_rc)
- {
- FAPI_ERR( "Error setting up buffers");
- return buffer_rc;
- }
- //Need to add cal_timer_cnt_mult to CCS_MODE func
- rc = mss_ccs_mode(target, stop_on_err_buffer_1, ue_disable_buffer_1, data_sel_buffer_2, pclk_buffer_2, nclk_buffer_2, cal_time_cnt_buffer_16, resetn_buffer_1, reset_recover_buffer_1, copy_spare_cke_buffer_1);
+ rc = mss_execute_zq_cal(i_target, port);
+ if(rc) return rc;
+ }
+
+ //Set up for Init Cal - Done per port pair
+ rc_num = rc_num | test_buffer_4.setBit(0, 2); //Init Cal test = 11XX
+ rc_num = rc_num | wen_buffer_1.flushTo1(); //Init Cal ras/cas/we = 1/1/1
+ rc_num = rc_num | casn_buffer_1.flushTo1();
+ rc_num = rc_num | rasn_buffer_1.flushTo1();
+ rc_num = rc_num | ddr_cal_enable_buffer_1.flushTo1(); //Init cal
+ if(rc_num)
+ {
+ rc.setEcmdError(rc_num);
+ return rc;
+ }
+
+ for(group = 0; group < MAX_NUM_GROUP; group++)
+ {
+ if((primary_ranks_array[group][0] != INVALID) || (primary_ranks_array[group][1] != INVALID))
+ {
+ //Check if rank group exists
+ FAPI_INF( "+++++++++++++++ Sending init cal on rank group: %d +++++++++++++++", group);
+ rc = mss_ccs_inst_arry_0(i_target, instruction_number, address_buffer_16, bank_buffer_8, activate_buffer_1, rasn_buffer_1, casn_buffer_1, wen_buffer_1, cke_buffer_8, csn_buffer_8, odt_buffer_8, test_buffer_4, 0);
+ if(rc) return rc; //Error handling for mss_ccs_inst built into mss_funcs
+ if(primary_ranks_array[group][0] == INVALID)
+ {
+ rc_num = rc_num | rank_cal_buffer_3.insert(primary_ranks_array[group][1], 0, 3, 0);
+ }
+ else
+ {
+ rc_num = rc_num | rank_cal_buffer_3.insert(primary_ranks_array[group][0], 0, 3, 0);
+ }
+ rc = mss_ccs_inst_arry_1(i_target, instruction_number, num_idles_buffer_16, num_repeat_buffer_16, data_buffer_20, read_compare_buffer_1, rank_cal_buffer_3, ddr_cal_enable_buffer_1, ccs_end_buffer_1);
+ if(rc) return rc; //Error handling for mss_ccs_inst built into mss_funcs
+ FAPI_INF( "+++++++++++++++ Execute CCS array +++++++++++++++");
+ rc = mss_execute_ccs_inst_array( i_target, NUM_POLL, 60);
+ if(rc) return rc; //Error handling for mss_ccs_inst built into mss_funcs
+ for(port = 0; port < 2; port++)
+ {
+ rc = mss_check_cal_status(i_target, port, group);
if(rc) return rc;
- buffer_rc = buffer_rc | csn_buffer_8.flushTo1();
- buffer_rc = buffer_rc | csn_buffer_8.clearBit(current_rank);
- if(buffer_rc)
- {
- FAPI_ERR( "Error setting up buffers");
- return buffer_rc;
- }
- if(instruction_number == 28)
- {
- //CCS array is full. Issue execute.
- FAPI_INF( "+++++++++++++++ Execute CCS array on port: %d +++++++++++++++", port);
- buffer_rc = buffer_rc | ccs_end_buffer_1.flushTo1();
- buffer_rc = buffer_rc | bank_buffer_8.flushTo0();
- buffer_rc = buffer_rc | activate_buffer_1.flushTo0();
- buffer_rc = buffer_rc | cke_buffer_8.flushTo1();
- buffer_rc = buffer_rc | odt_buffer_8.flushTo0();
- if(buffer_rc)
- {
- FAPI_ERR( "Error setting up buffers");
- return buffer_rc;
- }
- rc = mss_ccs_inst_arry_0(target, instruction_number, address_buffer_16, bank_buffer_8, activate_buffer_1, rasn_buffer_1, casn_buffer_1, wen_buffer_1, cke_buffer_8, csn_buffer_8, odt_buffer_8, test_buffer_4, port);
- if(rc) return rc;
- rc = mss_ccs_inst_arry_1(target, instruction_number, num_idles_buffer_16, num_repeat_buffer_16, data_buffer_20, read_compare_buffer_1, rank_cal_buffer_3, ddr_cal_enable_buffer_1, ccs_end_buffer_1);
- if(rc) return rc;
- rc = mss_execute_ccs_inst_array(target, NUM_POLL, 60);
- if(rc) return rc;
- instruction_number = 0;
- }
- else
- {
- buffer_rc = buffer_rc | ccs_end_buffer_1.flushTo0();
- rc = mss_ccs_inst_arry_0(target, instruction_number, address_buffer_16, bank_buffer_8, activate_buffer_1, rasn_buffer_1, casn_buffer_1, wen_buffer_1, cke_buffer_8, csn_buffer_8, odt_buffer_8, test_buffer_4, port);
- if(rc) return rc;
- rc = mss_ccs_inst_arry_1(target, instruction_number, num_idles_buffer_16, num_repeat_buffer_16, data_buffer_20, read_compare_buffer_1, rank_cal_buffer_3, ddr_cal_enable_buffer_1, ccs_end_buffer_1);
- if(rc) return rc;
- }
- instruction_number++;
}
- }
- buffer_rc = buffer_rc | test_buffer_4.setBit(0, 2);
- buffer_rc = buffer_rc | num_idles_buffer_16.flushTo1();
- buffer_rc = buffer_rc | odt_buffer_8.flushTo0();
- buffer_rc = buffer_rc | csn_buffer_8.flushTo1();
- buffer_rc = buffer_rc | cke_buffer_8.flushTo1();
- buffer_rc = buffer_rc | wen_buffer_1.flushTo1();
- buffer_rc = buffer_rc | casn_buffer_1.flushTo1();
- buffer_rc = buffer_rc | rasn_buffer_1.flushTo1();
- buffer_rc = buffer_rc | activate_buffer_1.flushTo0();
- buffer_rc = buffer_rc | bank_buffer_8.flushTo0();
- buffer_rc = buffer_rc | address_buffer_16.flushTo0();
- if(buffer_rc)
- {
- FAPI_ERR( "Error setting up buffers");
- return buffer_rc;
}
+ }
+ return rc;
+}
+ReturnCode mss_check_cal_status(
+ Target& i_target,
+ uint8_t i_port,
+ uint8_t i_group
+ ) {
+ ecmdDataBufferBase cal_status_buffer_64(64);
+ ecmdDataBufferBase cal_error_buffer_64(64);
+ uint8_t cal_status_reg_offset = 0;
+ uint8_t cal_error_reg_offset = 0;
+ cal_status_reg_offset = 48 + i_group;
+ cal_error_reg_offset = 60 + i_group;
+ uint8_t poll_count = 1;
- for(uint32_t group = 0; group < MAX_NUM_GROUP; group++)
+ ReturnCode rc;
+
+ FAPI_INF( "+++++++++++++++ Check Cal Status on port: %d rank group: %d +++++++++++++++", i_port, i_group);
+ if(i_port == 0)
+ {
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_STATUS_P0_0x8000C0190301143F, cal_status_buffer_64);
+ if(rc) return rc;
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_ERROR_P0_0x8000C0180301143F, cal_error_buffer_64);
+ if(rc) return rc;
+ }
+ else
+ {
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_STATUS_P1_0x8001C0190301143F, cal_status_buffer_64);
+ if(rc) return rc;
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_ERROR_P1_0x8001C0180301143F, cal_error_buffer_64);
+ if(rc) return rc;
+ }
+ while((!cal_status_buffer_64.isBitSet(cal_status_reg_offset)) && (!cal_error_buffer_64.isBitSet(cal_error_reg_offset)) && (poll_count <= 5))
+ {
+ FAPI_INF( "+++++++++++++++ Calibration on port: %d rank group: %d in progress. Poll count: %d +++++++++++++++", i_port, i_group, poll_count);
+ poll_count++;
+ if(i_port == 0)
{
- if(primary_ranks_array[group][port] != INVALID)
- {
- //Check if rank group exists
- FAPI_INF( "+++++++++++++++ Sending init cal to port %d rank group: %d +++++++++++++++", port, group);
- if(instruction_number == 28)
- {
- //CCS array is full. Issue execute.
- //Reset CCS array and start populating instructions
- buffer_rc = buffer_rc | ccs_end_buffer_1.flushTo1();
- rc = mss_ccs_inst_arry_0(target, instruction_number, address_buffer_16, bank_buffer_8, activate_buffer_1, rasn_buffer_1, casn_buffer_1, wen_buffer_1, cke_buffer_8, csn_buffer_8, odt_buffer_8, test_buffer_4, port);
- if(rc) return rc;
- buffer_rc = buffer_rc | rank_cal_buffer_3.insert(primary_ranks_array[group][port], 0, 3, 0);
- rc = mss_ccs_inst_arry_1(target, instruction_number, num_idles_buffer_16, num_repeat_buffer_16, data_buffer_20, read_compare_buffer_1, rank_cal_buffer_3, ddr_cal_enable_buffer_1, ccs_end_buffer_1);
- if(rc) return rc;
- FAPI_INF( "+++++++++++++++ Execute CCS array on port: %d +++++++++++++++", port);
- rc = mss_execute_ccs_inst_array( target, NUM_POLL, 60);
- if(rc) return rc;
- instruction_number = 0;
- }
- else
- {
- buffer_rc = buffer_rc | ccs_end_buffer_1.flushTo0();
- rc = mss_ccs_inst_arry_0(target, instruction_number, address_buffer_16, bank_buffer_8, activate_buffer_1, rasn_buffer_1, casn_buffer_1, wen_buffer_1, cke_buffer_8, csn_buffer_8, odt_buffer_8, test_buffer_4, port);
- if(rc) return rc;
- buffer_rc = buffer_rc | rank_cal_buffer_3.insert(primary_ranks_array[group][port], 0, 3, 0);
- rc = mss_ccs_inst_arry_1(target, instruction_number, num_idles_buffer_16, num_repeat_buffer_16, data_buffer_20, read_compare_buffer_1, rank_cal_buffer_3, ddr_cal_enable_buffer_1, ccs_end_buffer_1);
- if(rc) return rc;
- }
- instruction_number++;
- }
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_STATUS_P0_0x8000C0190301143F, cal_status_buffer_64);
+ if(rc) return rc;
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_ERROR_P0_0x8000C0180301143F, cal_error_buffer_64);
+ if(rc) return rc;
}
- if(instruction_number > 0)
+ else
{
- //execute CCS array even though it's not full before moving on to the next port.
- buffer_rc = buffer_rc | ccs_end_buffer_1.flushTo1();
- buffer_rc = buffer_rc | ddr_cal_enable_buffer_1.flushTo0();
- if(buffer_rc)
- {
- FAPI_ERR( "Error setting up buffers");
- return buffer_rc;
- }
- rc = mss_ccs_inst_arry_0(target, instruction_number, address_buffer_16, bank_buffer_8, activate_buffer_1, rasn_buffer_1, casn_buffer_1, wen_buffer_1, cke_buffer_8, csn_buffer_8, odt_buffer_8, test_buffer_4, port);
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_STATUS_P1_0x8001C0190301143F, cal_status_buffer_64);
if(rc) return rc;
- buffer_rc = buffer_rc | rank_cal_buffer_3.flushTo0();
- rc = mss_ccs_inst_arry_1(target, instruction_number, num_idles_buffer_16, num_repeat_buffer_16, data_buffer_20, read_compare_buffer_1, rank_cal_buffer_3, ddr_cal_enable_buffer_1, ccs_end_buffer_1);
+ rc = fapiGetScom(i_target, DPHY01_DDRPHY_PC_INIT_CAL_ERROR_P1_0x8001C0180301143F, cal_error_buffer_64);
if(rc) return rc;
- FAPI_INF( "+++++++++++++++ Execute CCS array on port: %d +++++++++++++++", port);
- rc = mss_execute_ccs_inst_array( target, NUM_POLL, 60);
- if(rc) return rc;
- instruction_number = 0;
- buffer_rc = buffer_rc | ddr_cal_enable_buffer_1.flushTo1();
- buffer_rc = buffer_rc | ccs_end_buffer_1.flushTo0();
- if(buffer_rc)
- {
- FAPI_ERR( "Error setting up buffers");
- return buffer_rc;
- }
-
- }
- }
- for(port = 0; port < 2; port++)
+ }
+ }
+ if(cal_error_buffer_64.isBitSet(cal_error_reg_offset))
+ {
+ //Should it be changed to FAPI_ERR once integrated to xml file. Using FAPI_INF so procedure moves to next group before erroring out.
+ FAPI_ERR( "+++++++++++++++ Calibration on port: %d rank group: %d failed! +++++++++++++++", i_port, i_group);
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_PLACE_HOLDER_ERROR);
+ //FAPI_SET_HWP_ERROR(rc, RC_MSS_INIT_CAL_FAILED);
+ if(cal_error_buffer_64.isBitSet(48))
+ {
+ FAPI_ERR( "+++++++++++++++ Write leveling error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(50))
+ {
+ FAPI_ERR( "+++++++++++++++ DQS Alignment error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(51))
+ {
+ FAPI_ERR( "+++++++++++++++ RDCLK to SysClk alignment error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(52))
+ {
+ FAPI_ERR( "+++++++++++++++ Read centering error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(53))
+ {
+ FAPI_ERR( "+++++++++++++++ Write centering error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(55))
+ {
+ FAPI_ERR( "+++++++++++++++ Coarse read centering error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(56))
+ {
+ FAPI_ERR( "+++++++++++++++ Custom pattern read centering error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(57))
+ {
+ FAPI_ERR( "+++++++++++++++ Custom pattern write centering error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ if(cal_error_buffer_64.isBitSet(58))
+ {
+ FAPI_ERR( "+++++++++++++++ Digital eye error occured on port: %d rank group: %d! +++++++++++++++", i_port, i_group);
+ }
+ }
+ else
{
- FAPI_INF( "+++++++++++++++ Check Cal Status on port: %d (PLACE HOLDER!) +++++++++++++++", port);
+ if(cal_status_buffer_64.isBitSet(cal_status_reg_offset))
+ {
+ FAPI_INF( "+++++++++++++++ Calibration on port: %d rank group: %d was successful! +++++++++++++++", i_port, i_group);
+ }
+ else
+ {
+ FAPI_ERR( "+++++++++++++++ Calibration on port: %d rank group: %d has stalled! +++++++++++++++", i_port, i_group);
+ //Should it be changed to FAPI_ERR once integrated to xml file. Using FAPI_INF so procedure moves to next group before erroring out.
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_PLACE_HOLDER_ERROR);
+ }
}
- return rc;
+ return rc;
}
+
} //end extern C
diff --git a/src/usr/hwpf/hwp/dram_training/mss_funcs.C b/src/usr/hwpf/hwp/dram_training/mss_funcs.C
index 01cb3f1b8..0a05cb6f7 100644
--- a/src/usr/hwpf/hwp/dram_training/mss_funcs.C
+++ b/src/usr/hwpf/hwp/dram_training/mss_funcs.C
@@ -42,6 +42,10 @@
//------------------------------------------------------------------------------
// Version:| Author: | Date: | Comment:
//---------|----------|---------|-----------------------------------------------
+// 1.26 | divyakum | 3/22/12 | Fixed warnings from mss_execute_zq_cal function
+// 1.26 | divyakum | 3/22/12 | Fixed mss_execute_zq_cal function variable name mismatch
+// 1.25 | divyakum | 3/21/12 | Added mss_execute_zq_cal function
+// 1.24 | jdsloat | 3/20/12 | ccs_inst_arry0 bank fields reverse function removed
// 1.23 | jdsloat | 3/05/12 | ccs_inst_arry0 address fields reversed - needed to delete commented code out
// 1.22 | jdsloat | 2/17/12 | ccs_inst_arry0 address fields reversed
// 1.21 | jdsloat | 2/17/12 | FAPI ERRORs uncommented
@@ -79,6 +83,7 @@
#include <fapi.H>
#include <mss_funcs.H>
+#include <cen_scom_addresses.H>
using namespace fapi;
ReturnCode mss_ccs_set_end_bit(
@@ -162,7 +167,6 @@ ReturnCode mss_ccs_inst_arry_0(
}
//Placing bits into the data buffer
- i_bank.reverse();
rc_num = rc_num | data_buffer.insert( i_address, 0, 16, 0);
rc_num = rc_num | data_buffer.insert( i_bank, 17, 3, 0);
rc_num = rc_num | data_buffer.insert( i_activate, 20, 1, 0);
@@ -517,3 +521,109 @@ ReturnCode mss_rcd_parity_check(
return rc;
}
+
+//ZQ Cal
+ReturnCode mss_execute_zq_cal(
+ Target& i_target,
+ uint8_t i_port
+ )
+{
+ //Enums and Constants
+ enum size
+ {
+ MAX_NUM_DIMM = 2,
+ };
+
+ uint32_t NUM_POLL = 100;
+
+ uint32_t instruction_number = 0;
+ ReturnCode rc;
+ uint32_t rc_num = 0;
+
+ ecmdDataBufferBase address_buffer_16(16);
+ rc_num = rc_num | address_buffer_16.setHalfWord(0, 0x0020); //Set A10 bit for ZQCal Long
+ ecmdDataBufferBase bank_buffer_8(8);
+ rc_num = rc_num | bank_buffer_8.flushTo0();
+ ecmdDataBufferBase activate_buffer_1(1);
+ rc_num = rc_num | activate_buffer_1.flushTo0();
+ ecmdDataBufferBase rasn_buffer_1(1);
+ rc_num = rc_num | rasn_buffer_1.flushTo1(); //For ZQCal rasn = 1; casn = 1; wen = 0;
+ ecmdDataBufferBase casn_buffer_1(1);
+ rc_num = rc_num | casn_buffer_1.flushTo1();
+ ecmdDataBufferBase wen_buffer_1(1);
+ rc_num = rc_num | wen_buffer_1.flushTo0();
+ ecmdDataBufferBase cke_buffer_8(8);
+ rc_num = rc_num | cke_buffer_8.flushTo1();
+ ecmdDataBufferBase csn_buffer_8(8);
+ ecmdDataBufferBase odt_buffer_8(8);
+ rc_num = rc_num | odt_buffer_8.flushTo0();
+ ecmdDataBufferBase test_buffer_4(4);
+ rc_num = rc_num | test_buffer_4.flushTo0(); // 01XX:External ZQ calibration
+ rc_num = rc_num | test_buffer_4.setBit(1);
+ ecmdDataBufferBase num_idles_buffer_16(16);
+ rc_num = rc_num | num_idles_buffer_16.setHalfWord(0, 0x0400); //1024 for ZQCal
+ ecmdDataBufferBase num_repeat_buffer_16(16);
+ rc_num = rc_num | num_repeat_buffer_16.flushTo0();
+ ecmdDataBufferBase data_buffer_20(20);
+ rc_num = rc_num | data_buffer_20.flushTo0();
+ ecmdDataBufferBase read_compare_buffer_1(1);
+ rc_num = rc_num | read_compare_buffer_1.flushTo0();
+ ecmdDataBufferBase rank_cal_buffer_3(3);
+ rc_num = rc_num | rank_cal_buffer_3.flushTo0();
+ ecmdDataBufferBase ddr_cal_enable_buffer_1(1);
+ rc_num = rc_num | ddr_cal_enable_buffer_1.flushTo0();
+ ecmdDataBufferBase ccs_end_buffer_1(1);
+ rc_num = rc_num | ccs_end_buffer_1.flushTo1();
+
+ ecmdDataBufferBase stop_on_err_buffer_1(1);
+ rc_num = rc_num | stop_on_err_buffer_1.flushTo0();
+ ecmdDataBufferBase resetn_buffer_1(1);
+ rc_num = rc_num | resetn_buffer_1.setBit(0);
+ ecmdDataBufferBase data_buffer_64(64);
+ rc_num = rc_num | data_buffer_64.flushTo0();
+
+ uint8_t current_rank = 0;
+ uint8_t start_rank = 0;
+ uint8_t num_ranks_array[2][2]; //num_ranks_array[port][dimm]
+
+ rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target, num_ranks_array);
+ if(rc) return rc;
+
+ //Set up CCS Mode Reg for ZQ cal long and Init cal
+ rc = fapiGetScom(i_target, MEM_MBA01_CCS_MODEQ_0x030106A7, data_buffer_64);
+ rc_num = rc_num | data_buffer_64.insert(stop_on_err_buffer_1, 0, 1, 0);
+ rc_num = rc_num | data_buffer_64.insert(resetn_buffer_1, 24, 1, 0);
+ if(rc_num)
+ {
+ rc.setEcmdError(rc_num);
+ return rc;
+ }
+ rc = fapiPutScom(i_target, MEM_MBA01_CCS_MODEQ_0x030106A7, data_buffer_64);
+ if(rc) return rc;
+
+ for(uint8_t dimm = 0; dimm < MAX_NUM_DIMM; dimm++)
+ {
+ start_rank=(4 * dimm);
+ for(current_rank = start_rank; current_rank < start_rank + num_ranks_array[i_port][dimm]; current_rank++) {
+ FAPI_INF( "+++++++++++++++ Sending zqcal to port: %d rank: %d +++++++++++++++", i_port, current_rank);
+ rc_num = rc_num | csn_buffer_8.flushTo1();
+ rc_num = rc_num | csn_buffer_8.clearBit(current_rank);
+ if(rc_num)
+ {
+ rc.setEcmdError(rc_num);
+ return rc;
+ }
+
+ //Issue execute.
+ FAPI_INF( "+++++++++++++++ Execute CCS array on port: %d +++++++++++++++", i_port);
+ rc = mss_ccs_inst_arry_0(i_target, instruction_number, address_buffer_16, bank_buffer_8, activate_buffer_1, rasn_buffer_1, casn_buffer_1, wen_buffer_1, cke_buffer_8, csn_buffer_8, odt_buffer_8, test_buffer_4, i_port);
+ if(rc) return rc; //Error handling for mss_ccs_inst built into mss_funcs
+ rc = mss_ccs_inst_arry_1(i_target, instruction_number, num_idles_buffer_16, num_repeat_buffer_16, data_buffer_20, read_compare_buffer_1, rank_cal_buffer_3, ddr_cal_enable_buffer_1, ccs_end_buffer_1);
+ if(rc) return rc; //Error handling for mss_ccs_inst built into mss_funcs
+ rc = mss_execute_ccs_inst_array(i_target, NUM_POLL, 60);
+ if(rc) return rc; //Error handling for mss_ccs_inst built into mss_funcs
+ }
+ }
+return rc;
+}
+
diff --git a/src/usr/hwpf/hwp/dram_training/mss_funcs.H b/src/usr/hwpf/hwp/dram_training/mss_funcs.H
index 84143c3ff..6046e10aa 100644
--- a/src/usr/hwpf/hwp/dram_training/mss_funcs.H
+++ b/src/usr/hwpf/hwp/dram_training/mss_funcs.H
@@ -42,6 +42,7 @@
//------------------------------------------------------------------------------
// Version:| Author: | Date: | Comment:
//---------|----------|---------|-----------------------------------------------
+// 1.11 | 3/21/12 | divyakum| Added mss_execute_zq_cal function
// 1.10 | 2/14/12 | jdsloat | Comment section filled in, elimated unnecessary constant, added enums
// 1.9 | 2/08/12 | jdsloat | Target to Target&
// 1.8 | 2/02/12 | jdsloat | Added fapi:: to arguments in function prototypes
@@ -200,5 +201,14 @@ fapi::ReturnCode mss_rcd_parity_check(fapi::Target& i_target,
uint32_t mss_reverse_32bits( uint32_t i_x);
uint8_t mss_reverse_8bits(uint8_t i_number);
+
+//-----------------------------------------
+// mss_execute_zq_cal
+// execute init ZQ Cal on given target and port
+// Target = centaur.mba
+//-----------------------------------------
+fapi::ReturnCode mss_execute_zq_cal(fapi::Target& i_target,
+ uint8_t i_port);
+
#endif /* _MSS_FUNCS_H */
OpenPOWER on IntegriCloud