diff options
| author | Mike Jones <mjjones@us.ibm.com> | 2012-05-07 11:27:58 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-05-07 11:40:22 -0500 |
| commit | ca1f509428df6418258b8e16b30b49265fd33817 (patch) | |
| tree | 85dd9116b78ac765dad2c8d052ca9c4aa8f7bce7 /src/usr | |
| parent | 3b10539019cc09589ba0dfdacc97ba8c206f540e (diff) | |
| download | blackbird-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.C | 395 | ||||
| -rw-r--r-- | src/usr/hwpf/hwp/dram_training/mss_funcs.C | 112 | ||||
| -rw-r--r-- | src/usr/hwpf/hwp/dram_training/mss_funcs.H | 10 |
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 */ |

