/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* $Source: src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_generic_shmoo.C $ */ /* */ /* IBM CONFIDENTIAL */ /* */ /* COPYRIGHT International Business Machines Corp. 2012,2013 */ /* */ /* p1 */ /* */ /* Object Code Only (OCO) source materials */ /* Licensed Internal Code Source Materials */ /* IBM HostBoot Licensed Internal Code */ /* */ /* The source code for this program is not published or otherwise */ /* divested of its trade secrets, irrespective of what has been */ /* deposited with the U.S. Copyright Office. */ /* */ /* Origin: 30 */ /* */ /* IBM_PROLOG_END_TAG */ // $Id: mss_generic_shmoo.C,v 1.66 2013/08/12 10:07:23 sasethur Exp $ // *!*************************************************************************** // *! (C) Copyright International Business Machines Corp. 1997, 1998 // *! All Rights Reserved -- Property of IBM // *! *** IBM Confidential *** // *!*************************************************************************** // *! FILENAME : mss_generic_shmoo.C // *! TITLE : MSS Generic Shmoo Implementation // *! 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 : Sidhartha Vijay Email: sidvijay@in.ibm.com // *! // *!*************************************************************************** // CHANGE HISTORY: //------------------------------------------------------------------------------ // Version:|Author: | Date: | Comment: // --------|--------|---------|-------------------------------------------------- // 1.65 |abhijit |8-aug-13 | added binary schmoo first phase and modified training call // 1.64 |abhijit |17-jul-13| added rd dqs phase 2 // 1.63 |abhijit |19-jun-13| fixed warnings in schmoo // 1.61 |abhijit |11-jun-13| added read dqs and removed prints and single mcbist setup // 1.59 |abhijit |26-may-13| removed unnecessary prints // 1.57 |abhijit |21-may-13| fixed DQS report printing // 1.56 |abhijit |14-may-13| Updated call to setup_mcbist // 1.55 |abhijit |10-may-13| fixed firmware review comments // 1.51 |abhijit |10-may-13| optimized write dqs schmoo // 1.49 |abhijit |8-may-13 | Changed Write dqs reporting and optimized schmoo for running faster // 1.48 |sauchadh|7-may-13 | Added ping pong for wr_dqs shmoo // 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.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 // 1.18 |sasethur|14-DEC-12| Updated for change in access delay function // 1.16 |sasethur|14-DEC-12| Updated for Warning // 1.15 |abhijit |13-DEC-12| Updated for FW review comments // 1.14 |abhijit |06-DEC-12| Fixed more FW review comments // 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 //------------------------------------------------------------------------------ #include #include "mss_generic_shmoo.H" #include "mss_mcbist.H" #include // #include // #include #include #include //#define DBG 0 extern "C" { using namespace fapi; // START IMPLEMENTATION OF generic_shmoo CLASS METHODS //! shmoo_mask - What shmoos do you want to run ... encoded as Hex 0x2,0x4,0x8,0x16 /*------------------------------------------------------------------------------ * constructor: generic_shmoo * Description :Constructor used to initialize variables and do the initial settings * * 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) { //this->shmoo_mask=shmoo_mask; //! Sets what Shmoos the caller wants to run this->algorithm=shmoo_algorithm ; this->iv_addr=addr ; //iv_MAX_RANKS=8; iv_MAX_BYTES=10; iv_DQS_ON=0; iv_pattern=0; iv_test_type=0; iv_dmm_type=0; iv_shmoo_param=0; iv_binary_diff=2; iv_vref_mul=0; for(int p=0;p3){ l_nibble_is=1; }else{ l_nibble_is=0; } //FAPI_INF("\n the final byte and nibble is %d and %d for rank=%d \n",l_byte_is,l_nibble_is,i_rank); if( mcbist_error_map [l_p][l_rnk][l_byte_is][l_nibble_is] == 1){ //pass=0; schmoo_error_map[l_p][rank][l_n]=1; //FAPI_INF("We are in error and nibble is %d and rank is %d and port is %d \n",l_n,rank,l_p); } else { if(iv_shmoo_param==4){ schmoo_error_map[l_p][rank][l_n]=0; } //pass=0; //FAPI_INF("We are in error2"); } } else { if( mcbist_error_map [l_p][l_rnk][l_byte][l_nibble] == 1){ //pass=0; schmoo_error_map[l_p][rank][l_n]=1; //FAPI_INF("We are in error and nibble is %d and rank is %d and port is %d \n",l_n,rank,l_p); } else { if(iv_shmoo_param==4){ schmoo_error_map[l_p][rank][l_n]=0; } //schmoo_error_map[l_p][rank][l_n]=0; //pass=0; //FAPI_INF("We are in error2"); } } l_n++; } } } } for (l_p=0;l_pl_max_limit){ schmoo_error_map[l_p][rank][l_n]=1; } l_dq=l_dq+4; } } } rc=do_mcbist_test(i_target); if(rc) { 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) { FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); return rc; } } for (l_p=0;l_pSHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]){ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]; }else{ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]; } if(SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]<=2){ binary_done_map[l_p][rank][l_n]=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.curr_val[l_dq][l_rp]; FAPI_INF("\n the right bound for port=%d rank=%d dq=%d is %d \n",l_p,rank,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[l_dq][l_rp]); } }else{ SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[l_dq][l_rp]; SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[l_dq][l_rp]=(SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]+SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp])/2; //FAPI_INF("\n 2222222 port=%d nibble=%d rank=%d and bit=%d the last pass value %d the last fail value %d and current value %d\n",l_p,l_n,rank,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp],SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp],SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[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.curr_val[l_dq][l_rp]);if(rc) return rc; if(SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]>SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]){ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]; }else{ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]; } if(SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]<=2){ binary_done_map[l_p][rank][l_n]=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.curr_val[l_dq][l_rp]; FAPI_INF("\n the right bound for port=%d rank=%d dq=%d is %d \n",l_p,rank,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[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.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; // #ifdef DBG // 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]); // #endif // 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){ // schmoo_error_map[l_p][rank][l_n]=1; // } l_dq=l_dq+4; } } } rc=do_mcbist_reset(i_target); if(rc) { FAPI_ERR("generic_shmoo::find_bound do_mcbist_reset failed"); return rc; } rc=do_mcbist_test(i_target); if(rc) { 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) { FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); return rc; } //FAPI_INF("\n the status =%d \n",l_status); }while(l_status==1); for (l_p=0;l_pSHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]){ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]; }else{ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]; } if(SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]<=2){ binary_done_map[l_p][rank][l_n]=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.curr_val[l_dq][l_rp]; FAPI_INF("\n the left bound for port=%d rank=%d dq=%d is %d \n",l_p,rank,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[l_dq][l_rp]); } }else{ SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[l_dq][l_rp]; SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[l_dq][l_rp]=(SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]+SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp])/2; //FAPI_INF("\n 2222222 port=%d nibble=%d rank=%d and bit=%d the last pass value %d the last fail value %d and current value %d\n",l_p,l_n,rank,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp],SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp],SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[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.curr_val[l_dq][l_rp]);if(rc) return rc; if(SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]>SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]){ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]; }else{ SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.last_fail[l_dq][l_rp]-SHMOO[scenario].MBA.P[l_p].S[rank].K.last_pass[l_dq][l_rp]; } if(SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_diff[l_dq][l_rp]<=2){ binary_done_map[l_p][rank][l_n]=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.curr_val[l_dq][l_rp]; FAPI_INF("\n the left bound for port=%d rank=%d dq=%d is %d \n",l_p,rank,l_dq,SHMOO[scenario].MBA.P[l_p].S[rank].K.curr_val[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.rb_regval[l_dq][l_rp]=SHMOO[scenario].MBA.P[l_p].S[rank].K.nom_val[l_dq][l_rp]+l_delay; // #ifdef DBG // 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]); // #endif // 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){ // schmoo_error_map[l_p][rank][l_n]=1; // } l_dq=l_dq+4; } } } rc=do_mcbist_reset(i_target); if(rc) { FAPI_ERR("generic_shmoo::find_bound do_mcbist_reset failed"); return rc; } rc=do_mcbist_test(i_target); if(rc) { 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) { FAPI_ERR("generic_shmoo::find_bound do_mcbist_test failed"); return rc; } FAPI_INF("\n the status =%d \n",l_status); }while(l_status==1); for (l_p=0;l_p0)&&(l_cmd_delay<127)){ //l_delay_cac=l_cmd_delay-SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.cmd_nom_val[l_cmd]; FAPI_INF("\n port=%d command=%d nominal =%d and write_value=%d \n",l_p,l_cmd,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.cmd_nom_val[l_cmd],l_cmd_delay); rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,0,l_input_type_e,l_cmd,0,l_cmd_delay);if(rc) return rc; } } for (l_addr=0;l_addr<19;l_addr++) { l_addr_delay = SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.addr_nom_val[l_addr]-l_delay; if((l_addr_delay>0)&&(l_addr_delay<127)){ l_input_type_e = ADDRESS; FAPI_INF("\n port=%d address=%d nominal =%d and write_value=%d \n",l_p,l_addr,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.addr_nom_val[l_addr],l_addr_delay); rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,0,l_input_type_e,l_addr,0,l_addr_delay);if(rc) return rc; } } for (l_cntrl=0;l_cntrl<20;l_cntrl++) { l_cntrl_delay = SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.cntrl_nom_val[l_cntrl]-l_delay; if((l_cntrl_delay>0)&&(l_cntrl_delay<127)){ l_input_type_e = CONTROL; FAPI_INF("\n port=%d control=%d nominal =%d and write_value=%d \n",l_p,l_cntrl,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.cntrl_nom_val[l_cntrl],l_cntrl_delay); rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,0,l_input_type_e,l_cntrl,0,l_cntrl_delay);if(rc) return rc; } } for (l_clk=0;l_clk<8;l_clk++) { l_clk_delay = (SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.clk_nom_val[l_clk]+127)-l_delay; l_input_type_e = CLOCK; FAPI_INF("\n port=%d clock=%d nominal =%d and write_value=%d \n",l_p,l_clk,SHMOO[iv_shmoo_type].MBA.P[l_p].S[i_rnk].K.clk_nom_val[l_clk],l_clk_delay); rc=mss_access_delay_reg(i_target,l_access_type_e,l_p,0,l_input_type_e,l_clk,0,l_clk_delay);if(rc) return rc; } } // put here loops for changing the delay values of CACc 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; } } // PUT HERE NOMINAL BACK . for (l_p=0;l_pl_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_pl_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_pl_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_pl_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_prun rc = FAPI_ATTR_SET(ATTR_MCBIST_TEST_TYPE, &i_target, l_testtype); if(rc) return rc;//---------i_mcbtest------->run } //rc = FAPI_ATTR_SET(ATTR_MCBIST_PATTERN, &i_target,iv_pattern); if(rc) return rc;//-----------i_mcbpatt------->run //rc = FAPI_ATTR_SET(ATTR_MCBIST_TEST_TYPE, &i_target, iv_test_type); if(rc) return rc;//---------i_mcbtest------->run rc = setup_mcbist(i_target,i_mcbbytemask1,0,1,0,l_sub_info);if(rc) return rc; return rc; } }//Extern C