diff options
Diffstat (limited to 'src/usr/hwpf')
5 files changed, 221 insertions, 1661 deletions
diff --git a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.C b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.C index 4e1a00b51..83abd1f5a 100644 --- a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.C +++ b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.C @@ -21,7 +21,7 @@ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: mss_generic_shmoo.C,v 1.47 2013/04/25 12:14:00 sasethur Exp $ +// $Id: mss_generic_shmoo.C,v 1.45 2013/04/23 13:57:28 sasethur Exp $ // *!*************************************************************************** // *! (C) Copyright International Business Machines Corp. 1997, 1998 // *! All Rights Reserved -- Property of IBM @@ -40,15 +40,17 @@ //------------------------------------------------------------------------------ // Version:|Author: | Date: | Comment: // --------|--------|---------|-------------------------------------------------- -// 1.45 |abhijit |04/25/13 | added test type SIMPLE_FIX_RF and SHMOO_STRESS -// 1.40 |abhijit |03/22/13 | Fixed boundary checks -// 1.38 |abhijit |03/19/13 | included spare byte and ECC and fixed printing for RD_EYE -// 1.36 |abhijit |03/19/13 | changed mcbist call position -// 1.35 |abhijit |03/16/13 | fixed clearing of error map regs for mba23 -// 1.32 |abhijit |03/12/13 | new parallel schmoo under dev -// 1.27 |abhijit |01/21/13 | fixed ISDIMM mapping need some workaround -// 1.26 |abhijit |01/21/13 | fixed fw comments -// 1.25 |abhijit |01/21/13 | fixed the constructor definition +// 1.44 |bellows |04/22/13 | fixed fw comments +// 1.43 |bellows |04/11/13 | quick fix for firmware delivery. Uninitialized varialbles: i_mcbtest, i_mcbpatt +// 1.42 |abhijit |04/09/13 | added shmoo param +// 1.40 |abhijit |03/22/13 | Fixed boundary checks +// 1.38 |abhijit |03/19/13 | included spare byte and ECC and fixed printing for RD_EYE +// 1.36 |abhijit |03/19/13 | changed mcbist call position +// 1.35 |abhijit |03/16/13 | fixed clearing of error map regs for mba23 +// 1.32 |abhijit |03/12/13 | new parallel schmoo under dev +// 1.27 |abhijit |01/21/13 | fixed ISDIMM mapping need some workaround +// 1.26 |abhijit |01/21/13 | fixed fw comments +// 1.25 |abhijit |01/21/13 | fixed the constructor definition // 1.21 |sasethur|01/17/13 | Updated for sanity mcbist function // 1.20 |abhijit |01/11/13 | Updated for change in setup_mcbist function // 1.19 |aditya |01/07/13 | Updated for change in setup_mcbist function @@ -59,8 +61,8 @@ // 1.12 |abhijit |15-Nov-12| Fixed FW review comments // 1.11 |abhijit |29-Oct-12| added change for ISDIMM checker DQS. // 1.9 |abhijit |22-Oct-12| added Write and read DQS. -// 1.8 |abhijit |15-Oct-12| Updated multiple changes -// 1.0 |varkeykv|27-Sep-11| Initial check in +// 1.8 |abhijit |15-Oct-12|Updated multiple changes +// 1.0 |varkeykv|27-Sep-11|Initial check in //------------------------------------------------------------------------------ #include <fapi.H> #include "mss_generic_shmoo.H" @@ -80,7 +82,7 @@ using namespace fapi; * constructor: generic_shmoo * Description :Constructor used to initialize variables and do the initial settings * - * Parameters: i_target: mba; iv_port: 0, 1 + * Parameters: i_target: mba; iv_port: 0, 1 * ---------------------------------------------------------------------------*/ generic_shmoo:: generic_shmoo(uint8_t addr,shmoo_type_t shmoo_mask,shmoo_algorithm_t shmoo_algorithm) { @@ -95,8 +97,8 @@ generic_shmoo:: generic_shmoo(uint8_t addr,shmoo_type_t shmoo_mask,shmoo_algorit iv_pattern=0; iv_test_type=0; iv_dmm_type=0; - iv_shmoo_param=0; - + iv_shmoo_param=0; + for(int p=0;p<MAX_PORT;++p) { for(int i=0;i<iv_MAX_RANKS[p];++i) @@ -127,22 +129,22 @@ generic_shmoo:: generic_shmoo(uint8_t addr,shmoo_type_t shmoo_mask,shmoo_algorit if(shmoo_mask & WR_EYE) { FAPI_DBG("mss_generic_shmoo : WR_EYE selected %d",shmoo_mask); - iv_shmoo_type = 2; + iv_shmoo_type = 0; SHMOO[0].static_knob.min_val=0; SHMOO[0].static_knob.max_val=512; } if(shmoo_mask & RD_EYE) { FAPI_DBG("mss_generic_shmoo : RD_EYE selected %d",shmoo_mask); - iv_shmoo_type = 8; + iv_shmoo_type = 2; SHMOO[2].static_knob.min_val=2; SHMOO[2].static_knob.max_val=128; } if(shmoo_mask & WRT_DQS) //preet { - FAPI_INF("mss_generic_shmoo : WRT_DQS selected %d",shmoo_mask); - iv_shmoo_type = 4; + FAPI_DBG("mss_generic_shmoo : WRT_DQS selected %d",shmoo_mask); + iv_shmoo_type = 1; iv_DQS_ON = 1; SHMOO[1].static_knob.min_val=0; SHMOO[1].static_knob.max_val=512; @@ -162,34 +164,28 @@ generic_shmoo:: generic_shmoo(uint8_t addr,shmoo_type_t shmoo_mask,shmoo_algorit for(int j=0;j<iv_MAX_RANKS[i];++j) { init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.nom_val,0); - init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.right_err_cnt,0); - init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.left_err_cnt,0); init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.lb_regval,SHMOO[iv_shmoo_type].static_knob.min_val); init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.rb_regval,SHMOO[iv_shmoo_type].static_knob.max_val); - init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.lb_regval,20); - init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.rb_regval,300); init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.total_margin,0); init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.right_margin_val,0); init_multi_array(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.left_margin_val,0); } } - // if(iv_DQS_ON == 1) - // { for(int i=0;i<MAX_PORT;++i) - // { - // for(int j=0;j<iv_MAX_RANKS[i];++j) //initialize values for DQS - // { - // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.nom_val,0); - // // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.lb_regval,SHMOO[iv_shmoo_type].static_knob.min_val); - // // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.rb_regval,SHMOO[iv_shmoo_type].static_knob.max_val); - // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.lb_regval,20); - // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.rb_regval,300); - // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.total_margin,0); - // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.right_margin_val,0); - // init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.left_margin_val,0); - // } - // } - // } + if(iv_DQS_ON == 1) + { for(int i=0;i<MAX_PORT;++i) + { + for(int j=0;j<iv_MAX_RANKS[i];++j) //initialize values for DQS + { + init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.nom_val,0); + init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.lb_regval,SHMOO[iv_shmoo_type].static_knob.min_val); + init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.rb_regval,SHMOO[iv_shmoo_type].static_knob.max_val); + init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.total_margin,0); + init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.right_margin_val,0); + init_multi_array_dqs(SHMOO[iv_shmoo_type].MBA.P[i].S[j].K.left_margin_val,0); + } + } + } } /*------------------------------------------------------------------------------ @@ -207,17 +203,12 @@ fapi::ReturnCode generic_shmoo::run(const fapi::Target & i_target,uint32_t *o_ri iv_shmoo_param=i_shmoo_param; ecmdDataBufferBase l_data_buffer1_64(64); - uint8_t l_dram_width=0; - - rc = FAPI_ATTR_GET(ATTR_EFF_DRAM_WIDTH, &i_target, l_dram_width); if(rc) return rc; rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target, num_ranks_per_dimm); if(rc) return rc; rc = FAPI_ATTR_GET(ATTR_EFF_DIMM_TYPE, &i_target, l_attr_eff_dimm_type_u8); if(rc) return rc; rc = FAPI_ATTR_GET(ATTR_EFF_SCHMOO_TEST_VALID, &i_target, l_attr_schmoo_test_type_u8); if(rc) return rc; - - iv_MAX_RANKS[0]=num_ranks_per_dimm[0][0]+num_ranks_per_dimm[0][1]; iv_MAX_RANKS[1]=num_ranks_per_dimm[1][0]+num_ranks_per_dimm[1][1]; @@ -249,34 +240,7 @@ fapi::ReturnCode generic_shmoo::run(const fapi::Target & i_target,uint32_t *o_ri FAPI_ERR("generic_shmoo::run MSS Generic Shmoo failed initial Sanity Check. Memory not in an all pass Condition"); return rc; } - }else if(l_attr_schmoo_test_type_u8 == 4){ - - iv_shmoo_type=4; - //FAPI_INF("\n ABHIJIT IS HERE 1111 \n"); - rc=get_all_noms_dqs(i_target);if(rc) return rc; - iv_shmoo_type=2; - //FAPI_INF("\n ABHIJIT IS HERE 2222 \n"); - rc=get_all_noms(i_target);if(rc) return rc; - rc=schmoo_setup_mcb(i_target);if(rc) return rc; - //Find RIGHT BOUND OR SETUP BOUND - rc=find_bound(i_target,RIGHT);if(rc) return rc; - //FAPI_INF("\n ABHIJIT IS HERE 3333 \n"); - //Find LEFT BOUND OR HOLD BOUND - rc=find_bound(i_target,LEFT);if(rc) return rc; - iv_shmoo_type=4; - - if(l_dram_width == 4 ){ - rc=get_margin_dqs_by4(i_target);if(rc) return rc; }else{ - //FAPI_INF("\n ABHIJIT IS HERE 222 \n"); - rc=get_margin_dqs_by8(i_target);if(rc) return rc; - } - //FAPI_INF("\n before the call \n"); - rc=print_report_dqs(i_target);if(rc) return rc; - - - - } else { // rc=sanity_check(i_target); // Run MCBIST by default before for every schmoo to check if memory is in good condition. // if(!rc.ok()) // { @@ -286,7 +250,6 @@ fapi::ReturnCode generic_shmoo::run(const fapi::Target & i_target,uint32_t *o_ri // If memory is OK then we continue to gather nominals and config values // Now Read nominal values for all knobs configured // FAPI_DBG("mss_generic_shmoo : run() :read nominal values "); - rc=get_all_noms(i_target);if(rc) return rc; rc=schmoo_setup_mcb(i_target);if(rc) return rc; //Find RIGHT BOUND OR SETUP BOUND @@ -372,11 +335,6 @@ fapi::ReturnCode generic_shmoo::do_mcbist_test(const fapi::Target & i_target) rc = fapiPutScom(i_target,0x0201176e,l_data_buffer_64); if(rc) return(rc); rc = fapiPutScom(i_target,0x0201176f,l_data_buffer_64); if(rc) return(rc); - rc = fapiPutScom(i_target,MBS_MCBIST01_MCB_ERRCNTA1Q_0x02011664,l_data_buffer_64); if(rc) return(rc); - rc = fapiPutScom(i_target,MBS_MCBIST01_MCB_ERRCNTA2Q_0x02011665,l_data_buffer_64); if(rc) return(rc); - rc = fapiPutScom(i_target,MBS_MCBIST01_MCB_ERRCNTB1Q_0x02011667,l_data_buffer_64); if(rc) return(rc); - rc = fapiPutScom(i_target,MBS_MCBIST01_MCB_ERRCNTB2Q_0x02011668,l_data_buffer_64); if(rc) return(rc); - rc = start_mcb(i_target); if(rc) { @@ -522,83 +480,6 @@ fapi::ReturnCode generic_shmoo::check_error_map(const fapi::Target & i_target,ui } return rc; } - -fapi::ReturnCode generic_shmoo::get_error_cnt(const fapi::Target & i_target,uint8_t port,uint8_t rank,uint8_t rank_pair,uint8_t bit,bound_t bound) -{ -fapi::ReturnCode rc; -uint8_t l_nibble=0; -uint8_t l_start_bit=0; -uint16_t l_err_cnt_C=0; -uint8_t rc_ecmd=0; -uint8_t l_length_buffer=7; -uint8_t l_val=0; - - -input_type l_input_type_e = ISDIMM_DQ; -ecmdDataBufferBase data_buffer_64(64); -ecmdDataBufferBase data_buffer_64_1(64); - -if(iv_dmm_type==1) - { - - //FAPI_INF("\n ISDIMM input byte=%d and nibble=%d and bit returned is %d \n",l_byte,l_nibble,l_val); - rc=rosetta_map(i_target,port,l_input_type_e,bit,0,l_val);if(rc) return rc; - //FAPI_INF("\n ISDIMM input byte=%d and nibble=%d and bit returned is %d \n",l_byte,l_nibble,l_val); - l_nibble=l_val/4; - - }else{ - -l_nibble=bit/4; -} - -if(port==0) - { - if(l_nibble<9) - { - rc = fapiGetScom(i_target,MBS_MCBIST01_MCB_ERRCNTA1Q_0x02011664,data_buffer_64); if(rc) return rc; - l_start_bit=l_nibble*7; - rc_ecmd=data_buffer_64.extractToRight(&l_err_cnt_C,l_start_bit,l_length_buffer);if (rc_ecmd){ rc.setEcmdError(rc_ecmd); return rc;} - } - else - { - rc = fapiGetScom(i_target,MBS_MCBIST01_MCB_ERRCNTA2Q_0x02011665,data_buffer_64); if(rc) return rc; - l_nibble=l_nibble-9; - l_start_bit=l_nibble*7; - rc_ecmd=data_buffer_64.extractToRight(&l_err_cnt_C,l_start_bit,l_length_buffer);if (rc_ecmd){ rc.setEcmdError(rc_ecmd); return rc;} - } - }else - { - if(l_nibble<9) - { - rc = fapiGetScom(i_target,MBS_MCBIST01_MCB_ERRCNTB1Q_0x02011667,data_buffer_64_1); if(rc) return rc; - l_start_bit=l_nibble*7; - rc_ecmd=data_buffer_64.extractToRight(&l_err_cnt_C,l_start_bit,l_length_buffer);if (rc_ecmd){ rc.setEcmdError(rc_ecmd); return rc;} - } - else - { - rc = fapiGetScom(i_target,MBS_MCBIST01_MCB_ERRCNTB2Q_0x02011668,data_buffer_64_1); if(rc) return rc; - l_nibble=l_nibble-9; - l_start_bit=l_nibble*7; - rc_ecmd=data_buffer_64.extractToRight(&l_err_cnt_C,l_start_bit,l_length_buffer);if (rc_ecmd){ rc.setEcmdError(rc_ecmd); return rc;} - } - } - if(bound==RIGHT) - { - if(l_err_cnt_C){ - SHMOO[iv_shmoo_type].MBA.P[port].S[rank].K.right_err_cnt[bit][rank_pair]=l_err_cnt_C; - } - FAPI_INF("\n THE PORT=%d Rank=%d dq=%d and error count=%d \n",port,rank,bit,SHMOO[iv_shmoo_type].MBA.P[port].S[rank].K.right_err_cnt[bit][rank_pair]); - }else { - if(l_err_cnt_C){ - SHMOO[iv_shmoo_type].MBA.P[port].S[rank].K.left_err_cnt[bit][rank_pair]=l_err_cnt_C; -} - FAPI_INF("\n THE PORT=%d Rank=%d dq=%d and error count=%d \n",port,rank,bit,SHMOO[iv_shmoo_type].MBA.P[port].S[rank].K.left_err_cnt[bit][rank_pair]); - } - return rc; - -} - - /*------------------------------------------------------------------------------ * Function: init_multi_array * Description : This function do the initialization of various schmoo parameters @@ -679,12 +560,12 @@ fapi::ReturnCode generic_shmoo::get_all_noms(const fapi::Target & i_target) FAPI_DBG("mss_generic_shmoo : get_all_noms : Reading in all nominal values"); - if(iv_shmoo_type == 4) + if(iv_shmoo_type == 1) { l_input_type_e = WR_DQS; } - else if(iv_shmoo_type == 8) + else if(iv_shmoo_type == 2) { l_input_type_e = RD_DQ; @@ -724,61 +605,6 @@ fapi::ReturnCode generic_shmoo::get_all_noms(const fapi::Target & i_target) return rc; } -fapi::ReturnCode generic_shmoo::get_all_noms_dqs(const fapi::Target & i_target) -{ - fapi::ReturnCode rc; - - uint8_t l_rnk; - //uint8_t i_rnk=0; - uint8_t i_rp=0; - uint32_t val=0; - //uint8_t l_dq=0; - uint8_t l_p=0; - uint8_t l_max_nibble=20; - uint8_t rank=0; - uint8_t l_n=0; - FAPI_INF("mss_generic_shmoo : get_all_noms_dqs : Reading in all nominal values and schmoo type=%d \n",iv_shmoo_type); - if(iv_dmm_type==1) - { - - l_max_nibble=18; - } - - input_type_t l_input_type_e = WR_DQS; - access_type_t l_access_type_e = READ ; - FAPI_DBG("mss_generic_shmoo : get_all_noms : Reading in all nominal values"); - - - if(iv_shmoo_type == 4) - { - l_input_type_e = WR_DQS; - - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rnk=0;l_rnk<iv_MAX_RANKS[l_p];++l_rnk) - {// Byte loop - rc = mss_getrankpair(i_target,l_p,0,&i_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rnk]; - rc = mss_getrankpair(i_target,l_p,rank,&i_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_max_nibble;l_n++){ - - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_n,0,val);if(rc) return rc; - SHMOO[iv_shmoo_type].MBA.P[l_p].S[rank].K.nom_val[l_n][i_rp]=val; - FAPI_INF("Nominal Value for port=%d rank=%d and rank pair=%d and dqs=%d is %d",l_p,rank,i_rp,l_n,SHMOO[iv_shmoo_type].MBA.P[l_p].S[rank].K.nom_val[l_n][i_rp]); - } - } - } - - - - - - return rc; -} - - /*------------------------------------------------------------------------------ * Function: knob_update * Description : This is a key function is used to find right and left bound using new algorithm -- there is an option u can chose not to use it by setting a flag @@ -801,7 +627,7 @@ fapi::ReturnCode generic_shmoo::knob_update(const fapi::Target & i_target,bound_ uint8_t l_p=0; uint16_t l_delay=0; - + //uint32_t l_max=0; uint16_t l_max_limit=500; uint8_t rank=0; uint8_t l_rank=0; @@ -824,7 +650,7 @@ fapi::ReturnCode generic_shmoo::knob_update(const fapi::Target & i_target,bound_ } } - if(scenario == 8) { + if(scenario == 2) { l_input_type_e = RD_DQ; l_max_limit=127; } @@ -848,15 +674,13 @@ fapi::ReturnCode generic_shmoo::knob_update(const fapi::Target & i_target,bound_ rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - //rc=get_error_cnt(i_target,l_p,rank,l_rp,l_dq,bound); if(schmoo_error_map[l_p][rank][l_n]==0){ SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - //rc=get_error_cnt(i_target,l_p,rank,l_rp,l_dq); - //get_error_cnt(const fapi::Target & i_target,uint8_t port,uint8_t rank,uint8_t rank_pair,uint8_t bit) + } if(SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]>l_max_limit){ @@ -877,7 +701,7 @@ fapi::ReturnCode generic_shmoo::knob_update(const fapi::Target & i_target,bound_ FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); return rc; } - //rc=get_error_cnt(i_target,l_p,rank,l_rp,l_dq); + rc=check_error_map(i_target,l_p,pass); if(rc) { @@ -922,7 +746,7 @@ fapi::ReturnCode generic_shmoo::knob_update(const fapi::Target & i_target,bound_ for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ //l_max=SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]; - //rc=get_error_cnt(i_target,l_p,rank,l_rp,l_dq,bound); + if(schmoo_error_map[l_p][rank][l_n]==0){ SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; @@ -984,1146 +808,96 @@ rc=check_error_map(i_target,l_p,pass); * Description : This is a key function is used to find right and left bound using new algorithm -- there is an option u can chose not to use it by setting a flag * * Parameters: Target:MBA,bound:RIGHT/LEFT,scenario:type of schmoo,iv_port:0/1,rank:0-7,byte:0-7,nibble:0/1,bit:0-3,pass, - * --------------------------------------------------------------------------- */ -fapi::ReturnCode generic_shmoo::knob_update_dqs_by4(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag) -{ + * --------------------------------------------------------------------------- +fapi::ReturnCode generic_shmoo::knob_update_dqs(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t rank,uint8_t byte,uint8_t nibble,uint8_t bit,uint8_t pass) +{ fapi::ReturnCode rc; ecmdDataBufferBase data_buffer_64(64); ecmdDataBufferBase data_buffer_64_1(64); - - + data_buffer_64.flushTo0(); + data_buffer_64_1.flushTo0(); + uint32_t l_current_val=0; + uint32_t l_max_value=0; + uint32_t l_min_value=0; uint8_t l_rp=0; - input_type_t l_input_type_e = WR_DQ; - input_type_t l_input_type_e_dqs = WR_DQS; + input_type_t l_input_type_e = WR_DQS; uint8_t l_dq=0; access_type_t l_access_type_e = WRITE; - uint8_t l_n=0; - uint8_t l_dqs=4; - - uint8_t l_p=0; - uint16_t l_delay=0; - uint32_t __attribute__((unused)) l_max=0; //SW198827 - uint16_t l_max_limit=500; - uint8_t rank=0; - uint8_t l_rank=0; - uint8_t l_SCHMOO_NIBBLES=20; - uint8_t i_rp=0; - - - - if(iv_dmm_type==1) + if(scenario == 1) { - l_SCHMOO_NIBBLES=18; - } - //rc = mss_getrankpair(i_target,iv_port,rank,&l_rp,valid_rank);if(rc) return rc; - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for(int i=0;i<iv_MAX_RANKS[l_p];i++){ - rc = mss_getrankpair(i_target,l_p,0,&i_rp,valid_rank);if(rc) return rc; - rank=valid_rank[i]; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - schmoo_error_map[l_p][rank][l_n]=0; - } - } - } - - - - - if(bound==RIGHT) - { - - if(algorithm==SEQ_LIN) - { - - - for (l_delay=1;((pass==0));l_delay++){ - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) + l_input_type_e = WR_DQS; + } + else if(scenario == 3) { - l_dq=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - //FAPI_INF("\n abhijit here after port=%d rank=%d \n",l_p,rank); - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - if(schmoo_error_map[l_p][rank][l_n]==0){ - FAPI_INF("\n value of nominal delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_dqs,rank,l_p,l_n,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]); - SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_n][l_rp]=SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_dqs,rank,l_p,l_n,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_n][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,1,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_n][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d bit=%d is %d ",scenario,rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - } - //FAPI_INF("\n abhijit here before \n"); - if(SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]>l_max_limit){ - schmoo_error_map[l_p][rank][l_n]=1; - } - - } - - - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } + l_input_type_e = RD_DQS; + } - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - FAPI_INF("\n restoring nominal values for dqs=%d port=%d rank=%d is %d \n",l_n,l_p,rank,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,1,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - - - } - - } - if(bound==LEFT) { - if(algorithm==SEQ_LIN) - { - - for (l_delay=1;(pass==0);l_delay++){ - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - l_max=SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]; - - - if(schmoo_error_map[l_p][rank][l_n]==0){ - SHMOO[l_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_n][l_rp]=SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]-l_delay; - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,1,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_n][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - } - if(SHMOO[l_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp] == 0){ - schmoo_error_map[l_p][rank][l_n] = 1; - } - - - - } - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - -rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,1,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } - - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - } - - - } - - return rc; -} -fapi::ReturnCode generic_shmoo::knob_update_dqs_by4_isdimm(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag) -{ - fapi::ReturnCode rc; - ecmdDataBufferBase data_buffer_64(64); - ecmdDataBufferBase data_buffer_64_1(64); - - - - uint8_t l_rp=0; - input_type_t l_input_type_e = WR_DQ; - input_type_t l_input_type_e_dqs = WR_DQS; - uint8_t l_dq=0; - access_type_t l_access_type_e = WRITE; - uint8_t l_n=0; - uint8_t l_dqs=4; - uint8_t l_my_dqs=0; - - - uint8_t l_p=0; - uint16_t l_delay=0; - uint32_t __attribute__((unused)) l_max=0; //SW198827 - uint16_t l_max_limit=500; - uint8_t rank=0; - uint8_t l_rank=0; - uint8_t l_SCHMOO_NIBBLES=20; - uint8_t i_rp=0; - - - - if(iv_dmm_type==1) - { - l_SCHMOO_NIBBLES=18; - } - uint8_t l_dqs_arr[18]={0,9,1,10,2,11,3,12,4,13,5,14,6,15,7,16,8,17}; - //rc = mss_getrankpair(i_target,iv_port,rank,&l_rp,valid_rank);if(rc) return rc; - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for(int i=0;i<iv_MAX_RANKS[l_p];i++){ - rc = mss_getrankpair(i_target,l_p,0,&i_rp,valid_rank);if(rc) return rc; - rank=valid_rank[i]; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - schmoo_error_map[l_p][rank][l_n]=0; - } - } - } - - - - if(bound==RIGHT) - { - if(algorithm==SEQ_LIN) - { - - - for (l_delay=1;((pass==0));l_delay++){ - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=0; - l_my_dqs=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - //FAPI_INF("\n abhijit here after port=%d rank=%d \n",l_p,rank); - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - l_my_dqs=l_dqs_arr[l_n]; - if(schmoo_error_map[l_p][rank][l_n]==0){ - FAPI_INF("\n value of nominal delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_dqs,rank,l_p,l_my_dqs,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_my_dqs][l_rp]); - SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_my_dqs][l_rp]=SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_my_dqs][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_dqs,rank,l_p,l_my_dqs,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_my_dqs][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_my_dqs,0,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_my_dqs][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d bit=%d is %d ",scenario,rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - } - //FAPI_INF("\n abhijit here before \n"); - if(SHMOO[l_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]>l_max_limit){ - schmoo_error_map[l_p][rank][l_n]=1; - } - - } - - - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - FAPI_INF("\n restoring nominal values for dqs=%d port=%d rank=%d is %d \n",l_n,l_p,rank,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,0,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } - - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - - - - } - - } - - if(bound==LEFT) - { if(algorithm==SEQ_LIN) { - - for (l_delay=1;(pass==0);l_delay++){ - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=0; - l_my_dqs=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - l_my_dqs=l_dqs_arr[l_n]; - l_max=SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]; - - - if(schmoo_error_map[l_p][rank][l_n]==0){ - SHMOO[l_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_my_dqs][l_rp]=SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_my_dqs][l_rp]-l_delay; - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_my_dqs,0,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_my_dqs][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - } - if(SHMOO[l_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp] == 0){ - schmoo_error_map[l_p][rank][l_n] = 1; - } - - - - } - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - -rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,0,SHMOO[l_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } - - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - } - - - } - - return rc; -} -fapi::ReturnCode generic_shmoo::knob_update_dqs_by8(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag) -{ - fapi::ReturnCode rc; - ecmdDataBufferBase data_buffer_64(64); - ecmdDataBufferBase data_buffer_64_1(64); - - - - uint8_t l_rp=0; - input_type_t l_input_type_e = WR_DQ; - input_type_t l_input_type_e_dqs = WR_DQS; - uint8_t l_dq=0; - uint8_t l_dqs=0; - access_type_t l_access_type_e = WRITE; - uint8_t l_n=0; - uint8_t l_scen_dqs=4; - - - uint8_t l_p=0; - uint16_t l_delay=0; - uint32_t __attribute__((unused)) l_max=0; //SW198827 - uint16_t l_max_limit=500; - uint8_t rank=0; - uint8_t l_rank=0; - uint8_t __attribute__((unused))l_SCHMOO_BYTES=10; //SW198827 - uint8_t l_SCHMOO_NIBBLES=20; - - uint8_t i_rp=0; - - - - - - - if(iv_dmm_type==1) - { - l_SCHMOO_BYTES=9; - l_SCHMOO_NIBBLES=18; - } - //rc = mss_getrankpair(i_target,iv_port,rank,&l_rp,valid_rank);if(rc) return rc; - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for(int i=0;i<iv_MAX_RANKS[l_p];i++){ - rc = mss_getrankpair(i_target,l_p,0,&i_rp,valid_rank);if(rc) return rc; - rank=valid_rank[i]; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - schmoo_error_map[l_p][rank][l_n]=0; - } - } - } - - - - - - - if(bound==RIGHT) - { - - if(algorithm==SEQ_LIN) - { - - - for (l_delay=1;((pass==0));l_delay++){ - - //for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=0; - l_dqs=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - //FAPI_INF("\n abhijit here after port=%d rank=%d \n",l_p,rank); - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - if((schmoo_error_map[l_p][rank][l_n]==0)&&(schmoo_error_map[l_p][rank][l_n+1]==0)){ - FAPI_INF("\n value of nominal delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_scen_dqs,rank,l_p,l_n,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]); - SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_n][l_rp]=SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_scen_dqs,rank,l_p,l_n,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_n][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,0,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_n][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d bit=%d is %d ",scenario,rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - - } - //FAPI_INF("\n abhijit here before \n"); - if(SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]>l_max_limit){ - schmoo_error_map[l_p][rank][l_n]=1; - schmoo_error_map[l_p][rank][l_n+1]=1; - } - if((schmoo_error_map[l_p][rank][l_n]==1)||(schmoo_error_map[l_p][rank][l_n+1]==1)){ - - schmoo_error_map[l_p][rank][l_n]=1; - schmoo_error_map[l_p][rank][l_n+1]=1; - } - - l_n=l_n+1; - l_dqs=l_dqs+1; - } - - - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - FAPI_INF("\n restoring nominal values for dqs=%d port=%d rank=%d is %d \n",l_n,l_p,rank,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,0,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } - - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - - - - } - - } - - if(bound==LEFT) - { - if(algorithm==SEQ_LIN) - { - - for (l_delay=1;(pass==0);l_delay++){ - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=0; - l_dqs=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - l_max=SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]; - - - if((schmoo_error_map[l_p][rank][l_n]==0)&&(schmoo_error_map[l_p][rank][l_n+1]==0)){ - SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_n][l_rp]=SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]-l_delay; - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,0,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_n][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,0,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - } - if(SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp] == 0){ - schmoo_error_map[l_p][rank][l_n] = 1; - schmoo_error_map[l_p][rank][l_n+1] = 1; - } - - if((schmoo_error_map[l_p][rank][l_n]==1)||(schmoo_error_map[l_p][rank][l_n+1]==1)){ - - schmoo_error_map[l_p][rank][l_n]=1; - schmoo_error_map[l_p][rank][l_n+1]=1; - } - - l_n=l_n+1; - l_dqs=l_dq+1; - } - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - -rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - FAPI_INF("\n restoring nominal values for dqs=%d port=%d rank=%d is %d \n",l_n,l_p,rank,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,0,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } - - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - } - + l_min_value=SHMOO[scenario].static_knob.min_val; + FAPI_INF(" curr val in left above = %d and pass=%d ",l_current_val,pass); + for(l_current_val=SHMOO[scenario].MBA.P[iv_port].S[rank].K.nom_val[l_dq][l_rp];((l_current_val >= 20)&&(pass==1));l_current_val-=20) + { + //use saurabh function for writing here + FAPI_INF(" curr val in left = %d and pass=%d ",l_current_val,pass); + rc=mss_access_delay_reg(i_target,l_access_type_e,iv_port,0,l_input_type_e,l_dq,0,l_current_val);if(rc) return rc; + + rc=do_mcbist_test(i_target,rank,byte,nibble,pass); + if(rc) + { + FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); + return rc; + } + } + if(!pass) + { + SHMOO[scenario].MBA.P[iv_port].S[rank].K.lb_regval[l_dq][l_rp]=l_current_val; + } + FAPI_INF(" left bound = %d ",SHMOO[scenario].MBA.P[iv_port].S[rank].K.rb_regval[l_dq][l_rp]); + l_current_val=SHMOO[scenario].MBA.P[iv_port].S[rank].K.nom_val[l_dq][l_rp]; + rc=mss_access_delay_reg(i_target,l_access_type_e,iv_port,0,l_input_type_e,l_dq,0,l_current_val);if(rc) return rc; } - - return rc; -} -fapi::ReturnCode generic_shmoo::knob_update_dqs_by8_isdimm(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag) -{ - fapi::ReturnCode rc; - ecmdDataBufferBase data_buffer_64(64); - ecmdDataBufferBase data_buffer_64_1(64); - - - - uint8_t l_rp=0; - input_type_t l_input_type_e = WR_DQ; - input_type_t l_input_type_e_dqs = WR_DQS; - uint8_t l_dq=0; - uint8_t l_dqs=0; - access_type_t l_access_type_e = WRITE; - uint8_t l_n=0; - uint8_t l_scen_dqs=4; - - - uint8_t l_p=0; - uint16_t l_delay=0; - uint32_t __attribute__((unused)) l_max=0; //SW198827 - uint16_t l_max_limit=500; - uint8_t rank=0; - uint8_t l_rank=0; - uint8_t __attribute__((unused)) l_SCHMOO_BYTES=10; //SW198827 - uint8_t l_SCHMOO_NIBBLES=20; - - uint8_t i_rp=0; - - - - if(iv_dmm_type==1) - { - l_SCHMOO_BYTES=9; - l_SCHMOO_NIBBLES=18; - } - //rc = mss_getrankpair(i_target,iv_port,rank,&l_rp,valid_rank);if(rc) return rc; - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for(int i=0;i<iv_MAX_RANKS[l_p];i++){ - rc = mss_getrankpair(i_target,l_p,0,&i_rp,valid_rank);if(rc) return rc; - rank=valid_rank[i]; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - schmoo_error_map[l_p][rank][l_n]=0; - } - } - } - - - - - if(bound==RIGHT) - { - - if(algorithm==SEQ_LIN) - { - - - for (l_delay=1;((pass==0));l_delay++){ - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=0; - l_dqs=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - //FAPI_INF("\n abhijit here after port=%d rank=%d \n",l_p,rank); - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - l_dqs=l_n/2; - FAPI_INF("\n the value of error check is %d \n",schmoo_error_map[l_p][rank][l_n]); - if((schmoo_error_map[l_p][rank][l_n]==0)&&(schmoo_error_map[l_p][rank][l_n+1]==0)){ - FAPI_INF("\n value of nominal delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_scen_dqs,rank,l_p,l_dqs,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_dqs][l_rp]); - SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_dqs][l_rp]=SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_dqs][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d dqs=%d is %d ",l_scen_dqs,rank,l_p,l_dqs,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_dqs][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_dqs,1,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_dqs][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay scenario=%d rank=%d for port=%d bit=%d is %d ",scenario,rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; - FAPI_INF("\n value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.rb_regval[l_dq][l_rp]);if(rc) return rc; - - } - //FAPI_INF("\n abhijit here before \n"); - if(SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.rb_regval[l_dqs][l_rp]>l_max_limit){ - - schmoo_error_map[l_p][rank][l_n]=1; - schmoo_error_map[l_p][rank][l_n+1]=1; - } - - if((schmoo_error_map[l_p][rank][l_n]==1)||(schmoo_error_map[l_p][rank][l_n+1]==1)){ - - schmoo_error_map[l_p][rank][l_n]=1; - schmoo_error_map[l_p][rank][l_n+1]=1; - } - - l_n=l_n+1; - - } - - - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - - rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } + } - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - FAPI_INF("\n restoring nominal values for dqs=%d port=%d rank=%d is %d \n",l_n,l_p,rank,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,1,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } - - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - - - - } - - } - - if(bound==LEFT) + else if(bound==RIGHT) { + if(algorithm==SEQ_LIN) - { - - for (l_delay=1;(pass==0);l_delay++){ - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=0; - l_dqs=0; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - l_dq=4*l_n; - l_max=SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]; - l_dqs=l_n/2; - - if((schmoo_error_map[l_p][rank][l_n]==0)&&(schmoo_error_map[l_p][rank][l_n+1]==0)){ - SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_dqs][l_rp]=SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_dqs][l_rp]-l_delay; - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_dqs,1,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_dqs][l_rp]);if(rc) return rc; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+1; - SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]-l_delay; - FAPI_INF("\n left value of delay rank=%d for port=%d bit=%d is %d ",rank,l_p,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]); - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.lb_regval[l_dq][l_rp]);if(rc) return rc; - } - if(SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.lb_regval[l_dqs][l_rp] == 0){ - schmoo_error_map[l_p][rank][l_n] = 1; - schmoo_error_map[l_p][rank][l_n+1] = 1; - } - - if((schmoo_error_map[l_p][rank][l_n]==1)||(schmoo_error_map[l_p][rank][l_n+1]==1)){ - - schmoo_error_map[l_p][rank][l_n]=1; - schmoo_error_map[l_p][rank][l_n+1]=1; - } - - l_n=l_n+1; - - } - } - - } - rc=do_mcbist_test(i_target); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); - return rc; - } - -rc=check_error_map(i_target,l_p,pass); - if(rc) - { - FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); + { + l_max_value=SHMOO[scenario].static_knob.max_val; + for(l_current_val=SHMOO[scenario].MBA.P[iv_port].S[rank].K.nom_val[l_dq][l_rp];((l_current_val<l_max_value)&&(pass==1));l_current_val+=100) + { + //use saurabh function for writing here + FAPI_INF(" curr val = %d ",l_current_val); + rc=mss_access_delay_reg(i_target,l_access_type_e,iv_port,0,l_input_type_e,l_dq,0,l_current_val);if(rc) return rc; + + rc=do_mcbist_test(i_target,rank,byte,nibble,pass); + if(rc) + { + FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); return rc; - } - - - } - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e_dqs,l_n,1,SHMOO[l_scen_dqs].MBA.P[l_p].S[rank].K.nom_val[l_n][l_rp]);if(rc) return rc; - - } - } - } + } + } + if(!pass) + { + SHMOO[scenario].MBA.P[iv_port].S[rank].K.rb_regval[l_dq][l_rp]=l_current_val; + } + l_current_val=SHMOO[scenario].MBA.P[iv_port].S[rank].K.nom_val[l_dq][l_rp]; - for(int l_bit=0;l_bit<4;l_bit++){ - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rank=0;l_rank<iv_MAX_RANKS[l_p];++l_rank) - { - l_dq=l_bit; - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - rank=valid_rank[l_rank]; - rc = mss_getrankpair(i_target,l_p,rank,&l_rp,valid_rank);if(rc) return rc; - for (l_n=0; l_n<l_SCHMOO_NIBBLES;l_n++){ - rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,rank,l_input_type_e,l_dq,1,SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]);if(rc) return rc; - l_dq=l_dq+4; - } - } - } - } - } - + rc=mss_access_delay_reg(i_target,l_access_type_e,iv_port,0,l_input_type_e,l_dq,0,l_current_val);if(rc) return rc; + FAPI_INF(" right bound = %d ",SHMOO[scenario].MBA.P[iv_port].S[rank].K.rb_regval[l_dq][l_rp]); + } - } - - return rc; + } + return rc; } - +*/ /*------------------------------------------------------------------------------ * Function: find_bound * Description : This function calls the knob_update for each DQ which is used to find bound that is left/right according to schmoo type @@ -2131,50 +905,32 @@ rc=check_error_map(i_target,l_p,pass); * Parameters: Target:MBA,bound:RIGHT/LEFT, * ---------------------------------------------------------------------------*/ fapi::ReturnCode generic_shmoo::find_bound(const fapi::Target & i_target,bound_t bound){ - uint8_t l_bit=0; + uint8_t l_bit; fapi::ReturnCode rc; uint8_t pass=0; - uint8_t l_dram_width=0; bool flag=false; - rc = FAPI_ATTR_GET(ATTR_EFF_DRAM_WIDTH, &i_target, l_dram_width); if(rc) return rc; + FAPI_INF("generic_shmoo::find_bound running find_bound function "); - //rc=knob_update_dqs_by8_isdimm(i_target,bound,iv_shmoo_type,l_bit,pass,flag); if(rc) return rc; - if(iv_DQS_ON == 1){ - pass=0; - if(l_dram_width == 4){ - if(iv_dmm_type==1) - { - rc=knob_update_dqs_by4_isdimm(i_target,bound,iv_shmoo_type,l_bit,pass,flag); if(rc) return rc; - }else{ - rc=knob_update_dqs_by4(i_target,bound,iv_shmoo_type,l_bit,pass,flag); if(rc) return rc; - } - }else{ - if(iv_dmm_type==1) - { - rc=knob_update_dqs_by8_isdimm(i_target,bound,iv_shmoo_type,l_bit,pass,flag); if(rc) return rc; - }else{ - rc=knob_update_dqs_by8(i_target,bound,iv_shmoo_type,l_bit,pass,flag); if(rc) return rc; - //rc=knob_update_dqs_by8_isdimm(i_target,bound,iv_shmoo_type,l_bit,pass,flag); if(rc) return rc; - } - } - }else{ - //Bit loop + + + + //Bit loop for(l_bit=0;l_bit< MAX_BITS;++l_bit) { // preetham function here pass=0; - FAPI_INF("\n abhijit is inside find bound and schmoo type is %d \n",iv_shmoo_type); + //FAPI_INF("\n abhijit is inside find bound 0 \n"); rc=knob_update(i_target,bound,iv_shmoo_type,l_bit,pass,flag); if(rc) return rc; } - } + return rc; } @@ -2247,11 +1003,11 @@ fapi::ReturnCode generic_shmoo::print_report(const fapi::Target & i_target) { l_dq=8*l_byte+4*l_nibble+l_bit; - if(iv_shmoo_type==2) + if(iv_shmoo_type==0) { FAPI_INF("WR_EYE %d\t%d\t%d\t%d\t%d\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n ",l_mbapos,l_p,i_rank,l_byte,l_nibble,l_bit,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.total_margin[l_dq][l_rp],l_attr_mss_freq_u32,iv_shmoo_param); } - if(iv_shmoo_type==8) + if(iv_shmoo_type==2) { FAPI_INF("RD_EYE %d\t%d\t%d\t%d\t%d\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n ",l_mbapos,l_p,i_rank,l_byte,l_nibble,l_bit,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.total_margin[l_dq][l_rp],l_attr_mss_freq_u32,iv_shmoo_param); } @@ -2264,99 +1020,6 @@ fapi::ReturnCode generic_shmoo::print_report(const fapi::Target & i_target) return rc; } - - fapi::ReturnCode generic_shmoo::print_report_dqs(const fapi::Target & i_target) -{ - fapi::ReturnCode rc; - - uint8_t l_rnk,l_nibble; - //uint8_t l_dq=0; - uint8_t l_rp=0; - uint8_t l_p=0; - uint8_t i_rank=0; - uint8_t l_mbapos = 0; - uint32_t l_attr_mss_freq_u32 = 0; - uint32_t l_attr_mss_volt_u32 = 0; - uint8_t l_attr_eff_dimm_type_u8 = 0; - uint8_t l_attr_eff_num_drops_per_port_u8 = 0; - uint8_t l_attr_eff_dram_width_u8 = 0; - fapi::Target l_target_centaur; - uint8_t l_SCHMOO_NIBBLES=20; - uint8_t l_by8_dqs=0; - - - if(iv_dmm_type==1) - { - l_SCHMOO_NIBBLES=18; - } - - rc = fapiGetParentChip(i_target, l_target_centaur); if(rc) return rc; - - rc = FAPI_ATTR_GET(ATTR_MSS_FREQ, &l_target_centaur, l_attr_mss_freq_u32); if(rc) return rc; - rc = FAPI_ATTR_GET(ATTR_MSS_VOLT, &l_target_centaur, l_attr_mss_volt_u32); if(rc) return rc; - rc = FAPI_ATTR_GET(ATTR_EFF_DIMM_TYPE, &i_target, l_attr_eff_dimm_type_u8); if(rc) return rc; - rc = FAPI_ATTR_GET(ATTR_EFF_NUM_DROPS_PER_PORT, &i_target, l_attr_eff_num_drops_per_port_u8); if(rc) return rc; - rc = FAPI_ATTR_GET(ATTR_EFF_DRAM_WIDTH, &i_target, l_attr_eff_dram_width_u8); if(rc) return rc; - rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS, &i_target, l_mbapos);if(rc) return rc; - - if(l_attr_eff_dram_width_u8 == 8){ - l_SCHMOO_NIBBLES=10; - if(iv_dmm_type==1) - { - l_SCHMOO_NIBBLES=9; - } - } - - - - FAPI_INF(" freq = %d on %s.", l_attr_mss_freq_u32, l_target_centaur.toEcmdString()); - FAPI_INF("volt = %d on %s.", l_attr_mss_volt_u32, l_target_centaur.toEcmdString()); - FAPI_INF("dimm_type = %d on %s.", l_attr_eff_dimm_type_u8, i_target.toEcmdString()); - if ( l_attr_eff_dimm_type_u8 == fapi::ENUM_ATTR_EFF_DIMM_TYPE_CDIMM ) - { - FAPI_INF("It is a CDIMM"); - } - else - { - FAPI_INF("It is an ISDIMM"); - } - //FAPI_INF("num_drops_per_port = %d on %s.", l_attr_eff_num_drops_per_port_u8, i_target.toEcmdString()); - //FAPI_INF("num_ranks = %d on %s.", iv_MAX_RANKS,i_target.toEcmdString()); - //FAPI_INF("dram_width = %d on %s. \n\n", l_attr_eff_dram_width_u8, i_target.toEcmdString()); - //fprintf(fp, "Schmoo POS\tPort\tRank\tDQS\tNominal\t\tSetup_Limit\tHold_Limit\tWrD_Setup(ps)\tWrD_Hold(ps)\tEye_Width(ps)\tBitRate \n"); - FAPI_INF("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - FAPI_INF("Schmoo POS\tPort\tRank\tDQS\tNominal\t\tSetup_Limit\tHold_Limit\tWrD_Setup(ps)\tWrD_Hold(ps)\tEye_Width(ps)\tBitRate "); - - iv_shmoo_type=4; - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - for (l_rnk=0;l_rnk<iv_MAX_RANKS[l_p];++l_rnk) - { rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - i_rank=valid_rank[l_rnk]; - rc = mss_getrankpair(i_target,l_p,i_rank,&l_rp,valid_rank);if(rc) return rc; - - for(l_nibble=0;l_nibble< l_SCHMOO_NIBBLES;++l_nibble) - { - - l_by8_dqs=l_nibble; - if(l_attr_eff_dram_width_u8 == 8){ - l_by8_dqs=l_nibble*2; - - } - //fprintf(fp,"WR_DQS %d\t%d\t%d\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n ",l_mbapos,l_p,i_rank,l_nibble,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.total_margin[l_by8_dqs][l_rp],l_attr_mss_freq_u32); - FAPI_INF("WR_DQS %d\t%d\t%d\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n ",l_mbapos,l_p,i_rank,l_nibble,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_by8_dqs][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.total_margin[l_by8_dqs][l_rp],l_attr_mss_freq_u32); - - - - - } - } - } - - //fclose(fp); - return rc; - } //#endif /*------------------------------------------------------------------------------ * Function: get_margin @@ -2407,7 +1070,7 @@ fapi::ReturnCode generic_shmoo::get_margin(const fapi::Target & i_target) { l_dq=8*l_byte+4*l_nibble+l_bit; //FAPI_INF(" the right bound = %d and nominal = %d",SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_dq][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_dq][l_rp]); - if(iv_shmoo_type==8) + if(iv_shmoo_type==2) { if(SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_dq][l_rp] == 0){ //FAPI_INF("\n abhijit saurabh is here and dq=%d \n",l_dq); @@ -2430,145 +1093,6 @@ fapi::ReturnCode generic_shmoo::get_margin(const fapi::Target & i_target) return rc; } - fapi::ReturnCode generic_shmoo::get_margin_dqs_by4(const fapi::Target & i_target) -{ - fapi::ReturnCode rc; - uint8_t l_rnk; - uint32_t l_attr_mss_freq_margin_u32 = 0; - uint32_t l_freq=0; - uint64_t l_cyc = 1000000000000000ULL; - // uint8_t l_dq=0; - uint8_t l_nibble=0; - uint8_t l_rp=0; - uint8_t l_p=0; - uint8_t i_rank=0; - uint64_t l_factor=0; - uint64_t l_factor_ps=1000000000; - uint8_t l_SCHMOO_NIBBLES=20; - - if(iv_dmm_type==1) - { - l_SCHMOO_NIBBLES=18; - } - - //FAPI_INF(" the factor is % llu ",l_cyc); - - fapi::Target l_target_centaur; - rc = fapiGetParentChip(i_target, l_target_centaur); if(rc) return rc; - rc = FAPI_ATTR_GET(ATTR_MSS_FREQ, &l_target_centaur, l_attr_mss_freq_margin_u32); if(rc) return rc; - l_freq=l_attr_mss_freq_margin_u32/2; - l_cyc=l_cyc/l_freq;// converting to zepto to get more accurate data - l_factor=l_cyc/128; - //FAPI_INF("l_factor is % llu ",l_factor); - - - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - //FAPI_INF("\n Abhijit is here before %d \n",l_p); - for (l_rnk=0;l_rnk<iv_MAX_RANKS[l_p];++l_rnk) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - i_rank=valid_rank[l_rnk]; - rc = mss_getrankpair(i_target,l_p,i_rank,&l_rp,valid_rank);if(rc) return rc; - - //Nibble loop - // FAPI_INF("\n Abhijit is outside %d \n",l_p); - for(l_nibble=0;l_nibble<l_SCHMOO_NIBBLES;l_nibble++) - { - //FAPI_INF("\n Abhijit 11111 is here after schmoo type=%d and port=%d \n",iv_shmoo_type,l_p); - //FAPI_INF(" the right bound = %d and nominal = %d",SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_nibble][l_rp]); - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp]=SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp]-1; - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_nibble][l_rp]=SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_nibble][l_rp]+1; - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_nibble][l_rp]=((SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp]-SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_nibble][l_rp])*l_factor)/l_factor_ps; - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_nibble][l_rp]= ((SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_nibble][l_rp]-SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_nibble][l_rp])*l_factor)/l_factor_ps;//((1/uint32_t_freq*1000000)/128); - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.total_margin[l_nibble][l_rp]=SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_nibble][l_rp]+SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_nibble][l_rp]; - //FAPI_INF("\n Abhijit is here after %d and port=%d \n",l_nibble,l_p); - //FAPI_INF("\n Abhijit is here after 2 %d \n",l_rnk); - } - - - } - - } - - - return rc; - } - - fapi::ReturnCode generic_shmoo::get_margin_dqs_by8(const fapi::Target & i_target) -{ - fapi::ReturnCode rc; - uint8_t l_rnk; - uint32_t l_attr_mss_freq_margin_u32 = 0; - uint32_t l_freq=0; - uint64_t l_cyc = 1000000000000000ULL; - //uint8_t l_dq=0; - uint8_t l_nibble=0; - uint8_t l_rp=0; - uint8_t l_p=0; - uint8_t i_rank=0; - uint64_t l_factor=0; - uint64_t l_factor_ps=1000000000; - uint8_t l_SCHMOO_NIBBLES=20; - - if(iv_dmm_type==1) - { - l_SCHMOO_NIBBLES=9; - } - - //FAPI_INF(" the factor is % llu ",l_cyc); - - fapi::Target l_target_centaur; - rc = fapiGetParentChip(i_target, l_target_centaur); if(rc) return rc; - rc = FAPI_ATTR_GET(ATTR_MSS_FREQ, &l_target_centaur, l_attr_mss_freq_margin_u32); if(rc) return rc; - l_freq=l_attr_mss_freq_margin_u32/2; - l_cyc=l_cyc/l_freq;// converting to zepto to get more accurate data - l_factor=l_cyc/128; - //FAPI_INF("l_factor is % llu ",l_factor); - - - - - for (l_p=0;l_p<MAX_PORT;l_p++){ - //FAPI_INF("\n Abhijit is here before %d \n",l_p); - for (l_rnk=0;l_rnk<iv_MAX_RANKS[l_p];++l_rnk) - { - - rc = mss_getrankpair(i_target,l_p,0,&l_rp,valid_rank);if(rc) return rc; - i_rank=valid_rank[l_rnk]; - rc = mss_getrankpair(i_target,l_p,i_rank,&l_rp,valid_rank);if(rc) return rc; - - //Nibble loop - //FAPI_INF("\n Abhijit is outside %d \n",l_p); - for(l_nibble=0;l_nibble<l_SCHMOO_NIBBLES;l_nibble++) - { - if(iv_dmm_type==0) - { - if((l_nibble%2)){ - continue ; - } - } - //FAPI_INF("\n Abhijit 11111 is here after schmoo type=%d and port=%d \n",iv_shmoo_type,l_p); - FAPI_INF(" the port=%d rank=%d nibble=%d right bound = %d and nominal = %d",l_p,i_rank,l_nibble,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp],SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_nibble][l_rp]); - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp]=SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp]-1; - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_nibble][l_rp]=SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_nibble][l_rp]+1; - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_nibble][l_rp]=((SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.rb_regval[l_nibble][l_rp]-SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_nibble][l_rp])*l_factor)/l_factor_ps; - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_nibble][l_rp]= ((SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.nom_val[l_nibble][l_rp]-SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.lb_regval[l_nibble][l_rp])*l_factor)/l_factor_ps;//((1/uint32_t_freq*1000000)/128); - SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.total_margin[l_nibble][l_rp]=SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.right_margin_val[l_nibble][l_rp]+SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rank].K.left_margin_val[l_nibble][l_rp]; - //FAPI_INF("\n Abhijit is here after %d and port=%d \n",l_nibble,l_p); - //FAPI_INF("\n Abhijit is here after 2 %d \n",l_rnk); - } - - - } - - } - - - return rc; - } /*------------------------------------------------------------------------------ * Function: get_min_margin * Description : This function is used to get the minimum margin of all the schmoo margins @@ -2632,20 +1156,16 @@ fapi::ReturnCode generic_shmoo::get_min_margin(const fapi::Target & i_target,uin //uint32_t rc_num =0; uint8_t l_pattern=0; uint8_t l_testtype=0; - + //uint8_t l_rank=0; fapi::ReturnCode rc; uint64_t l_start =0x0000000000000000ull; uint64_t l_end = 0x0000000000000000ull; - mcbist_test_mem i_mcbtest= CENSHMOO; - mcbist_data_gen i_mcbpatt= ABLE_FIVE; - - - - - + mcbist_test_mem i_mcbtest = CENSHMOO; // bellows: initialize to this type + mcbist_data_gen i_mcbpatt = ABLE_FIVE; // bellows: initialize to this data type + @@ -2738,15 +1258,6 @@ case 26 : i_mcbtest = R_ONLY;break; case 27 : i_mcbtest = W_ONLY_RAND;break; case 28 : i_mcbtest = R_ONLY_RAND;break; case 29 : i_mcbtest = R_ONLY_MULTI;break; -case 30 : i_mcbtest = SHORT;break; -case 31 : i_mcbtest = SIMPLE_RAND_BARI;break; -case 32 : i_mcbtest = W_R_INFINITE;break; -case 33 : i_mcbtest = W_R_RAND_INFINITE;break; -case 34 : i_mcbtest = R_INFINITE1;break; -case 35 : i_mcbtest = R_INFINITE_RF;break; -case 36 : i_mcbtest = MARCH;break; -case 37 : i_mcbtest = SIMPLE_FIX_RF;break; -case 38 : i_mcbtest = SHMOO_STRESS;break; default : FAPI_INF("Wrong Test_type,so using default test_type"); } rc = setup_mcbist(i_target, 0, i_mcbpatt, i_mcbtest, UNMASK_ALL, 0,iv_pattern,iv_test_type,0,0,l_start,l_end,iv_addr);if(rc) return rc; diff --git a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.H b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.H index 440b44774..df73008ee 100644 --- a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.H +++ b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.H @@ -20,7 +20,7 @@ /* Origin: 30 */ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: mss_generic_shmoo.H,v 1.14 2013/04/25 08:23:52 sasethur Exp $ +// $Id: mss_generic_shmoo.H,v 1.13 2013/04/09 12:18:47 lapietra Exp $ // *!*************************************************************************** // *! (C) Copyright International Business Machines Corp. 1997, 1998 // *! All Rights Reserved -- Property of IBM @@ -31,8 +31,8 @@ // *! DESCRIPTION : Memory Subsystem Generic Shmoo -- abstraction for HB // *! CONTEXT : To make all shmoos share a common abstraction layer // *! -// *! OWNER NAME : Abhijit Saurabh Email: abhijit.saurabh@in.ibm.com -// *! BACKUP NAME : +// *! OWNER NAME : Varkey Varghese Email: varkey.kv@in.ibm.com +// *! BACKUP NAME : Abhijit Saurabh Email: abhijit.saurabh@in.ibm.com // *! // *!*************************************************************************** // CHANGE HISTORY: @@ -111,25 +111,17 @@ class generic_shmoo void init_multi_array(uint32_t (&array)[MAX_DQ][MAX_RPS],uint32_t init_val); //initialize multi dim arrays to known value fapi::ReturnCode init_multi_array_dqs(uint32_t (&array)[MAX_DQ][MAX_RPS],uint32_t init_val); fapi::ReturnCode get_all_noms(const fapi::Target & i_target); //! Read in all the Nominal values of the relevant knobs - fapi::ReturnCode get_all_noms_dqs(const fapi::Target & i_target); //! Read in all the Nominal values of the relevant knobs fapi::ReturnCode find_bound(const fapi::Target & i_target,bound_t); // generic Right bound fapi::ReturnCode knob_update(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag); // Increment or decrement the knob - fapi::ReturnCode knob_update_dqs_by8(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag); - fapi::ReturnCode knob_update_dqs_by4(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag); - fapi::ReturnCode print_report(const fapi::Target & i_target); // Print Shmoo report to STDOUT - fapi::ReturnCode print_report_dqs(const fapi::Target & i_target); - fapi::ReturnCode print_shmoo_parms(); + fapi::ReturnCode knob_update_dqs(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t rank,uint8_t byte,uint8_t nibble,uint8_t bit,uint8_t pass); + fapi::ReturnCode print_report(const fapi::Target & i_target); // Print Shmoo report to file or STDOUT + fapi::ReturnCode print_shmoo_parms(); fapi::ReturnCode get_margin(const fapi::Target & i_target); - fapi::ReturnCode get_margin_dqs_by8(const fapi::Target & i_target); - fapi::ReturnCode get_margin_dqs_by4(const fapi::Target & i_target); fapi::ReturnCode get_min_margin(const fapi::Target & i_target,uint32_t *o_right_min_margin,uint32_t *o_left_min_margin); fapi::ReturnCode do_mcbist_test(const fapi::Target & i_target); fapi::ReturnCode check_error_map(const fapi::Target & i_target,uint8_t port,uint8_t &pass); fapi::ReturnCode sanity_check(const fapi::Target & i_target); fapi::ReturnCode schmoo_setup_mcb( const fapi::Target & i_target); - fapi::ReturnCode get_error_cnt(const fapi::Target & i_target,uint8_t port,uint8_t rank,uint8_t rank_pair,uint8_t bit,bound_t bound); - fapi::ReturnCode knob_update_dqs_by8_isdimm(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag); - fapi::ReturnCode knob_update_dqs_by4_isdimm(const fapi::Target & i_target,bound_t bound,uint8_t scenario,uint8_t bit,uint8_t pass,bool &flag); fapi::ReturnCode run(const fapi::Target & i_target,uint32_t *right_min_margin,uint32_t *left_min_margin,uint8_t i_pattern,uint8_t i_test_type,uint32_t i_shmoo_param); }; #endif diff --git a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_address.C b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_address.C index f36b459b8..21f435758 100644 --- a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_address.C +++ b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_address.C @@ -20,7 +20,7 @@ /* Origin: 30 */ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: mss_mcbist_address.C,v 1.11 2013/05/16 22:00:24 sasethur Exp $ +// $Id: mss_mcbist_address.C,v 1.10 2013/04/30 08:56:00 ppcaelab Exp $ // *!*************************************************************************** // *! (C) Copyright International Business Machines Corp. 1997, 1998, 2013 // *! All Rights Reserved -- Property of IBM @@ -38,8 +38,6 @@ //------------------------------------------------------------------------------- // Version:|Author: | Date: | Comment: // --------|--------|---------|-------------------------------------------------- -// 1.11 |preeragh|17-May-13| Fixed FW Review Comments -// 1.10 |preeragh|30-Apr-13| Fixed FW Review Comment // 1.9 |bellows |04-Apr-13| Changed program to be Hostboot compliant // 1.2 |bellows |03-Apr-13| Added Id and cleaned up a warning msg. // 1.1 | |xx-Apr-13| Copied from original which is now known as mss_mcbist_address_default/_lab.C @@ -51,17 +49,15 @@ extern "C" { using namespace fapi; -#define MAX_ADDR_BITS 37 -#define MAX_VALUE_TWO 2 - +#define MAX_STRING_LEN 80 #define DELIMITERS "," fapi::ReturnCode address_generation(const fapi:: Target & i_target_mba,uint8_t i_port,mcbist_addr_mode i_addr_type,interleave_type i_add_inter_type,uint8_t i_rank,uint64_t &io_start_address, uint64_t &io_end_address) { fapi::ReturnCode rc; -uint8_t l_num_ranks_per_dimm[MAX_VALUE_TWO][MAX_VALUE_TWO]; -uint8_t l_num_master_ranks[MAX_VALUE_TWO][MAX_VALUE_TWO]; +uint8_t l_num_ranks_per_dimm[2][2]; +uint8_t l_num_master_ranks[2][2]; uint8_t l_dram_gen=0; uint8_t l_dram_banks=0; uint8_t l_dram_rows=0; @@ -108,7 +104,7 @@ FAPI_INF("ATTR_EFF_NUM_RANKS_PER_DIMM is %d ",l_num_ranks_per_dimm[1][1]); FAPI_INF("ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM l_num_master_p0_dim0 is %d ",l_num_master_ranks[0][0]); FAPI_INF("ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM l_num_master_p0_dim1 is %d ",l_num_master_ranks[0][1]); FAPI_INF("ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM l_num_master_p1_dim0 is %d ",l_num_master_ranks[1][0]); -FAPI_INF("ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM l_num_master_p1_dim1 is %d ",l_num_master_ranks[1][1]); +FAPI_INF("ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM is l_num_master_p1_dim1 %d ",l_num_master_ranks[1][1]); //------------------------------------------------------------------------------- @@ -188,14 +184,14 @@ return rc; fapi::ReturnCode parse_addr(const fapi:: Target & i_target_mba, char addr_string[],uint8_t mr3_valid,uint8_t mr2_valid,uint8_t mr1_valid,uint8_t l_dram_rows,uint8_t l_dram_cols,uint8_t l_addr_inter) { fapi::ReturnCode rc; -uint8_t i=MAX_ADDR_BITS; +uint8_t i=37; uint8_t l_slave_rank = 0; uint8_t l_value; uint32_t l_value32 = 0; uint32_t l_sbit,rc_num; uint32_t l_start=0; -uint32_t l_len = 0; +uint32_t l_len = 6; uint64_t l_readscom_value = 0; uint64_t l_end = 0; uint64_t l_start_addr = 0; @@ -203,7 +199,7 @@ uint8_t l_value_zero = 0; uint8_t l_user_end_addr = 0; ecmdDataBufferBase l_data_buffer_64(64); ecmdDataBufferBase l_data_buffer_rd64(64); -uint8_t l_attr_addr_mode = 3; //default Value - FULL Address Mode +uint8_t l_attr_addr_mode = 3; uint8_t l_num_cols = 0; uint8_t l_num_rows = 0; @@ -229,18 +225,17 @@ if(l_num_rows == 0 ) rc_num = l_data_buffer_64.flushTo0(); - l_sbit = 0;l_value =i; - rc = fapiGetScom(i_target_mba,0x030106c9,l_data_buffer_64); if(rc) return rc; - rc_num = rc_num| l_data_buffer_64.insertFromRight(l_value,l_sbit ,6);if (rc_num){FAPI_ERR( "Error in function parse_addr:");rc.setEcmdError(rc_num);return rc;} - rc = fapiPutScom(i_target_mba,0x030106c9,l_data_buffer_64); if(rc) return rc; - i--; + l_sbit = 0;l_value =i; + rc = fapiGetScom(i_target_mba,0x030106c9,l_data_buffer_64); if(rc) return rc; + rc_num = rc_num| l_data_buffer_64.insertFromRight(l_value,l_sbit ,6);if (rc_num){FAPI_ERR( "Error in function parse_addr:");rc.setEcmdError(rc_num);return rc;} + rc = fapiPutScom(i_target_mba,0x030106c9,l_data_buffer_64); if(rc) return rc; + i--; l_sbit = 54;l_value =i; rc = fapiGetScom(i_target_mba,0x030106c8,l_data_buffer_64); rc_num = rc_num| l_data_buffer_64.insertFromRight(l_value,l_sbit ,6); rc = fapiPutScom(i_target_mba,0x030106c8,l_data_buffer_64); if(rc) return rc; i--; - //FAPI_INF("Inside strcmp ba2"); l_sbit = 48;l_value =i; rc = fapiGetScom(i_target_mba,0x030106c8,l_data_buffer_64); if(rc) return rc; @@ -947,7 +942,7 @@ rc = fapiPutScom(i_target_mba,0x030106d3,l_data_buffer_rd64); if(rc) return rc; else { -l_attr_addr_mode = 3; //Default it for FW with Full Address Range +l_attr_addr_mode = 3; if(l_attr_addr_mode == 0) { diff --git a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_shmoo_common.H b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_shmoo_common.H index f2a387a67..d6438580e 100644 --- a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_shmoo_common.H +++ b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_shmoo_common.H @@ -20,7 +20,7 @@ /* Origin: 30 */ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: mss_shmoo_common.H,v 1.13 2013/04/25 08:23:54 sasethur Exp $ +// $Id: mss_shmoo_common.H,v 1.12 2013/03/20 17:18:38 sasethur Exp $ // *!*************************************************************************** // *! (C) Copyright International Business Machines Corp. 1997, 1998 // *! All Rights Reserved -- Property of IBM @@ -52,7 +52,7 @@ enum shmoo_type_t { TEST_NONE=0,MCBIST=1,WR_EYE=2, WRT_DQS=4,RD_EYE=8,RD_GATE=16 enum shmoo_algorithm_t { SEQ_LIN}; // Parallel bytes/ranks here .. no parallel targets in HB const uint8_t NINE = 9; const uint8_t MAX_RPS=4;// 4 Rank pairs in this design -const uint8_t MAX_SHMOO=16; +const uint8_t MAX_SHMOO=4; const uint8_t MAX_RANK_DIMM=4; const uint8_t MAX_NIBBLES=2; const uint8_t MAX_BITS=4; @@ -87,7 +87,5 @@ struct shmoo_knob_data_t{ uint32_t nom_val[MAX_DQ][MAX_RPS]; // nominal value of this instance of the knob uint32_t right_margin_val[MAX_DQ][MAX_RPS]; uint32_t left_margin_val[MAX_DQ][MAX_RPS]; - uint32_t right_err_cnt[MAX_DQ][MAX_RPS]; - uint32_t left_err_cnt[MAX_DQ][MAX_RPS]; }; #endif diff --git a/src/usr/hwpf/hwp/dram_training/mss_termination_control.C b/src/usr/hwpf/hwp/dram_training/mss_termination_control.C index 376ed2724..148210bdb 100644 --- a/src/usr/hwpf/hwp/dram_training/mss_termination_control.C +++ b/src/usr/hwpf/hwp/dram_training/mss_termination_control.C @@ -20,7 +20,7 @@ /* Origin: 30 */ /* */ /* IBM_PROLOG_END_TAG */ -// $Id: mss_termination_control.C,v 1.20 2013/04/09 11:04:34 lapietra Exp $ +// $Id: mss_termination_control.C,v 1.21 2013/04/22 16:36:34 sasethur Exp $ /* File is created by SARAVANAN SETHURAMAN on Thur 29 Sept 2011. */ //------------------------------------------------------------------------------ @@ -43,6 +43,7 @@ //------------------------------------------------------------------------------ // Version:| Author: | Date: | Comment: //---------|----------|---------|----------------------------------------------- +// 1.21 | sasethur |16-Apr-13| Added DDR4 settings for rd_vref // 1.20 | sasethur |09-Apr-13| Changed wr_vref register settings as per ddr3spec // 1.19 | sasethur |05-Apr-13| Updated for port in parallel // 1.18 | mwuu |25-Feb-13| Added return code per port for config slew FN @@ -145,7 +146,7 @@ fapi::ReturnCode config_drv_imp(const fapi::Target & i_target_mba, uint8_t i_por rc_num = rc_num | data_buffer.insertFromRight(enslice_ffedrv,56,4); if (rc_num) { - FAPI_ERR( "config_rd_vref: Error in setting up buffer "); + FAPI_ERR( "config_drv_imp: Error in setting up buffer "); rc.setEcmdError(rc_num); return rc; } @@ -187,7 +188,7 @@ fapi::ReturnCode config_drv_imp(const fapi::Target & i_target_mba, uint8_t i_por rc_num = rc_num | data_buffer.insertFromRight(enslice_ffedrv,56,4); if (rc_num) { - FAPI_ERR( "config_rd_vref: Error in setting up buffer "); + FAPI_ERR( "config_drv_imp: Error in setting up buffer "); rc.setEcmdError(rc_num); return rc; } @@ -307,7 +308,7 @@ fapi::ReturnCode config_rcv_imp(const fapi::Target & i_target_mba, uint8_t i_por rc_num = rc_num | data_buffer.insertFromRight(enslicepffeterm,56,4); if (rc_num) { - FAPI_ERR( "config_drv_imp: Error in setting up buffer "); + FAPI_ERR( "config_rcv_imp: Error in setting up buffer "); rc.setEcmdError(rc_num); return rc; } @@ -349,7 +350,7 @@ fapi::ReturnCode config_rcv_imp(const fapi::Target & i_target_mba, uint8_t i_por rc_num = rc_num | data_buffer.insertFromRight(enslicepffeterm,56,4); if (rc_num) { - FAPI_ERR( "config_drv_imp: Error in setting up buffer "); + FAPI_ERR( "config_rcv_imp: Error in setting up buffer "); rc.setEcmdError(rc_num); return rc; } @@ -819,7 +820,7 @@ fapi::ReturnCode config_wr_dram_vref(const fapi::Target & i_target_mba, uint8_t * VDD64500 = 64500, VDD65875 = 65875, VDD67250 = 67250, VDD68625 = 68625, VDD70000 = 70000, * VDD71375 = 71375, VDD72750 = 72750, VDD74125 = 74125, VDD75500 = 75500, VDD76875 = 76875, * VDD78250 = 78250, VDD79625 = 79625, VDD81000 = 81000 - * DDR3 supports upto 61000 + * DDR3 supports upto 61000, DDR4 - full range * ---------------------------------------------------------------------------*/ fapi::ReturnCode config_rd_cen_vref (const fapi::Target & i_target_mba, uint8_t i_port, uint32_t i_rd_cen_vref) @@ -836,17 +837,80 @@ fapi::ReturnCode config_rd_cen_vref (const fapi::Target & i_target_mba, uint8_t FAPI_SET_HWP_ERROR(rc, RC_MSS_INVALID_FN_INPUT_ERROR); return rc; } - for(uint8_t i=0; i< MAX_RD_VREF; i++) + + //if (rd_cen_vref == DDR3 rd_vref ) || (rd_cen_vref == DDR4) + + if((i_rd_cen_vref == 61000) || (i_rd_cen_vref == 81000)) { - if (rd_cen_vref_array[i] == i_rd_cen_vref) - { - rd_vref = i; - break; - } + rd_vref = 0xF; + } + else if((i_rd_cen_vref == 59625) || (i_rd_cen_vref == 79625)) + { + rd_vref = 0xE; + } + else if((i_rd_cen_vref == 58250) || (i_rd_cen_vref == 78250)) + { + rd_vref = 0xD; + } + else if((i_rd_cen_vref == 56875) || (i_rd_cen_vref == 76875)) + { + rd_vref = 0xC; + } + else if((i_rd_cen_vref == 55500) || (i_rd_cen_vref == 75500)) + { + rd_vref = 0xB; + } + else if((i_rd_cen_vref == 54125) || (i_rd_cen_vref == 74125)) + { + rd_vref = 0xA; + } + else if((i_rd_cen_vref == 52750) || (i_rd_cen_vref == 72750)) + { + rd_vref = 0x9; + } + else if((i_rd_cen_vref == 51375) || (i_rd_cen_vref == 71375)) + { + rd_vref = 0x8; + } + else if((i_rd_cen_vref == 50000) || (i_rd_cen_vref == 70000)) + { + rd_vref = 0x0; + } + else if((i_rd_cen_vref == 48625) || (i_rd_cen_vref == 68625)) + { + rd_vref = 0x1; + } + else if((i_rd_cen_vref == 47250) || (i_rd_cen_vref == 67250)) + { + rd_vref = 0x2; + } + else if((i_rd_cen_vref == 45875) || (i_rd_cen_vref == 65875)) + { + rd_vref = 0x3; + } + else if((i_rd_cen_vref == 44500) || (i_rd_cen_vref == 64500)) + { + rd_vref = 0x4; + } + else if((i_rd_cen_vref == 43125) || (i_rd_cen_vref == 63125)) + { + rd_vref = 0x5; + } + else if((i_rd_cen_vref == 41750) || (i_rd_cen_vref == 61750)) + { + rd_vref = 0x6; + } + else if((i_rd_cen_vref == 40375) || (i_rd_cen_vref == 60375)) + { + rd_vref = 0x7; + } + else + { + rd_vref = 0x0; } rc = fapiGetScom(i_target_mba, - DPHY01_DDRPHY_DP18_RX_PEAK_AMP_P0_0_0x800000060301143F, + DPHY01_DDRPHY_DP18_RX_PEAK_AMP_P0_0_0x800000060301143F, data_buffer); if(rc) return rc; rc_num = rc_num | data_buffer.insertFromRight(rd_vref,56,4); if (rc_num) |