diff options
Diffstat (limited to 'src/vendorcode/mediatek/mt8195/dramc/dramc_pi_calibration_api.c')
-rw-r--r-- | src/vendorcode/mediatek/mt8195/dramc/dramc_pi_calibration_api.c | 2298 |
1 files changed, 934 insertions, 1364 deletions
diff --git a/src/vendorcode/mediatek/mt8195/dramc/dramc_pi_calibration_api.c b/src/vendorcode/mediatek/mt8195/dramc/dramc_pi_calibration_api.c index e73e6e5358ab..ff9fbdd7ec29 100644 --- a/src/vendorcode/mediatek/mt8195/dramc/dramc_pi_calibration_api.c +++ b/src/vendorcode/mediatek/mt8195/dramc/dramc_pi_calibration_api.c @@ -17,7 +17,7 @@ #define PASS_RANGE_NA 0x7fff -#define DIE_NUM_MAX 1 //LP4 only +#define DIE_NUM_MAX 1 static U8 fgwrlevel_done = 0; #if __ETT__ @@ -134,18 +134,18 @@ U32 u4DQ_PI_RK1_backup[2]; U8 u1DVS_increase[RANK_MAX][DQS_BYTE_NUMBER]; #endif -//static U8 gu1DieNum[RANK_MAX]; // 2 rank may have different die number +//static U8 gu1DieNum[RANK_MAX]; static S32 CATrain_CmdDelay[CHANNEL_NUM][RANK_MAX]; static U32 CATrain_CsDelay[CHANNEL_NUM][RANK_MAX]; //static S8 iFirstCAPass[RANK_MAX][DIE_NUM_MAX][CATRAINING_NUM]; //static S8 iLastCAPass[RANK_MAX][DIE_NUM_MAX][CATRAINING_NUM]; -static S32 wrlevel_dqs_final_delay[RANK_MAX][DQS_BYTE_NUMBER]; // 3 is channel number +static S32 wrlevel_dqs_final_delay[RANK_MAX][DQS_BYTE_NUMBER]; //static U16 u2rx_window_sum; -U8 gFinalRXVrefDQForSpeedUp[CHANNEL_NUM][RANK_MAX][2/*ODT_onoff*/][2/*2bytes*/] = {0}; -U32 gDramcImpedanceResult[IMP_VREF_MAX][IMP_DRV_MAX] = {{0,0,0,0},{0,0,0,0},{0,0,0,0}};//ODT_ON/OFF x DRVP/DRVN/ODTP/ODTN +U8 gFinalRXVrefDQForSpeedUp[CHANNEL_NUM][RANK_MAX][2][2] = {0}; +U32 gDramcImpedanceResult[IMP_VREF_MAX][IMP_DRV_MAX] = {{0,0,0,0},{0,0,0,0},{0,0,0,0}}; S16 gu2RX_DQS_Duty_Offset[DQS_BYTE_NUMBER][2]; @@ -179,25 +179,25 @@ static void vSetCalibrationResult(DRAMC_CTX_T *p, U8 ucCalType, U8 ucResult) Pointer_CalResult = &p->aru4CalResultFlag[p->channel][p->rank]; } - if (ucResult == DRAM_FAIL) // Calibration FAIL + if (ucResult == DRAM_FAIL) { - *Pointer_CalExecute |= (1<<ucCalType); // ececution done - *Pointer_CalResult |= (1<<ucCalType); // no result found + *Pointer_CalExecute |= (1<<ucCalType); + *Pointer_CalResult |= (1<<ucCalType); } - else if(ucResult == DRAM_OK) // Calibration OK + else if(ucResult == DRAM_OK) { - *Pointer_CalExecute |= (1<<ucCalType); // ececution done - *Pointer_CalResult &= (~(1<<ucCalType)); // result found + *Pointer_CalExecute |= (1<<ucCalType); + *Pointer_CalResult &= (~(1<<ucCalType)); } - else if(ucResult == DRAM_FAST_K) // FAST K + else if(ucResult == DRAM_FAST_K) { - *Pointer_CalExecute &= (~(1<<ucCalType)); // no ececution - *Pointer_CalResult &= (~(1<<ucCalType)); // result found + *Pointer_CalExecute &= (~(1<<ucCalType)); + *Pointer_CalResult &= (~(1<<ucCalType)); } - else // NO K + else { - *Pointer_CalExecute &= (~(1<<ucCalType)); // no ececution - *Pointer_CalResult |= (1<<ucCalType); // no result found + *Pointer_CalExecute &= (~(1<<ucCalType)); + *Pointer_CalResult |= (1<<ucCalType); } } @@ -230,7 +230,7 @@ void Fast_K_CheckResult(DRAMC_CTX_T *p, U8 ucCalType) { DramcEngine2Init(p, 0x55000000, 0xaa000000 |0x23, TEST_AUDIO_PATTERN, 0, TE_NO_UI_SHIFT); - //Gating Counter Reset + DramPhyReset(p); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 1, MISC_STBCAL2_DQSG_CNT_RST); @@ -255,14 +255,14 @@ void Fast_K_CheckResult(DRAMC_CTX_T *p, U8 ucCalType) if ((FastK_Check_flag==1)&&(CheckResult==0)) { //mcSHOW_DBG_MSG((" [FAST K CHECK]->PASS\n")) - *Pointer_FastKResult &= (~(1<<ucCalType)); // result PASS - *Pointer_FastKExecute |= (1<<ucCalType);; // Excuted + *Pointer_FastKResult &= (~(1<<ucCalType)); + *Pointer_FastKExecute |= (1<<ucCalType);; } else if ((FastK_Check_flag==1)&&(CheckResult !=0)) { //mcSHOW_DBG_MSG((" [FAST K CHECK]->FAIL\n")) - *Pointer_FastKResult |= (1<<ucCalType); // result FAIL - *Pointer_FastKExecute |= (1<<ucCalType);; // Excuted + *Pointer_FastKResult |= (1<<ucCalType); + *Pointer_FastKExecute |= (1<<ucCalType);; } } #endif @@ -310,8 +310,8 @@ void vPrintCalibrationResult(DRAMC_CTX_T *p) { if(ucCalIdx==0) { - ucCalExecute = (U8)p->SWImpCalExecute; //for SW Impedence - ucCalResult = (U8)p->SWImpCalResult; //for SW Impedence + ucCalExecute = (U8)p->SWImpCalExecute; + ucCalResult = (U8)p->SWImpCalResult; } else { @@ -321,7 +321,7 @@ void vPrintCalibrationResult(DRAMC_CTX_T *p) #if PRINT_CALIBRATION_SUMMARY_DETAIL mcSHOW_DBG_MSG(("%s: ", szCalibStatusName[ucCalIdx])) - if(ucCalExecute==1 && ucCalResult ==1) // excuted and fail + if(ucCalExecute==1 && ucCalResult ==1) { u1CalibrationFail =1; mcSHOW_DBG_MSG(("%s\n", "@_@FAIL@_@")) @@ -330,21 +330,21 @@ void vPrintCalibrationResult(DRAMC_CTX_T *p) while (1); #endif } - else if (ucCalExecute==1 && ucCalResult ==0) // DRAM_OK + else if (ucCalExecute==1 && ucCalResult ==0) { mcSHOW_DBG_MSG(("%s\n", "PASS")) } - else if (ucCalExecute==0 && ucCalResult ==0) // DRAM_FAST K + else if (ucCalExecute==0 && ucCalResult ==0) { mcSHOW_DBG_MSG(("%s\n", "FAST K")) } - else //DRAM_NO K + else { mcSHOW_DBG_MSG(("%s\n", "NO K")) } #else - if(ucCalExecute==1 && ucCalResult ==1) // excuted and fail + if(ucCalExecute==1 && ucCalResult ==1) { u1CalibrationFail =1; mcSHOW_DBG_MSG(("%s: %s\n", szCalibStatusName[ucCalIdx],"@_@FAIL@_@")) @@ -431,7 +431,7 @@ void SetDeviationVref(DRAMC_CTX_T *p) for(u1RankIdx=0; u1RankIdx<p->support_rank_num; u1RankIdx++) { vSetRank(p, u1RankIdx); - //CBT + if (gSetSpecificedVref_Enable[Deviation_CA]==ENABLE && ((p->channel==gSetSpecificedVref_Channel[Deviation_CA] && p->rank==gSetSpecificedVref_Rank[Deviation_CA]) || gSetSpecificedVref_All_ChRk[Deviation_CA]==ENABLE)) { deviation_Vref = u1MR12Value[p->channel][p->rank][p->dram_fsp]& 0x3f; @@ -442,7 +442,7 @@ void SetDeviationVref(DRAMC_CTX_T *p) u1MR12Value[p->channel][p->rank][p->dram_fsp]=temp_Vref; mcSHOW_DBG_MSG2(("CBT Channel%d, Rank%d, u1MR12Value = 0x%x\n", p->channel, p->rank, u1MR12Value[p->channel][p->rank][p->dram_fsp])); } - //TX + if (gSetSpecificedVref_Enable[Deviation_TX]==ENABLE && ((p->channel==gSetSpecificedVref_Channel[Deviation_TX] && p->rank==gSetSpecificedVref_Rank[Deviation_TX]) || gSetSpecificedVref_All_ChRk[Deviation_TX]==ENABLE)) { deviation_Vref = u1MR14Value[p->channel][p->rank][p->dram_fsp]& 0x3f; @@ -454,10 +454,10 @@ void SetDeviationVref(DRAMC_CTX_T *p) mcSHOW_DBG_MSG2(("TX Channel%d, Rank%d, u1MR14Value = 0x%x\n", p->channel, p->rank, u1MR14Value[p->channel][p->rank][p->dram_fsp])); } - //RX + if (gSetSpecificedVref_Enable[Deviation_RX]==ENABLE && ((p->channel==gSetSpecificedVref_Channel[Deviation_RX] && p->rank==gSetSpecificedVref_Rank[Deviation_RX]) || gSetSpecificedVref_All_ChRk[Deviation_RX]==ENABLE)) { - //BYTE_0 + deviation_Vref = gFinalRXVrefDQ[p->channel][p->rank][BYTE_0]; DeviationAddVrefOffset(Deviation_RX, NULL, &deviation_Vref, gSetSpecificedVref_Vref_Offset[Deviation_RX]); gFinalRXVrefDQ[p->channel][p->rank][BYTE_0] = deviation_Vref; @@ -466,7 +466,7 @@ void SetDeviationVref(DRAMC_CTX_T *p) P_Fld(deviation_Vref, SHU_B0_PHY_VREF_SEL_RG_RX_ARDQ_VREF_SEL_UB_B0)); mcSHOW_DBG_MSG2(("RX Channel%d, Rank%d, RX Vref B0 = 0x%x\n", p->channel, p->rank, gFinalRXVrefDQ[p->channel][p->rank][BYTE_0])); - //BYTE_1 + deviation_Vref = gFinalRXVrefDQ[p->channel][p->rank][BYTE_1]; DeviationAddVrefOffset(Deviation_RX, NULL, &deviation_Vref, gSetSpecificedVref_Vref_Offset[Deviation_RX]); gFinalRXVrefDQ[p->channel][p->rank][BYTE_1] = deviation_Vref; @@ -489,20 +489,20 @@ void vInitGlobalVariablesByCondition(DRAMC_CTX_T *p) u1MR01Value[FSP_0] = 0x26; u1MR01Value[FSP_1] = 0x56; - u1MR03Value[FSP_0] = 0x31; //Set write post-amble as 0.5 tck - u1MR03Value[FSP_1] = 0x31; //Set write post-amble as 0.5 tck + u1MR03Value[FSP_0] = 0x31; + u1MR03Value[FSP_1] = 0x31; #ifndef ENABLE_POST_PACKAGE_REPAIR - u1MR03Value[FSP_0] |= 0x4; //MR3 OP[2]=1 for PPR protection enabled - u1MR03Value[FSP_1] |= 0x4; //MR3 OP[2]=1 for PPR protection enabled + u1MR03Value[FSP_0] |= 0x4; + u1MR03Value[FSP_1] |= 0x4; #endif #if ENABLE_WRITE_POST_AMBLE_1_POINT_5_TCK - u1MR03Value[FSP_1] |= 0x2; //MR3 OP[1]=1 for Set write post-amble as 1.5 tck, support after Eig_er E2 + u1MR03Value[FSP_1] |= 0x2; #endif - // @Darren, Follow samsung PPR recommend flow + u1MR04Value[RANK_0] = 0x3; u1MR04Value[RANK_1] = 0x3; - // @Darren, for LP4Y single-end mode + u1MR21Value[FSP_0] = 0x0; u1MR21Value[FSP_1] = 0x0; u1MR51Value[FSP_0] = 0x0; @@ -517,8 +517,8 @@ void vInitGlobalVariablesByCondition(DRAMC_CTX_T *p) for (u1RankIdx = 0; u1RankIdx < RANK_MAX; u1RankIdx++) for (u1FSPIdx = 0; u1FSPIdx < p->support_fsp_num; u1FSPIdx++) { - // MR14 default value, LP4 default 0x4d, LP4X 0x5d - u1MR14Value[u1CHIdx][u1RankIdx][u1FSPIdx] = (u1FSPIdx == FSP_0)? 0x5d: 0x18; //0x18: customize for Eig_er + + u1MR14Value[u1CHIdx][u1RankIdx][u1FSPIdx] = (u1FSPIdx == FSP_0)? 0x5d: 0x18; #if FSP1_CLKCA_TERM u1MR12Value[u1CHIdx][u1RankIdx][u1FSPIdx] = (u1FSPIdx == FSP_0)? 0x5d: 0x1b; #else @@ -536,96 +536,92 @@ void vInitGlobalVariablesByCondition(DRAMC_CTX_T *p) const U8 uiLPDDR4_CA_DRAM_Pinmux[PINMUX_MAX][CHANNEL_NUM][6] = { { - // for EMCP - //CH-A + { 3, 1, 0, 5, 7, 4 }, #if (CHANNEL_NUM>1) - //CH-B + { 3, 2, 4, 0, 5, 1 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 3, 1, 0, 5, 7, 4 }, - //CH-D + { 3, 2, 4, 0, 5, 1 }, #endif }, { - // for DSC_2CH, HFID RESERVED - //CH-A + { 5, 2, 1, 3, 4, 0 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 2, 1, 3, 4, 5 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 2, 3, 4, 5 }, - //CH-D + { 0, 1, 2, 3, 4, 5 }, #endif }, { - // for MCP - //CH-A + { 5, 4, 3, 2, 1, 0 }, #if (CHANNEL_NUM>1) - //CH-B + { 4, 5, 2, 0, 3, 1 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 5, 4, 0, 2, 1, 3 }, - //CH-D + { 3, 5, 2, 4, 0, 1 }, #endif }, { - // for DSC_2CH, HFID RESERVED - //CH-A + { 3, 0, 2, 4, 1, 5 }, #if (CHANNEL_NUM>1) - //CH-B + { 4, 1, 0, 2, 3, 5 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 5, 0, 4, 3, 1, 2 }, - //CH-D + { 2, 5, 3, 0, 4, 1 }, @@ -633,30 +629,29 @@ const U8 uiLPDDR4_CA_DRAM_Pinmux[PINMUX_MAX][CHANNEL_NUM][6] = }, }; -//O1 DRAM->APHY + const U8 uiLPDDR4_O1_DRAM_Pinmux[PINMUX_MAX][CHANNEL_NUM][16] = { { - // for EMCP - //CH-A + { 0, 1, 2, 3, 5, 7, 6, 4, 9, 8, 13, 15, 10, 14, 11, 12 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 1, 5, 4, 3, 7, 6, 2, 9, 8, 13, 14, 10, 15, 11, 12 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 2, 3, 5, 7, 6, 4, 9, 8, 13, 15, 10, 14, 11, 12 }, - //CH-D + { 0, 1, 5, 4, 3, 7, 6, 2, 9, 8, 13, 14, 10, 15, 11, 12 @@ -664,26 +659,25 @@ const U8 uiLPDDR4_O1_DRAM_Pinmux[PINMUX_MAX][CHANNEL_NUM][16] = #endif }, { - // for DSC_2CH, HFID RESERVED - //CH-A + { 0, 1, 4, 3, 2, 5, 7, 6, 9, 8, 10, 11, 14, 13, 15, 12 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 1, 2, 4, 5, 3, 7, 6, 8, 9, 10, 11, 15, 14, 13, 12 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, - //CH-D + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 @@ -691,26 +685,25 @@ const U8 uiLPDDR4_O1_DRAM_Pinmux[PINMUX_MAX][CHANNEL_NUM][16] = #endif }, { - // for MCP - //CH-A + { 0, 1, 3, 6, 4, 7, 2, 5, 8, 9, 10, 13, 11, 12, 15, 14 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 1, 4, 7, 3, 5, 6, 2, 9, 8, 10, 12, 11, 14, 13, 15 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 1, 0, 3, 2, 4, 7, 6, 5, 8, 9, 10, 14, 11, 15, 13, 12 }, - //CH-D + { 0, 1, 4, 7, 3, 5, 6, 2, 9, 8, 10, 12, 11, 14, 13, 15 @@ -718,26 +711,25 @@ const U8 uiLPDDR4_O1_DRAM_Pinmux[PINMUX_MAX][CHANNEL_NUM][16] = #endif }, { - // for DSC_180 - //CH-A + { 9, 8, 11, 10, 14, 15, 13, 12, 0, 1, 7, 6, 4, 5, 2, 3 }, #if (CHANNEL_NUM>1) - //CH-B + { 8, 9, 11, 10, 12, 14, 13, 15, 1, 0, 5, 6, 3, 2, 7, 4 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 7, 6, 4, 5, 2, 3, 9, 8, 11, 10, 14, 15, 13, 12 }, - //CH-D + { 1, 0, 5, 6, 3, 2, 7, 4, 8, 9, 11, 10, 12, 14, 13, 15 @@ -746,28 +738,28 @@ const U8 uiLPDDR4_O1_DRAM_Pinmux[PINMUX_MAX][CHANNEL_NUM][16] = }, }; -//CA DRAM->APHY + #if (CA_PER_BIT_DELAY_CELL || PINMUX_AUTO_TEST_PER_BIT_CA) U8 uiLPDDR4_CA_Mapping_POP[CHANNEL_NUM][6] = { - //CH-A + { 2, 1, 0, 5, 3, 4 }, #if (CHANNEL_NUM>1) - //CH-B + { 3, 5, 1, 0, 2, 4 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 2, 1, 0, 5, 3, 4 }, - //CH-D + { 3, 5, 1, 0, 2, 4 }, @@ -775,28 +767,28 @@ U8 uiLPDDR4_CA_Mapping_POP[CHANNEL_NUM][6] = }; #endif -//O1 DRAM->APHY + U8 uiLPDDR4_O1_Mapping_POP[CHANNEL_NUM][16] = { - //CH-A + { 0, 1, 2, 3, 5, 7, 6, 4, 9, 8, 13, 15, 10, 14, 11, 12 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 1, 5, 4, 3, 7, 6, 2, 9, 8, 13, 14, 10, 15, 11, 12 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 2, 3, 5, 7, 6, 4, 9, 8, 13, 15, 10, 14, 11, 12 }, - //CH-D + { 0, 1, 5, 4, 3, 7, 6, 2, 9, 8, 13, 14, 10, 15, 11, 12 @@ -824,7 +816,7 @@ static void ImpedanceTracking_DisImpHw_Setting(DRAMC_CTX_T *p, U8 u1DisImpHw) | P_Fld(1, MISC_SHU_IMPEDAMCE_UPD_DIS1_WCK_ODTN_UPD_DIS)); #if (fcFOR_CHIP_ID == fc8195) - //WCK_ODTN_UPD_DIS is used as the swith of mux for B1/CA swap here. + if (p->DRAMPinmux == PINMUX_DSC){ vIO32WriteFldAlign(DDRPHY_REG_MISC_SHU_IMPEDAMCE_UPD_DIS1, 1, MISC_SHU_IMPEDAMCE_UPD_DIS1_WCK_ODTN_UPD_DIS); }else{ @@ -850,20 +842,19 @@ void vBeforeCalibration(DRAMC_CTX_T *p) DramcRxInputDelayTrackingInit_byFreq(p); #endif - DramcHWGatingOnOff(p, 0); //disable gating tracking + DramcHWGatingOnOff(p, 0); - CKEFixOnOff(p, TO_ALL_RANK, CKE_FIXON, TO_ALL_CHANNEL); //Let CLK always on during calibration + CKEFixOnOff(p, TO_ALL_RANK, CKE_FIXON, TO_ALL_CHANNEL); #if ENABLE_TMRRI_NEW_MODE - SetCKE2RankIndependent(p); //CKE should be controlled independently + SetCKE2RankIndependent(p); #endif - //WDBI-OFF + vIO32WriteFldAlign_All(DRAMC_REG_SHU_TX_SET0, 0x0, SHU_TX_SET0_DBIWR); #ifdef IMPEDANCE_TRACKING_ENABLE - // set correct setting to control IMPCAL HW Tracking in shuffle RG - // if p->freq >= 1333, enable IMP HW tracking(SHU_DRVING1_DIS_IMPCAL_HW=0), else SHU_DRVING1_DIS_IMPCAL_HW = 1 + U8 u1DisImpHw; U32 u4TermFreq, u4WbrBackup; @@ -883,41 +874,39 @@ void vBeforeCalibration(DRAMC_CTX_T *p) vIO32WriteFldMulti_All(DRAMC_REG_SHU_ZQ_SET0, - P_Fld(0x1ff, SHU_ZQ_SET0_ZQCSCNT) | //Every refresh number to issue ZQCS commands, only for DDR3/LPDDR2/LPDDR3/LPDDR4 + P_Fld(0x1ff, SHU_ZQ_SET0_ZQCSCNT) | P_Fld(0x1b, SHU_ZQ_SET0_TZQLAT)); if (p->support_channel_num == CHANNEL_SINGLE) { - //single channel, ZQCSDUAL=0, ZQCSMASK=0 + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_ZQ_SET0), P_Fld(0, ZQ_SET0_ZQCSDUAL) | P_Fld(0x0, ZQ_SET0_ZQCSMASK)); } else if (p->support_channel_num == CHANNEL_DUAL) { - // HW ZQ command is channel interleaving since 2 channel share the same ZQ pin. + #ifdef ZQCS_ENABLE_LP4 - // dual channel, ZQCSDUAL =1, and CHA ZQCSMASK=0, CHB ZQCSMASK=1 + vIO32WriteFldMulti_All(DRAMC_REG_ZQ_SET0, P_Fld(1, ZQ_SET0_ZQCSDUAL) | P_Fld(0, ZQ_SET0_ZQCSMASK_OPT) | P_Fld(0, ZQ_SET0_ZQMASK_CGAR) | P_Fld(0, ZQ_SET0_ZQCS_MASK_SEL_CGAR)); - // DRAMC CHA(CHN0):ZQCSMASK=1, DRAMC CHB(CHN1):ZQCSMASK=0. - // ZQCSMASK setting: (Ch A, Ch B) = (1,0) or (0,1) - // if CHA.ZQCSMASK=1, and then set CHA.ZQCALDISB=1 first, else set CHB.ZQCALDISB=1 first + vIO32WriteFldAlign(DRAMC_REG_ZQ_SET0 + (CHANNEL_A << POS_BANK_NUM), 1, ZQ_SET0_ZQCSMASK); vIO32WriteFldAlign(DRAMC_REG_ZQ_SET0 + SHIFT_TO_CHB_ADDR, 0, ZQ_SET0_ZQCSMASK); - // DRAMC CHA(CHN0):ZQ_SET0_ZQCS_MASK_SEL=0, DRAMC CHB(CHN1):ZQ_SET0_ZQCS_MASK_SEL=0. + vIO32WriteFldAlign_All(DRAMC_REG_ZQ_SET0, 0, ZQ_SET0_ZQCS_MASK_SEL); #endif } #if (CHANNEL_NUM > 2) else if (p->support_channel_num == CHANNEL_FOURTH) { - // HW ZQ command is channel interleaving since 2 channel share the same ZQ pin. + #ifdef ZQCS_ENABLE_LP4 - // dual channel, ZQCSDUAL =1, and CHA ZQCSMASK=0, CHB ZQCSMASK=1 + vIO32WriteFldMulti_All(DRAMC_REG_ZQ_SET0, P_Fld(1, ZQ_SET0_ZQCSDUAL) | P_Fld(0, ZQ_SET0_ZQCALL) | @@ -926,9 +915,7 @@ void vBeforeCalibration(DRAMC_CTX_T *p) P_Fld(0, ZQ_SET0_ZQMASK_CGAR) | P_Fld(0, ZQ_SET0_ZQCS_MASK_SEL_CGAR)); - // DRAMC CHA(CHN0):ZQCSMASK=1, DRAMC CHB(CHN1):ZQCSMASK=0. - // ZQCSMASK setting: (Ch A, Ch C) = (1,0) or (0,1), (Ch B, Ch D) = (1,0) or (0,1) - // if CHA.ZQCSMASK=1, and then set CHA.ZQCALDISB=1 first, else set CHB.ZQCALDISB=1 first + #if fcFOR_CHIP_ID == fcPetrus vIO32WriteFldAlign(DRAMC_REG_ZQ_SET0 + (CHANNEL_A << POS_BANK_NUM), 1, ZQ_SET0_ZQCSMASK); vIO32WriteFldAlign(DRAMC_REG_ZQ_SET0 + (CHANNEL_B << POS_BANK_NUM), 0, ZQ_SET0_ZQCSMASK); @@ -941,13 +928,13 @@ void vBeforeCalibration(DRAMC_CTX_T *p) vIO32WriteFldAlign(DRAMC_REG_ZQ_SET0 + (CHANNEL_D << POS_BANK_NUM), 0, ZQ_SET0_ZQCSMASK); #endif - // DRAMC CHA(CHN0):ZQ_SET0_ZQCS_MASK_SEL=0, DRAMC CHB(CHN1):ZQ_SET0_ZQCS_MASK_SEL=0. + vIO32WriteFldAlign_All(DRAMC_REG_ZQ_SET0, 0, ZQ_SET0_ZQCS_MASK_SEL); #endif } #endif - // Set 0 to be able to adjust TX DQS/DQ/DQM PI during calibration, for new cross rank mode. + vIO32WriteFldAlign_All(DDRPHY_REG_SHU_B0_DQ2, 0, SHU_B0_DQ2_RG_ARPI_OFFSET_LAT_EN_B0); if (!isLP4_DSC) vIO32WriteFldAlign_All(DDRPHY_REG_SHU_B1_DQ2, 0, SHU_B1_DQ2_RG_ARPI_OFFSET_LAT_EN_B1); @@ -957,15 +944,14 @@ void vBeforeCalibration(DRAMC_CTX_T *p) #if ENABLE_PA_IMPRO_FOR_TX_AUTOK vIO32WriteFldAlign_All(DRAMC_REG_DCM_SUB_CTRL, 0x0, DCM_SUB_CTRL_SUBCLK_CTRL_TX_AUTOK); #endif - // ARPI_DQ SW mode mux, TX DQ use 1: PHY Reg 0: DRAMC Reg + #if ENABLE_PA_IMPRO_FOR_TX_TRACKING vIO32WriteFldAlign_All(DRAMC_REG_DCM_SUB_CTRL, 0, DCM_SUB_CTRL_SUBCLK_CTRL_TX_TRACKING); #endif - //Darren-vIO32WriteFldAlign_All(DDRPHY_REG_MISC_CTRL1, 1, MISC_CTRL1_R_DMARPIDQ_SW); @Darren, remove to LP4_UpdateInitialSettings - //Disable HW MR18/19 to prevent fail case when doing SW MR18/19 in DQSOSCAuto + vIO32WriteFldAlign_All(DRAMC_REG_DQSOSCR, 0x1, DQSOSCR_DQSOSCRDIS); - vIO32WriteFldAlign_All(DRAMC_REG_REFCTRL0, 0x1, REFCTRL0_REFDIS); //disable refresh + vIO32WriteFldAlign_All(DRAMC_REG_REFCTRL0, 0x1, REFCTRL0_REFDIS); vIO32WriteFldAlign_All(DRAMC_REG_SHU_MATYPE, u1MaType, SHU_MATYPE_MATYPE); @@ -983,10 +969,10 @@ void vAfterCalibration(DRAMC_CTX_T *p) EnableDRAMModeRegWriteDBIAfterCalibration(p); #endif - SetMr13VrcgToNormalOperation(p);// Set VRCG{MR13[3]} to 0 + SetMr13VrcgToNormalOperation(p); - CKEFixOnOff(p, TO_ALL_RANK, CKE_DYNAMIC, TO_ALL_CHANNEL); //After CKE FIX on/off, CKE should be returned to dynamic (control by HW) + CKEFixOnOff(p, TO_ALL_RANK, CKE_DYNAMIC, TO_ALL_CHANNEL); vIO32WriteFldAlign_All(DRAMC_REG_DUMMY_RD, p->support_rank_num, DUMMY_RD_RANK_NUM); @@ -1002,24 +988,24 @@ void vAfterCalibration(DRAMC_CTX_T *p) } #endif - //@Darren, KaiHsin sync MP setting + vIO32WriteFldAlign_All(DDRPHY_REG_MISC_CG_CTRL7, 0, MISC_CG_CTRL7_CK_BFE_DCM_EN); - /* TESTAGENT2 for @Chris sync MP settings*/ - vIO32WriteFldAlign_All(DRAMC_REG_TEST2_A4, 4, TEST2_A4_TESTAGENTRKSEL); // Rank selection is controlled by Test Agent - vIO32WriteFldAlign_All(DRAMC_REG_TEST2_A2, 0x20, TEST2_A2_TEST2_OFF); //@Chris, MP setting for runtime TA2 Length - //@Darren, CW sync MP setting + vIO32WriteFldAlign_All(DRAMC_REG_TEST2_A4, 4, TEST2_A4_TESTAGENTRKSEL); + vIO32WriteFldAlign_All(DRAMC_REG_TEST2_A2, 0x20, TEST2_A2_TEST2_OFF); + + vIO32WriteFldAlign_All(DDRPHY_REG_MISC_DUTYSCAN1, 0, MISC_DUTYSCAN1_DQSERRCNT_DIS); - //@Darren, HJ sync MP setting + vIO32WriteFldAlign_All(DDRPHY_REG_MISC_CTRL1, 0, MISC_CTRL1_R_DMSTBENCMP_RK_OPT); } static void O1PathOnOff(DRAMC_CTX_T *p, U8 u1OnOff) { BOOL isLP4_DSC = (p->DRAMPinmux == PINMUX_DSC)?1:0; - #if 0//O1_SETTING_RESTORE + #if 0 const U32 u4O1RegBackupAddress[] = { (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_VREF)), @@ -1035,16 +1021,14 @@ static void O1PathOnOff(DRAMC_CTX_T *p, U8 u1OnOff) if (u1OnOff == ON) { - // These RG will be restored when leaving each calibration flow - // ------------------------------------------------------- - // VREF_UNTERM_EN + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_VREF), 1, SHU_B0_VREF_RG_RX_ARDQ_VREF_UNTERM_EN_B0); if (!isLP4_DSC) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_VREF), 1, SHU_B1_VREF_RG_RX_ARDQ_VREF_UNTERM_EN_B1); else vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_VREF), 1, SHU_CA_VREF_RG_RX_ARCA_VREF_UNTERM_EN_CA); - u1VrefSel = 0x37;//unterm LP4 + u1VrefSel = 0x37; vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_PHY_VREF_SEL), P_Fld(u1VrefSel, SHU_B0_PHY_VREF_SEL_RG_RX_ARDQ_VREF_SEL_LB_B0) | @@ -1063,9 +1047,7 @@ static void O1PathOnOff(DRAMC_CTX_T *p, U8 u1OnOff) } } - // DQ_O1 enable/release - // ------------------------------------------------------- - // Actually this RG naming is O1_EN in APHY + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ6), u1OnOff, B0_DQ6_RG_RX_ARDQ_O1_SEL_B0); if (!isLP4_DSC) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ6), u1OnOff, B1_DQ6_RG_RX_ARDQ_O1_SEL_B1); @@ -1073,7 +1055,7 @@ static void O1PathOnOff(DRAMC_CTX_T *p, U8 u1OnOff) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD6), u1OnOff, CA_CMD6_RG_RX_ARCMD_O1_SEL); - // DQ_IN_BUFF_EN + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ3), P_Fld(u1OnOff, B0_DQ3_RG_RX_ARDQ_IN_BUFF_EN_B0) | P_Fld(u1OnOff, B0_DQ3_RG_RX_ARDQS0_IN_BUFF_EN_B0)); @@ -1090,14 +1072,14 @@ static void O1PathOnOff(DRAMC_CTX_T *p, U8 u1OnOff) P_Fld(u1OnOff, CA_CMD3_RG_RX_ARCLK_IN_BUFF_EN)); } - // DQ_BUFF_EN_SEL + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_PHY3), u1OnOff, B0_PHY3_RG_RX_ARDQ_BUFF_EN_SEL_B0); if (!isLP4_DSC) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_PHY3), u1OnOff, B1_PHY3_RG_RX_ARDQ_BUFF_EN_SEL_B1); else vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_CA_PHY3), u1OnOff, CA_PHY3_RG_RX_ARCA_BUFF_EN_SEL_CA); - // Gating always ON + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_RX_IN_GATE_EN_CTRL),(u1OnOff << 1) | u1OnOff, MISC_RX_IN_GATE_EN_CTRL_FIX_IN_GATE_EN); mcDELAY_US(1); @@ -1127,15 +1109,7 @@ static u8 get_autok_sweep_max_cnt(u8 lenpi, u8 respi) return lenpi > max? max: lenpi; } -/* - * cbt_wlev_train_autok -- ca/cs/dqs autok - * @mode: ca or cs select, 0 for ca, 1 for cs - * @initpi: init pi select - * @lenpi: sweep how many pi step, 0 ~ 63 - * @respi: sweep pi resolution, 00 for 1 pi, 01 for 2 pi, 10 for 4 pi, 11 for 8 pi - * - * autok result store to @cmp0 and @cmp1. - */ + static int cbt_wlev_train_autok(DRAMC_CTX_T *p, ATUOK_MODE_T autok_mode, u8 initpi, u8 lenpi, u8 respi, @@ -1146,10 +1120,7 @@ static int cbt_wlev_train_autok(DRAMC_CTX_T *p, ATUOK_MODE_T autok_mode, u8 sweep_max_cnt, i; u32 cnt, ready; - /* - * it's takes 3.6us for one step. - * max times is 64, about 3.6 * 64 = 231us - */ + cnt = TIME_OUT_CNT * 3; switch (autok_mode){ @@ -1292,11 +1263,7 @@ static int cbt_wlev_train_autok(DRAMC_CTX_T *p, ATUOK_MODE_T autok_mode, return 0; } #endif -/* - * set_cbt_intv -- set interval related rg according to speed. - * - * TODO, move these to ACTimingTable ????!!! - */ + struct cbt_intv { DRAM_PLL_FREQ_SEL_T freq_sel; @@ -1342,94 +1309,94 @@ static void set_cbt_wlev_intv_lp4(DRAMC_CTX_T *p) { LP4_DDR4266, DIV8_MODE, - 17, /*tcmdo1lat*/ - 14, /* catrain_intv */ - 19, /* new_cbt_pat_intv */ - 19, /* wlev_dqspat_lat */ + 17, + 14, + 19, + 19, }, { LP4_DDR3733, DIV8_MODE, - 16, /*tcmdo1lat*/ - 13, /* catrain_intv */ - 18, /* new_cbt_pat_intv */ - 18, /* wlev_dqspat_lat */ + 16, + 13, + 18, + 18, }, { LP4_DDR3200, DIV8_MODE, - 14, /*tcmdo1lat*/ - 11, /* catrain_intv */ - 16, /* new_cbt_pat_intv */ - 16, /* wlev_dqspat_lat */ + 14, + 11, + 16, + 16, }, { LP4_DDR2667, DIV8_MODE, - 13, /*tcmdo1lat*/ - 10, /* catrain_intv */ - 15, /* new_cbt_pat_intv */ - 15, /* wlev_dqspat_lat */ + 13, + 10, + 15, + 15, }, { LP4_DDR2400, DIV8_MODE, - 12, /*tcmdo1lat*/ - 9, /* catrain_intv */ - 14, /* new_cbt_pat_intv */ - 14, /* wlev_dqspat_lat */ + 12, + 9, + 14, + 14, }, { LP4_DDR1866, DIV8_MODE, - 11, /*tcmdo1lat*/ - 9, /* catrain_intv */ - 13, /* new_cbt_pat_intv */ - 13, /* wlev_dqspat_lat */ + 11, + 9, + 13, + 13, }, { LP4_DDR1600, DIV8_MODE, - 10, /*tcmdo1lat*/ - 8, /* catrain_intv */ - 12, /* new_cbt_pat_intv */ - 12, /* wlev_dqspat_lat */ + 10, + 8, + 12, + 12, }, { LP4_DDR1200, DIV8_MODE, - 9, /*tcmdo1lat*/ - 8, /* catrain_intv */ - 11, /* new_cbt_pat_intv */ - 11, /* wlev_dqspat_lat */ + 9, + 8, + 11, + 11, }, { LP4_DDR800, DIV8_MODE, - 8, /*tcmdo1lat*/ - 8, /* catrain_intv */ - 10, /* new_cbt_pat_intv */ - 10, /* wlev_dqspat_lat */ + 8, + 8, + 10, + 10, }, { LP4_DDR1600, DIV4_MODE, - 16, /*tcmdo1lat*/ - 13, /* catrain_intv */ - 16, /* new_cbt_pat_intv */ - 16, /* wlev_dqspat_lat */ + 16, + 13, + 16, + 16, }, { LP4_DDR1200, DIV4_MODE, - 14, /*tcmdo1lat*/ - 13, /* catrain_intv */ - 14, /* new_cbt_pat_intv */ - 14, /* wlev_dqspat_lat */ + 14, + 13, + 14, + 14, }, { LP4_DDR800, DIV4_MODE, - 12, /*tcmdo1lat*/ - 13, /* catrain_intv */ - 12, /* new_cbt_pat_intv */ - 12, /* wlev_dqspat_lat */ + 12, + 13, + 12, + 12, }, { LP4_DDR400, DIV4_MODE, - 12, /*tcmdo1lat*/ - 13, /* catrain_intv */ - 12, /* new_cbt_pat_intv */ - 12, /* wlev_dqspat_lat */ + 12, + 13, + 12, + 12, }, }; @@ -1451,21 +1418,21 @@ static void set_cbt_wlev_intv(DRAMC_CTX_T *p) } #if SIMUILATION_CBT == 1 -/* To process LPDDR5 Pinmux */ + struct cbt_pinmux { - u8 dram_dq_b0; /* EMI_B0 is mapped to which DRAMC byte ?? */ + u8 dram_dq_b0; u8 dram_dq_b1; - u8 dram_dmi_b0; /* EMI_DMI0 is mapped to which DRAMC DMI ?? */ + u8 dram_dmi_b0; u8 dram_dmi_b1; - u8 dram_dq7_b0; /* EMI_DQ7 is mapped to which DRAMC DQ ?? */ - u8 dram_dq7_b1; /* EMI_DQ15 is mapped to which DRAMC DQ ?? */ + u8 dram_dq7_b0; + u8 dram_dq7_b1; }; -/* Per-project definition */ + static struct cbt_pinmux lp4_cp[CHANNEL_NUM] = { { - /* CHA */ + .dram_dq_b0 = 0, .dram_dq_b1 = 1, @@ -1474,7 +1441,7 @@ static struct cbt_pinmux lp4_cp[CHANNEL_NUM] = { }, #if (CHANNEL_NUM>1) { - /* CHB */ + .dram_dq_b0 = 0, .dram_dq_b1 = 1, @@ -1484,7 +1451,7 @@ static struct cbt_pinmux lp4_cp[CHANNEL_NUM] = { #endif #if (CHANNEL_NUM>2) { - /* CHC */ + .dram_dq_b0 = 0, .dram_dq_b1 = 1, @@ -1492,7 +1459,7 @@ static struct cbt_pinmux lp4_cp[CHANNEL_NUM] = { .dram_dmi_b1 = 1, }, { - /* CHD */ + .dram_dq_b0 = 0, .dram_dq_b1 = 1, @@ -1504,7 +1471,7 @@ static struct cbt_pinmux lp4_cp[CHANNEL_NUM] = { #if 0 static struct cbt_pinmux lp5_cp[CHANNEL_NUM] = { { - /* CHA */ + .dram_dq_b0 = 1, .dram_dq_b1 = 0, @@ -1516,7 +1483,7 @@ static struct cbt_pinmux lp5_cp[CHANNEL_NUM] = { }, #if (CHANNEL_NUM > 1) { - /* CHB */ + .dram_dq_b0 = 1, .dram_dq_b1 = 0, @@ -1538,7 +1505,7 @@ static void vSetDramMRCBTOnOff(DRAMC_CTX_T *p, U8 u1OnOff, U8 operating_fsp) { if (u1OnOff) { - // op[7] = !(p->dram_fsp), dram will switch to another FSP_OP automatically + if (operating_fsp) { MRWriteFldMulti(p, 13, P_Fld(0, MR13_FSP_OP) | @@ -1557,15 +1524,14 @@ static void vSetDramMRCBTOnOff(DRAMC_CTX_T *p, U8 u1OnOff, U8 operating_fsp) if (p->dram_cbt_mode[p->rank] == CBT_BYTE_MODE1) { vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), P_Fld(1, CBT_WLEV_CTRL0_BYTEMODECBTEN) | - P_Fld(1, CBT_WLEV_CTRL0_CBT_CMP_BYTEMODE)); //BYTEMODECBTEN=1 + P_Fld(1, CBT_WLEV_CTRL0_CBT_CMP_BYTEMODE)); } } else { if (operating_fsp) { - // !! Remain MR13_FSP_OP = 0, because of system is at low frequency now. - // @Darren, Fix high freq keep FSP0 for CA term workaround (PPR abnormal) + MRWriteFldMulti(p, 13, P_Fld(0, MR13_FSP_OP) | P_Fld(1, MR13_FSP_WR) | P_Fld(0, MR13_CBT), @@ -1596,20 +1562,19 @@ static void CBTEntryLP4(DRAMC_CTX_T *p, U8 operating_fsp, U16 operation_frequenc CKEFixOnOff(p, p->rank, CKE_FIXON, TO_ONE_CHANNEL); - // yr: CA train old mode and CS traing need to check MRSRK at this point + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1GetRank(p), SWCMD_CTRL0_MRSRK); - //Step 0: MRW MR13 OP[0]=1 to enable CBT + vSetDramMRCBTOnOff(p, ENABLE, operating_fsp); - //Step 0.1: before CKE low, Let DQS=0 by R_DMwrite_level_en=1, spec: DQS_t has to retain a low level during tDQSCKE period + if (p->dram_cbt_mode[p->rank] == CBT_NORMAL_MODE) { vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), 1, CBT_WLEV_CTRL0_WRITE_LEVEL_EN); - //TODO, pinmux - //force byte0 tx + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), 0x1, CBT_WLEV_CTRL0_DQSOEAOEN); @@ -1619,34 +1584,33 @@ static void CBTEntryLP4(DRAMC_CTX_T *p, U8 operating_fsp, U16 operation_frequenc mcDELAY_US(1); - //Step 1.0: let CKE go low + CKEFixOnOff(p, p->rank, CKE_FIXOFF, TO_ONE_CHANNEL); - // Adjust u1MR13Value + (operating_fsp == FSP_1)? DramcMRWriteFldAlign(p, 13, 1, MR13_FSP_OP, JUST_TO_GLOBAL_VALUE): DramcMRWriteFldAlign(p, 13, 0, MR13_FSP_OP, JUST_TO_GLOBAL_VALUE); - // Step 1.1 : let IO to O1 path valid + if (p->dram_cbt_mode[p->rank] == CBT_NORMAL_MODE) { - // Let R_DMFIXDQIEN1=1 (byte1), 0xd8[13] ==> Note: Do not enable again. - //Currently set in O1PathOnOff + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_PADCTRL), 0x3, PADCTRL_FIXDQIEN); - // Let DDRPHY RG_RX_ARDQ_SMT_EN_B1=1 (byte1) + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_B1_DQ3), 1, B1_DQ3_RG_RX_ARDQ_SMT_EN_B1); O1PathOnOff(p, ON); } if (p->dram_cbt_mode[p->rank] == CBT_BYTE_MODE1) { - // let IO to O1 path valid by DDRPHY RG_RX_ARDQ_SMT_EN_B0=1 + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_B0_DQ3), 1, B0_DQ3_RG_RX_ARDQ_SMT_EN_B0); O1PathOnOff(p, ON); } - // Wait tCAENT + mcDELAY_US(1); } @@ -1656,61 +1620,48 @@ static void CBTExitLP4(DRAMC_CTX_T *p, U8 operating_fsp, U8 operation_frequency) if (p->dram_cbt_mode[p->rank] == CBT_NORMAL_MODE || p->dram_cbt_mode[p->rank] == CBT_BYTE_MODE1) { - //Step 1: CKE go high (Release R_DMCKEFIXOFF, R_DMCKEFIXON=1) + CKEFixOnOff(p, p->rank, CKE_FIXON, TO_ONE_CHANNEL); - //Step 2:wait tCATX, wait tFC + mcDELAY_US(1); - //Step 3: MRW to command bus training exit (MR13 OP[0]=0 to disable CBT) + vSetDramMRCBTOnOff(p, DISABLE, operating_fsp); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), 0, CBT_WLEV_CTRL0_WRITE_LEVEL_EN); } - //Step 4: - //Disable O1 path output + if (p->dram_cbt_mode[p->rank] == CBT_NORMAL_MODE) { - //Let DDRPHY RG_RX_ARDQ_SMT_EN_B1=0 + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_B1_DQ3), 0, B1_DQ3_RG_RX_ARDQ_SMT_EN_B1); O1PathOnOff(p, OFF); - //Let FIXDQIEN1=0 ==> Note: Do not enable again. - //Moved into O1PathOnOff + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_PADCTRL), 0, PADCTRL_FIXDQIEN); } if (p->dram_cbt_mode[p->rank] == CBT_BYTE_MODE1) { - //Let DDRPHY RG_RX_ARDQ_SMT_EN_B0=0 + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_B0_DQ3), 0, B0_DQ3_RG_RX_ARDQ_SMT_EN_B0); O1PathOnOff(p, OFF); - //Disable Byte mode CBT enable bit + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), P_Fld(0, CBT_WLEV_CTRL0_BYTEMODECBTEN) | - P_Fld(0, CBT_WLEV_CTRL0_CBT_CMP_BYTEMODE)); //BYTEMODECBTEN=1 + P_Fld(0, CBT_WLEV_CTRL0_CBT_CMP_BYTEMODE)); } - // Wait tCAENT + mcDELAY_US(1); } -/* - * get_mck_ck_ratio -- get ratio of mck:ck - * - * TODO, remove later, get the ratio from dram ctx dfs table!!!! - * - * - * return 1 means 1:1 - * return 0 means 1:2 - */ + static u8 get_mck_ck_ratio(DRAMC_CTX_T *p) { - /* - * as per DE's comments, LP5 mck:ck has only 1:1 and 1:2. - * read SHU_LP5_CMD.LP5_CMD1TO2EN to decide which one. - */ + u32 ratio; //u32 ui_max; @@ -1726,17 +1677,7 @@ static u8 get_cbtui_adjustable_maxvalue(DRAMC_CTX_T *p) { u8 ratio; - /* - * MCK:CK=1:1, - * ther are only 0~1 for ui adjust, if ui value is larger than 1, adjust MCK. - * - * MCK:CK=1:2, - * ther are only 0~3 for ui adjust, if ui value is larger than 3, adjust MCK. - * - * MCK:CK=1:4, (for LP4) - * ther are only 0~7 for ui adjust, if ui value is larger than 7, adjust MCK. - * - */ + ratio = (vGet_Div_Mode(p) == DIV4_MODE) ? 3 : 7; return ratio; @@ -1781,8 +1722,7 @@ static inline void put_ca_ui(DRAMC_CTX_T *p, u32 ca_ui) vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SHU_SELPH_CA7), dly); - // Note: CKE UI must sync CA UI (CA and CKE delay circuit are same) @Lin-Yi - // To avoid tXP timing margin issue + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_SELPH_CA5), ca_ui & 0xF, SHU_SELPH_CA5_DLY_CKE); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_SELPH_CA6), ca_ui & 0xF, SHU_SELPH_CA6_DLY_CKE1); } @@ -1884,13 +1824,7 @@ static inline void put_cs_ui(DRAMC_CTX_T *p, u32 cs_ui) cs_ui, SHU_SELPH_CA5_DLY_CS); } -//void LP5_ShiftCSUI(DRAMC_CTX_T *p, S8 iShiftUI) -//{ -// REG_TRANSFER_T TransferUIRegs = {DRAMC_REG_SHU_SELPH_CA5, SHU_SELPH_CA5_DLY_CS}; -// REG_TRANSFER_T TransferMCKRegs = {DRAMC_REG_SHU_SELPH_CA1, SHU_SELPH_CA1_TXDLY_CS}; -// -// ExecuteMoveDramCDelay(p, TransferUIRegs[i], TransferMCKRegs[i], iShiftUI); -//} + static S16 adjust_cs_ui(DRAMC_CTX_T *p, u32 cs_mck, u32 cs_ui, S16 pi_dly) { @@ -1912,10 +1846,10 @@ static S16 adjust_cs_ui(DRAMC_CTX_T *p, u32 cs_mck, u32 cs_ui, S16 pi_dly) ratio = get_mck_ck_ratio(p); if (ratio) { - /* 1:1 */ + cs_bit_mask = 1; } else { - /* 1:2 */ + cs_bit_mask = 3; } @@ -1990,7 +1924,7 @@ void CmdOEOnOff(DRAMC_CTX_T *p, U8 u1OnOff, CMDOE_DIS_CHANNEL CmdOeDisChannelNUM | P_Fld(0xff, B1_DQ2_RG_TX_ARDQ_OE_TIE_EN_B1)); } } - else//(CmdOeDisChannelNUM ==CMDOE_DIS_TO_ONE_CHANNEL) + else { if (!isLP4_DSC) { @@ -2012,7 +1946,7 @@ void CmdOEOnOff(DRAMC_CTX_T *p, U8 u1OnOff, CMDOE_DIS_CHANNEL CmdOeDisChannelNUM void CBTDelayCACLK(DRAMC_CTX_T *p, S32 iDelay) { if (iDelay < 0) - { /* Set CLK delay */ + { vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_CA_CMD0), P_Fld(0, SHU_R0_CA_CMD0_RG_ARPI_CMD) | P_Fld(-iDelay, SHU_R0_CA_CMD0_RG_ARPI_CLK) | @@ -2030,7 +1964,7 @@ void CBTDelayCACLK(DRAMC_CTX_T *p, S32 iDelay) } */ else - { /* Set CA output delay */ + { // DramcCmdUIDelaySetting(p, 0); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_CA_CMD0), @@ -2041,13 +1975,7 @@ void CBTDelayCACLK(DRAMC_CTX_T *p, S32 iDelay) } #if CBT_AUTO_K_SUPPORT -/* - * cbt_catrain_autok -- ca autok - * @initpi: init pi select - * @steps: sweep how many pi step, 1 ~ 64 - * @respi: step resolution, 0,1,2,3. that means 1, 2, 4, 8 pis - * - */ + #if 0 static int cbt_catrain_autok(DRAMC_CTX_T *p, u8 initpi, u8 steps, u8 respi, @@ -2081,17 +2009,7 @@ static int cbt_cstrain_autok(DRAMC_CTX_T *p, initpi, lenpi, respi, cmp0, cmp1, 1); } -/* - * cbt_catrain_autok_next_window -- find next zero window - * @bitmap: window map - * @start_pos: start position to find - * @initpi: init pi select - * @steps: sweep how many pi step, 1 ~ 64 - * @respi: step resolution, 0, 1, 2, 3 - * @pwin: window boundary to store - * - * return 1 if found window, 0 otherwise. - */ + static int cbt_catrain_autok_next_window(DRAMC_CTX_T *p, u32 *bitmap, u8 start_pos, u8 initpi, u8 steps, u8 respi, @@ -2139,9 +2057,7 @@ static void cbt_autok_maxwindow(DRAMC_CTX_T *p, if (!res) { - /* - * autok not find pass window - */ + mcSHOW_DBG_MSG2(("no window @pi [%d, %d]\n", uiDelay + start_pos, uiDelay + pi_step - 1)); @@ -2149,8 +2065,8 @@ static void cbt_autok_maxwindow(DRAMC_CTX_T *p, if ((*iFirstPass != PASS_RANGE_NA) && (*iLastPass == PASS_RANGE_NA)) { - /* window has left boundary */ - if ((uiDelay - *iFirstPass) < 5) /* prevent glitch */ + + if ((uiDelay - *iFirstPass) < 5) { *iFirstPass = PASS_RANGE_NA; } @@ -2160,19 +2076,17 @@ static void cbt_autok_maxwindow(DRAMC_CTX_T *p, } } - /* ca no pass window yet, break while-1 loop */ + break; } else { - /* - * autok find pass window - */ + mcSHOW_DBG_MSG2(("find pi pass window [%d, %d] in [%d, %d]\n", win.first_pass, win.last_pass, uiDelay, uiDelay + pi_step - 1)); - /* adjust start_pos to find next pass window */ + start_pos = win.last_pass - uiDelay + 1; if (*iFirstPass == PASS_RANGE_NA) @@ -2181,26 +2095,26 @@ static void cbt_autok_maxwindow(DRAMC_CTX_T *p, } else if (*iLastPass != PASS_RANGE_NA) { - /* have pass window yet */ + if (*iLastPass + (1 << respi) >= win.first_pass) { *iLastPass = win.last_pass; } else { - /* wind is NOT continuous and larger size */ + if (win.last_pass - win.first_pass >= *iLastPass - *iFirstPass) { *iFirstPass = win.first_pass; *iLastPass = win.last_pass; } } - continue; /* find next window */ + continue; } if (*iLastPass == PASS_RANGE_NA) { - if ((win.last_pass - *iFirstPass) < 5) /* prevent glitch */ + if ((win.last_pass - *iFirstPass) < 5) { *iFirstPass = PASS_RANGE_NA; continue; @@ -2209,7 +2123,7 @@ static void cbt_autok_maxwindow(DRAMC_CTX_T *p, *iLastPass = win.last_pass; } } - } /* while (1) */ + } } #endif #endif @@ -2239,7 +2153,7 @@ static void CBTAdjustCS(DRAMC_CTX_T *p, int autok) } #endif - // if dual rank, use average position of both rank + if(backup_rank == RANK_1) { iCSFinalDelay = (CATrain_CsDelay[p->channel][RANK_0] + CATrain_CsDelay[p->channel][RANK_1]) >> 1; @@ -2249,8 +2163,7 @@ static void CBTAdjustCS(DRAMC_CTX_T *p, int autok) iCSFinalDelay = CATrain_CsDelay[p->channel][p->rank]; } - //Set CS output delay after training - /* p->rank = RANK_0, save to Reg Rank0 and Rank1, p->rank = RANK_1, save to Reg Rank1 */ + for (ii = RANK_0; ii <= backup_rank; ii++) { vSetRank(p, ii); @@ -2269,7 +2182,7 @@ static void CBTAdjustCS(DRAMC_CTX_T *p, int autok) vSetRank(p, backup_rank); - //Also for Dump_Reg + //mcSHOW_DBG_MSG(("CS delay=%d (%d~%d)\n", iCSFinalDelay, iFirstCSPass, iLastCSPass)); //mcDUMP_REG_MSG(("CS delay=%d (%d~%d)\n", iCSFinalDelay, iFirstCSPass, iLastCSPass)); } @@ -2290,7 +2203,7 @@ static void CATrainingSetPerBitDelayCell(DRAMC_CTX_T *p, S16 *iCAFinalCenter, U8 iCA_PerBit_DelayLine[uiLPDDR_CA_Mapping[u1CA]] = iCAFinalCenter[u1CA]; } - // Set CA perbit delay line calibration results + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_CA_TXDLY0), P_Fld(iCA_PerBit_DelayLine[0], SHU_R0_CA_TXDLY0_TX_ARCA0_DLY) | P_Fld(iCA_PerBit_DelayLine[1], SHU_R0_CA_TXDLY0_TX_ARCA1_DLY) | @@ -2303,13 +2216,13 @@ static void CATrainingSetPerBitDelayCell(DRAMC_CTX_T *p, S16 *iCAFinalCenter, U8 P_Fld(iCA_PerBit_DelayLine[6], SHU_R0_CA_TXDLY1_TX_ARCA6_DLY) | P_Fld(iCA_PerBit_DelayLine[7], SHU_R0_CA_TXDLY1_TX_ARCA7_DLY)); } -#endif// end of CA_PER_BIT_DELAY_CELL +#endif static void CBTSetCACLKResult(DRAMC_CTX_T *p, U32 u4MCK, U32 u4UI, U8 ca_pin_num) { S8 iFinalCACLK; U8 backup_rank, rank_i, uiCA; - S16 iCAFinalCenter[CATRAINING_NUM]={0}; //for CA_PER_BIT + S16 iCAFinalCenter[CATRAINING_NUM]={0}; #if (SUPPORT_SAVE_TIME_FOR_CALIBRATION && BYPASS_CBT) if (p->femmc_Ready == 1) @@ -2392,11 +2305,11 @@ static void CBTSetVrefLP4(DRAMC_CTX_T *p, U8 u1VrefRange, U8 u1VrefLevel, U8 ope fld = (cp->dram_dq_b0) ? CBT_WLEV_CTRL4_CBT_TXDQ_B1 : CBT_WLEV_CTRL4_CBT_TXDQ_B0; - //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_WRITE_LEV), ((u1VrefRange&0x1) <<6) | (u1VrefLevel & 0x3f), WRITE_LEV_DMVREFCA); //MR12, bit[25:20]=OP[5:0] bit 26=OP[6] + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_WRITE_LEV), ((u1VrefRange&0x1) <<6) | (u1VrefLevel & 0x3f), WRITE_LEV_DMVREFCA); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL4), - u1VrefValue_pinmux, fld); //MR12, bit[25:20]=OP[5:0] bit 26=OP[6] + u1VrefValue_pinmux, fld); + - //DQS_SEL=1, DQS_B1_G=1, Toggle R_DMDQS_WLEV (1 to 0) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), (0x1 << cp->dram_dq_b0), CBT_WLEV_CTRL0_CBT_WLEV_DQS_SEL); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL3), 0xa, CBT_WLEV_CTRL3_DQSBX_G); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), 1, CBT_WLEV_CTRL0_CBT_WLEV_DQS_TRIG); @@ -2418,7 +2331,7 @@ static void CBTSetVrefLP4(DRAMC_CTX_T *p, U8 u1VrefRange, U8 u1VrefLevel, U8 ope DramcModeRegWriteByRank(p, p->rank, 12, u4DbgValue); } - //wait tVREF_LONG + mcDELAY_US(1); } @@ -2428,15 +2341,15 @@ static void CBTEntryLP45(DRAMC_CTX_T *p, U8 u1FSP, U16 u2Freq) { if(p->dram_fsp == FSP_1) { - //@Darren, Risk here!!!VDDQ term region between 300mv and 360mv. (CaVref_0x20 is 204mv) + CmdOEOnOff(p, DISABLE, CMDOE_DIS_TO_ONE_CHANNEL); cbt_switch_freq(p, CBT_LOW_FREQ); CmdOEOnOff(p, ENABLE, CMDOE_DIS_TO_ONE_CHANNEL); } -#if ENABLE_LP4Y_WA && LP4Y_BACKUP_SOLUTION //@Darren, debugging for DFS stress +#if ENABLE_LP4Y_WA && LP4Y_BACKUP_SOLUTION CmdBusTrainingLP4YWA(p, DISABLE); #endif - CBTEntryLP4(p, u1FSP, u2Freq); // @Darren, after CBT entry will not any CMD output (CKE low) + CBTEntryLP4(p, u1FSP, u2Freq); if(p->dram_fsp == FSP_1) { cbt_switch_freq(p, CBT_HIGH_FREQ); @@ -2446,17 +2359,13 @@ static void CBTEntryLP45(DRAMC_CTX_T *p, U8 u1FSP, U16 u2Freq) static void CBTExitLP45(DRAMC_CTX_T *p, U8 u1FSP, U8 u2Freq, U8 stateFlag) { - /* by yirong.wang - * if stateFlag == OUT_CBT, it means we finished CBT, exit CBT - * if stateFlag == IN_CBT, it means we are trying to setup vref by MRW - * IN_CBT case, only for LP5 mode 1 and LP4 byte mode - */ + { if (stateFlag == OUT_CBT || p->dram_cbt_mode[p->rank] == CBT_BYTE_MODE1) { (p->dram_fsp == FSP_1)? cbt_switch_freq(p, CBT_LOW_FREQ): NULL; CBTExitLP4(p, u1FSP, u2Freq); -#if ENABLE_LP4Y_WA && LP4Y_BACKUP_SOLUTION //@Darren, debugging for DFS stress +#if ENABLE_LP4Y_WA && LP4Y_BACKUP_SOLUTION CmdBusTrainingLP4YWA(p, ENABLE); #endif } @@ -2468,7 +2377,7 @@ static void CBTSetVrefLP45(DRAMC_CTX_T *p, U8 u1VrefRange, U8 u1VrefLevel, U8 u1 { if (stateFlag == IN_CBT && p->dram_cbt_mode[p->rank] == CBT_BYTE_MODE1) { - // BYTE MODE: We are not in CBT now, set Vref & enter CBT + (p->dram_fsp == FSP_1)? cbt_switch_freq(p, CBT_LOW_FREQ): NULL; CBTExitLP4(p, u1FSP, u2Freq); @@ -2494,13 +2403,13 @@ static void CBTScanPI(DRAMC_CTX_T *p, S16 *s2PIStart, S16 *s2PIEnd, S16 *s2PISte p2u = get_ca_pi_per_ui(p); if (is_discrete_lpddr4()) - *s2PIStart = -16; /* improve high frequency CA left boundary */ + *s2PIStart = -16; else *s2PIStart = 0; *s2PIEnd = p2u * 3 - 1; { - /* LPDDR4 */ + #if !CBT_MOVE_CA_INSTEAD_OF_CLK if (vGet_DDR_Loop_Mode(p) == SEMI_OPEN_LOOP_MODE) { @@ -2579,12 +2488,12 @@ DRAM_STATUS_T CmdBusTrainingLP45(DRAMC_CTX_T *p, int autok, U8 K_Type) (DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0)), (DRAMC_REG_ADDR(DRAMC_REG_REFCTRL0)), - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_VREF)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_VREF)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_VREF)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_PHY_VREF_SEL)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_PHY_VREF_SEL)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_PHY_VREF_SEL)), //in O1PathOnOff() + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_VREF)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_VREF)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_VREF)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_PHY_VREF_SEL)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_PHY_VREF_SEL)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_PHY_VREF_SEL)), }; CBTScanPI(p, &pi_start, &pi_end, &pi_step, autok); @@ -2636,10 +2545,10 @@ DRAM_STATUS_T CmdBusTrainingLP45(DRAMC_CTX_T *p, int autok, U8 K_Type) mcSHOW_DBG_MSG(("[CmdBusTrainingLP45] new_cbt_mode=%d, autok=%d\n", p->new_cbt_mode, autok)); mcSHOW_DBG_MSG2(("pi_start=%d, pi_end=%d, pi_step=%d\n", pi_start, pi_end, pi_step)); - //Back up dramC register + DramcBackupRegisters(p, u4RegBackupAddress, ARRAY_SIZE(u4RegBackupAddress)); - //default set FAIL + if (u1CBTEyeScanEnable == DISABLE) { vSetCalibrationResult(p, DRAM_CALIBRATION_CA_TRAIN, DRAM_FAIL); @@ -2663,41 +2572,32 @@ DRAM_STATUS_T CmdBusTrainingLP45(DRAMC_CTX_T *p, int autok, U8 K_Type) } #endif - /* read ca ui and mck */ + ca_ui_default = ca_ui = get_ca_ui(p); ca_mck = get_ca_mck(p); ca_cmd0 = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_CA_CMD0)); - vAutoRefreshSwitch(p, DISABLE); //When doing CA training, should make sure that auto refresh is disable + vAutoRefreshSwitch(p, DISABLE); + - /* - * TOOD - * - * here just pass simulation, - * remove after ACTiming OK(ACTiming Table includes CATRAIN_INTV) - */ //vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL1), // P_Fld(0x1F, CBT_WLEV_CTRL1_CATRAIN_INTV)); set_cbt_wlev_intv(p); - /* - * tx_rank_sel is selected by SW - * Lewis@20180509: tx_rank_sel is selected by SW in CBT if TMRRI design has changed. - */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), p->rank, TX_SET0_TXRANK); - /* TXRANKFIX should be write after TXRANK or the rank will be fix at rank 1 */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 1, TX_SET0_TXRANKFIX); - //SW variable initialization + uiCAWinSumMax = 0; operating_fsp = p->dram_fsp; operation_frequency = p->frequency; - // free-run dramc/ddrphy clk (DCMEN2=0, MIOCKCTRLOFF=1, PHYCLKDYNGEN=0, COMBCLKCTRL=0) - // free-run dram clk(APHYCKCG_FIXOFF =1, TCKFIXON=1) + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_DRAMC_PD_CTRL), P_Fld(0, DRAMC_PD_CTRL_DCMEN2) | P_Fld(1, DRAMC_PD_CTRL_MIOCKCTRLOFF) | @@ -2706,14 +2606,14 @@ DRAM_STATUS_T CmdBusTrainingLP45(DRAMC_CTX_T *p, int autok, U8 K_Type) P_Fld(1, DRAMC_PD_CTRL_APHYCKCG_FIXOFF) | P_Fld(1, DRAMC_PD_CTRL_TCKFIXON)); - //Note : Assume that there is a default CS value that can apply for CA. + CBTEntryLP45(p, operating_fsp, operation_frequency); #if PINMUX_AUTO_TEST_PER_BIT_CA CheckCADelayCell(p); #endif - //Step 3: set vref range and step by ddr type + #if (SUPPORT_SAVE_TIME_FOR_CALIBRATION && (BYPASS_VREF_CAL || BYPASS_CBT)) if (p->femmc_Ready == 1) @@ -2735,18 +2635,17 @@ DRAM_STATUS_T CmdBusTrainingLP45(DRAMC_CTX_T *p, int autok, U8 K_Type) gFinalCBTVrefCA[p->channel][p->rank] = u1FinalVref; #endif - //Set Vref after training - // BYTE MODE: Set Vref & enter CBT + CBTSetVrefLP45(p, u1FinalRange, u1FinalVref, operating_fsp, operation_frequency, IN_CBT); #if (SUPPORT_SAVE_TIME_FOR_CALIBRATION && BYPASS_CBT) #if CBT_MOVE_CA_INSTEAD_OF_CLK - // scan UI from 0, not from the UI we used to enter CBT + DramcCmdUIDelaySetting(p, 0); ca_ui = get_ca_ui(p); #endif #endif put_ca_ui(p, ca_ui); - //Set CA_PI_Delay after training + if (u1CBTEyeScanEnable == DISABLE) { CBTSetCACLKResult(p, ca_mck, ca_ui, ca_pin_num); @@ -2769,15 +2668,14 @@ DRAM_STATUS_T CmdBusTrainingLP45(DRAMC_CTX_T *p, int autok, U8 K_Type) gEyeScan_CaliDelay[0] = CATrain_CmdDelay[p->channel][p->rank] -pi_start; #endif - /* ------------- CS and CLK ---------- */ - /* delay ca 1UI before K CS */ + if (u1CBTEyeScanEnable == DISABLE) { CBTAdjustCS(p, autok); } -//------- Going to exit Command bus training(CBT) mode.------------- + CBTExitLP45(p, operating_fsp, operation_frequency, OUT_CBT); CBTSetVrefLP45(p, u1FinalRange, u1FinalVref, operating_fsp, operation_frequency, OUT_CBT); @@ -2798,31 +2696,24 @@ DRAM_STATUS_T CmdBusTrainingLP45(DRAMC_CTX_T *p, int autok, U8 K_Type) mcSHOW_DBG_MSG4(("\n[CmdBusTrainingLP45] Done\n")); - //tx_rank_sel is selected by HW //Lewis@20180509: tx_rank_sel is selected by SW in CBT if TMRRI design has changed. + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 0, TX_SET0_TXRANK); - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 0, TX_SET0_TXRANKFIX); //TXRANKFIX should be write after TXRANK or the rank will be fix at rank 1 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 0, TX_SET0_TXRANKFIX); + - //Restore setting registers DramcRestoreRegisters(p, u4RegBackupAddress, ARRAY_SIZE(u4RegBackupAddress)); return DRAM_OK; } #endif /* SIMUILATION_CBT */ -//------------------------------------------------------------------------- -/** DramcWriteLeveling - * start Write Leveling Calibration. - * @param p Pointer of context created by DramcCtxCreate. - * @param apply (U8): 0 don't apply the register we set 1 apply the register we set ,default don't apply. - * @retval status (DRAM_STATUS_T): DRAM_OK or DRAM_FAIL - */ -//------------------------------------------------------------------------- -#define WRITE_LEVELING_MOVD_DQS 1//UI + +#define WRITE_LEVELING_MOVD_DQS 1 U8 u1MCK2UI_DivShift(DRAMC_CTX_T *p) { { - //in LP4 1:8 mode, 8 small UI = 1 large UI + if (vGet_Div_Mode(p) == DIV4_MODE) { return MCK_TO_4UI_SHIFT; @@ -2900,9 +2791,9 @@ static void _LoopAryToDelay(DRAMC_CTX_T *p, static void LP4_ShiftDQSUI(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) { - // DQS / DQS_OEN - REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_DQS0}, // Byte0 - {DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_DQS1}}; // Byte1 + + REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_DQS0}, + {DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_DQS1}}; REG_TRANSFER_T TransferMCKRegs[] = {{DRAMC_REG_SHU_SELPH_DQS0, SHU_SELPH_DQS0_TXDLY_DQS0}, {DRAMC_REG_SHU_SELPH_DQS0, SHU_SELPH_DQS0_TXDLY_DQS1}}; @@ -2913,9 +2804,9 @@ static void LP4_ShiftDQSUI(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) void LP4_ShiftDQS_OENUI(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) { - // DQS / DQS_OEN - REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_OEN_DQS0}, // Byte0 - {DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_OEN_DQS1}}; // Byte1 + + REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_OEN_DQS0}, + {DRAMC_REG_SHU_SELPH_DQS1, SHU_SELPH_DQS1_DLY_OEN_DQS1}}; REG_TRANSFER_T TransferMCKRegs[] = {{DRAMC_REG_SHU_SELPH_DQS0, SHU_SELPH_DQS0_TXDLY_OEN_DQS0}, {DRAMC_REG_SHU_SELPH_DQS0, SHU_SELPH_DQS0_TXDLY_OEN_DQS1}}; @@ -2926,11 +2817,11 @@ void LP4_ShiftDQS_OENUI(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) static void ShiftDQUI(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) { - // Shift DQ / DQM / DQ_OEN / DQM_OEN - REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_DQM0}, // Byte0 - {DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_DQM1}, // Byte1 - {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_DQ0}, // Byte0 - {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_DQ1}}; // Byte1 + + REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_DQM0}, + {DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_DQM1}, + {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_DQ0}, + {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_DQ1}}; REG_TRANSFER_T TransferMCKRegs[] = {{DRAMC_REG_SHURK_SELPH_DQ1, SHURK_SELPH_DQ1_TXDLY_DQM0}, {DRAMC_REG_SHURK_SELPH_DQ1, SHURK_SELPH_DQ1_TXDLY_DQM1}, {DRAMC_REG_SHURK_SELPH_DQ0, SHURK_SELPH_DQ0_TXDLY_DQ0}, @@ -2946,7 +2837,7 @@ static void ShiftDQUI_AllRK(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) U8 backup_rank, rk_i; backup_rank = u1GetRank(p); - // Shift DQ / DQM / DQ_OEN / DQM_OEN + for (rk_i = RANK_0; rk_i < p->support_rank_num; rk_i++) { vSetRank(p, rk_i); @@ -2957,10 +2848,10 @@ static void ShiftDQUI_AllRK(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) static void ShiftDQ_OENUI(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) { - REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_OEN_DQM0}, // Byte0 - {DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_OEN_DQM1}, // Byte1 - {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_OEN_DQ0}, // Byte0 - {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_OEN_DQ1}}; // Byte1 + REG_TRANSFER_T TransferUIRegs[] = {{DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_OEN_DQM0}, + {DRAMC_REG_SHURK_SELPH_DQ3, SHURK_SELPH_DQ3_DLY_OEN_DQM1}, + {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_OEN_DQ0}, + {DRAMC_REG_SHURK_SELPH_DQ2, SHURK_SELPH_DQ2_DLY_OEN_DQ1}}; REG_TRANSFER_T TransferMCKRegs[] = {{DRAMC_REG_SHURK_SELPH_DQ1, SHURK_SELPH_DQ1_TXDLY_OEN_DQM0}, {DRAMC_REG_SHURK_SELPH_DQ1, SHURK_SELPH_DQ1_TXDLY_OEN_DQM1}, {DRAMC_REG_SHURK_SELPH_DQ0, SHURK_SELPH_DQ0_TXDLY_OEN_DQ0}, @@ -2976,7 +2867,7 @@ void ShiftDQ_OENUI_AllRK(DRAMC_CTX_T *p, S8 iShiftUI, BYTES_T eByteIdx) U8 backup_rank, rk_i; backup_rank = u1GetRank(p); - // Shift DQ / DQM / DQ_OEN / DQM_OEN + for (rk_i = RANK_0; rk_i < p->support_rank_num; rk_i++) { vSetRank(p, rk_i); @@ -3007,14 +2898,14 @@ U8 u1IsLP4Div4DDR800(DRAMC_CTX_T *p) return FALSE; } -//static void vSetDramMRWriteLevelingOnOff(DRAMC_CTX_T *p, U8 u1OnOff) + static void vSetDramMRWriteLevelingOnOff(DRAMC_CTX_T *p, U8 u1OnOff) { - // MR2 OP[7] to enable/disable write leveling + if (u1OnOff) - u1MR02Value[p->dram_fsp] |= 0x80; // OP[7] WR LEV =1 + u1MR02Value[p->dram_fsp] |= 0x80; else - u1MR02Value[p->dram_fsp] &= 0x7f; // OP[7] WR LEV =0 + u1MR02Value[p->dram_fsp] &= 0x7f; DramcModeRegWriteByRank(p, p->rank, 2, u1MR02Value[p->dram_fsp]); } @@ -3023,21 +2914,18 @@ U8 u1IsPhaseMode(DRAMC_CTX_T *p) { if ((vGet_DDR_Loop_Mode(p) == OPEN_LOOP_MODE) || (vGet_DDR_Loop_Mode(p) == SEMI_OPEN_LOOP_MODE)) return TRUE; - else // DDR800_CLOSE_LOOP and NORMAL_CLOSE_LOOP + else return FALSE; } #if 0 static DRAM_STATUS_T DramcTriggerAndWait(DRAMC_CTX_T *p, REG_TRANSFER_T TriggerReg, REG_TRANSFER_T RepondsReg) { -// U32 u4TimeCnt = TIME_OUT_CNT; - // @Darren, Rx HW AutoK simulation time - // RX delay all range -511~255, step:4,DDR800semi + TEST2_OFF=0x100 => 8661us/per rank - // RX delay all range -327~252, step:8,DDR800semi, TEST2_OFF=0x100 => 3276us/per rank + U32 u4TimeCnt = DDR_HW_AUTOK_POLLING_CNT; DRAM_STATUS_T u4RespFlag = 0; - vIO32WriteFldAlign(DRAMC_REG_ADDR(TriggerReg.u4Addr), 0, TriggerReg.u4Fld); // Init EN status + vIO32WriteFldAlign(DRAMC_REG_ADDR(TriggerReg.u4Addr), 0, TriggerReg.u4Fld); vIO32WriteFldAlign(DRAMC_REG_ADDR(TriggerReg.u4Addr), 1, TriggerReg.u4Fld); do { @@ -3046,7 +2934,7 @@ static DRAM_STATUS_T DramcTriggerAndWait(DRAMC_CTX_T *p, REG_TRANSFER_T TriggerR mcDELAY_US(1); }while ((u4RespFlag == 0) && (u4TimeCnt > 0)); - if (u4TimeCnt == 0)//time out + if (u4TimeCnt == 0) { mcSHOW_ERR_MSG(("[DramcTriggerAndWait] Wait 0x%x respond fail (time out)\n", RepondsReg.u4Addr)); return DRAM_FAIL; @@ -3057,19 +2945,19 @@ static DRAM_STATUS_T DramcTriggerAndWait(DRAMC_CTX_T *p, REG_TRANSFER_T TriggerR static DRAM_STATUS_T DramcTriggerAndWait_For_RX_AutoK_WorkAround(DRAMC_CTX_T *p, REG_TRANSFER_T TriggerReg, REG_TRANSFER_T RepondsReg, U16 u16DelayStep) { - // Set step = 0 to let autoK non-stop + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_RX_AUTOK_CFG0), 0, MISC_RX_AUTOK_CFG0_RX_CAL_STEP); - vIO32WriteFldAlign(DRAMC_REG_ADDR(TriggerReg.u4Addr), 0, TriggerReg.u4Fld); // Init EN status + vIO32WriteFldAlign(DRAMC_REG_ADDR(TriggerReg.u4Addr), 0, TriggerReg.u4Fld); vIO32WriteFldAlign(DRAMC_REG_ADDR(TriggerReg.u4Addr), 1, TriggerReg.u4Fld); - // Trigger and then stop immediately + vIO32WriteFldAlign(DRAMC_REG_ADDR(TriggerReg.u4Addr), 0, TriggerReg.u4Fld); - // PHY reset + DramPhyReset(p); - // Restor the original step + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_RX_AUTOK_CFG0), u16DelayStep, MISC_RX_AUTOK_CFG0_RX_CAL_STEP); return DramcTriggerAndWait(p, TriggerReg, RepondsReg); @@ -3086,7 +2974,7 @@ static void WriteLevelingScanRange_PI(DRAMC_CTX_T *p, S32 *ps4DlyBegin, S32 *ps4 if (stDelayBase == PI_BASED) { - // Giving PI scan range + s4DlyBegin = WRITE_LEVELING_MOVD_DQS * 32 - MAX_CLK_PI_DELAY - 1; s4DlyEnd = s4DlyBegin + 64 - 1; @@ -3106,14 +2994,14 @@ static void WriteLevelingScanRange_PI(DRAMC_CTX_T *p, S32 *ps4DlyBegin, S32 *ps4 PI_bound = 64; } } - else // stDelayBase == DLY_BASED + else { - // Giving delay cell scan range + s4DlyBegin = 0; s4DlyEnd = 2 * STORAGED_DLY_UNIT; - u1PIStep = 1; // One step is 1/4 delay cell - PI_bound = 1024; // No bounadary as delay cell based + u1PIStep = 1; + PI_bound = 1024; } mcSHOW_DBG_MSG2(("Delay: %d->%d, Step: %d, Bound: %d\n", s4DlyBegin, s4DlyEnd, u1PIStep, PI_bound)); @@ -3152,14 +3040,14 @@ void WriteLevelingPosCal(DRAMC_CTX_T *p, WLEV_DELAY_BASED_T stDelayBase) { vSetRank(p, rank_i); - // set to best values for DQS + if (stDelayBase == PI_BASED) { - // Adjust DQS output delay. + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_DQ0), wrlevel_dqs_delay[0], SHU_R0_B0_DQ0_ARPI_PBYTE_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_DQ0), wrlevel_dqs_delay[1], SHU_R0_B1_DQ0_ARPI_PBYTE_B1); } - else // stDelayBase == DLY_BASED + else { vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_TXDLY3), wrlevel_dqs_delay[0], SHU_R0_B0_TXDLY3_TX_ARWCK_DLY_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_TXDLY3), wrlevel_dqs_delay[1], SHU_R0_B1_TXDLY3_TX_ARWCK_DLY_B1); @@ -3177,7 +3065,7 @@ void WriteLevelingPosCal(DRAMC_CTX_T *p, WLEV_DELAY_BASED_T stDelayBase) #define SET_PATTERN_MANUALLY_FOR_DEBUG 1 DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T stDelayBase) { -// Note that below procedure is based on "ODT off" + DRAM_STATUS_T KResult = DRAM_FAIL; //U8 *uiLPDDR_O1_Mapping = NULL; @@ -3201,10 +3089,10 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T U8 u1OverBoundCnt = 0; //jj = 0 S16 PI_bound = 64; - //When doing WriteLeveling, should make sure that auto refresh is disable + vAutoRefreshSwitch(p, DISABLE); - // error handling + if (!p) { mcSHOW_ERR_MSG(("context NULL\n")); @@ -3222,11 +3110,11 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T backup_rank = u1GetRank(p); //DramcRankSwap(p, p->rank); - //tx_rank_sel is selected by SW //Lewis@20180604: tx_rank_sel is selected by SW in WL if TMRRI design has changed. + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), p->rank, TX_SET0_TXRANK); - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 1, TX_SET0_TXRANKFIX); //TXRANKFIX should be write after TXRANK + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 1, TX_SET0_TXRANKFIX); + - // backup mode settings U32 u4RegBackupAddress[] = { (DRAMC_REG_ADDR(DRAMC_REG_DRAMC_PD_CTRL)), @@ -3234,18 +3122,18 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T (DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL1)), (DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL3)), (DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL5)), - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_VREF)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_VREF)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_VREF)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_PHY_VREF_SEL)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_PHY_VREF_SEL)), //in O1PathOnOff() - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_PHY_VREF_SEL)), //in O1PathOnOff() + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_VREF)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_VREF)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_VREF)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_PHY_VREF_SEL)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_PHY_VREF_SEL)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_PHY_VREF_SEL)), (DRAMC_REG_ADDR(DRAMC_REG_DRAMC_PD_CTRL)) }; DramcBackupRegisters(p, u4RegBackupAddress, sizeof(u4RegBackupAddress) / sizeof(U32)); - //default set DRAM FAIL + vSetCalibrationResult(p, DRAM_CALIBRATION_WRITE_LEVEL, DRAM_FAIL); #if MRW_CHECK_ONLY @@ -3254,7 +3142,7 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T if (p->isWLevInitShift[p->channel] == FALSE) { - // It must be PI_BASED or FAIL!! + #if __ETT__ while (stDelayBase != PI_BASED); #else @@ -3263,21 +3151,21 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T p->isWLevInitShift[p->channel] = TRUE; - // This flow would be excuted just one time, so all ranks(maybe rank0/1) should be adjusted at once. + ShiftDQUI_AllRK(p, -WRITE_LEVELING_MOVD_DQS, ALL_BYTES); ShiftDQ_OENUI_AllRK(p, -WRITE_LEVELING_MOVD_DQS, ALL_BYTES); ShiftDQSWCK_UI(p, -WRITE_LEVELING_MOVD_DQS, ALL_BYTES); - // Set DQS PI-based delay to 0 - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_DQ0), 0, SHU_R0_B0_DQ0_ARPI_PBYTE_B0); //rank0, byte0, DQS delay - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_DQ0), 0, SHU_R0_B1_DQ0_ARPI_PBYTE_B1); //rank0, byte1, DQS delay + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_DQ0), 0, SHU_R0_B0_DQ0_ARPI_PBYTE_B0); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_DQ0), 0, SHU_R0_B1_DQ0_ARPI_PBYTE_B1); } - // decide algorithm parameters according to freq.(PI mode/ phase mode) + WriteLevelingScanRange_PI(p, &s4DlyBegin, &s4DlyEnd, &u1PIStep, &PI_bound, stDelayBase); - // Not support autok to delay cell based mode. + if (stDelayBase == DLY_BASED) isAutoK = FALSE; @@ -3299,7 +3187,7 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T if (ucDoneFlg == 0xff) { - // all bytes are done + fgwrlevel_done = 1; KResult = DRAM_OK; } @@ -3335,26 +3223,26 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T #endif - vSetDramMRWriteLevelingOnOff(p, DISABLE); // Disable DDR write leveling mode: issue MR2[7] to enable write leveling + vSetDramMRWriteLevelingOnOff(p, DISABLE); + - // Write leveling enable OFF vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_CBT_WLEV_CTRL0), 0, CBT_WLEV_CTRL0_WRITE_LEVEL_EN); - //Disable DQ_O1, SELO1ASO=0 for power saving + O1PathOnOff(p, OFF); - //tx_rank_sel is selected by HW + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 0, TX_SET0_TXRANK); - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 0, TX_SET0_TXRANKFIX); //TXRANKFIX should be write after TXRANK + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_SET0), 0, TX_SET0_TXRANKFIX); + - //restore registers. DramcRestoreRegisters(p, u4RegBackupAddress, sizeof(u4RegBackupAddress) / sizeof(U32)); - // Calculate DQS "PI" delay, nothing to do with delay cell + for (byte_i = 0; byte_i < DQS_BYTE_NUMBER; byte_i++) { - //Also for Dump_Reg + mcSHOW_DBG_MSG(("Write leveling (Byte %d): %d", byte_i, wrlevel_dqs_final_delay[p->rank][byte_i])); //DUMP_REG_MSG(("Write leveling (Byte %d): %d", byte_i, wrlevel_dqs_final_delay[p->rank][byte_i])); if (wrlevel_dqs_final_delay[p->rank][byte_i] >= PI_bound) @@ -3373,14 +3261,14 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T { vSetRank(p, rank_i); - // set to best values for DQS + if (stDelayBase == PI_BASED) { - // Adjust DQS output delay. + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_DQ0), wrlevel_dqs_delay[0], SHU_R0_B0_DQ0_ARPI_PBYTE_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_DQ0), wrlevel_dqs_delay[1], SHU_R0_B1_DQ0_ARPI_PBYTE_B1); } - else // stDelayBase == DLY_BASED + else { vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_TXDLY3), wrlevel_dqs_delay[0], SHU_R0_B0_TXDLY3_TX_ARWCK_DLY_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_TXDLY3), wrlevel_dqs_delay[1], SHU_R0_B1_TXDLY3_TX_ARWCK_DLY_B1); @@ -3397,26 +3285,23 @@ DRAM_STATUS_T DramcWriteLeveling(DRAMC_CTX_T *p, u8 isAutoK, WLEV_DELAY_BASED_T } #endif //SIMULATION_WRITE_LEVELING -#if (fcFOR_CHIP_ID == fcA60868) // Just work around for 868 test chip -// Set OPT6 = 1 after trigger, and OPT6 = 0 before release -// When WCKDUAL == 1, CAS-FS command, RTSWCMD_RK must be 2'b11 -// When WCKDUAL == 1, CAS-OFF command must be issue 2 times, RTSWCMD_RK must be 2'b00 and 2'b01 for each +#if (fcFOR_CHIP_ID == fcA60868) static void RunTime_SW_Cmd(DRAMC_CTX_T *p, RUNTIME_SWCMD_SEL_T runtime_SW_cmd_sel) { U32 u4Response = 0; U32 u4TimeCnt = TIME_OUT_CNT; U32 u4BackupCKECTRL; - // Backup rank, CKE fix on/off, HW MIOCK control settings + u4BackupCKECTRL = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_CKECTRL)); - // Work around case, set both rank CKE_FIXON for CAS-OFF + CKEFixOnOff(p, TO_ALL_RANK, CKE_FIXON, TO_ALL_CHANNEL); - // Select a RT SW command + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), runtime_SW_cmd_sel, SWCMD_EN_RTSWCMD_SEL); - // Set _CNT, _AGE, _RANK + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RTSWCMD_CNT), 0x30, RTSWCMD_CNT_RTSWCMD_CNT); vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2), P_Fld(0, SWCMD_CTRL2_RTSWCMD_AGE) | @@ -3426,7 +3311,7 @@ static void RunTime_SW_Cmd(DRAMC_CTX_T *p, RUNTIME_SWCMD_SEL_T runtime_SW_cmd_se U8 _is_differential_mode = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_WCKCTRL), SHU_WCKCTRL_WCKDUAL); while (1) { - // Work around case, set specific rank value. + if (runtime_SW_cmd_sel == RUNTIME_SWCMD_CAS_OFF) { if ( _is_differential_mode == 0) @@ -3438,7 +3323,7 @@ static void RunTime_SW_Cmd(DRAMC_CTX_T *p, RUNTIME_SWCMD_SEL_T runtime_SW_cmd_se vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2), 0x3, SWCMD_CTRL2_RTSWCMD_RK); } - // Trigger RT SW command + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_RTSWCMDEN); do @@ -3448,15 +3333,15 @@ static void RunTime_SW_Cmd(DRAMC_CTX_T *p, RUNTIME_SWCMD_SEL_T runtime_SW_cmd_se mcDELAY_US(1); }while ((u4Response == 0) && (u4TimeCnt > 0)); - if (u4TimeCnt == 0)//time out + if (u4TimeCnt == 0) { mcSHOW_ERR_MSG(("[LP5 RT SW Cmd ] Resp fail (time out)\n")); } - // Release RT SW command + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_RTSWCMDEN); - // Work around case, loop again sending CAS-OFF command for RK1. + if (runtime_SW_cmd_sel == RUNTIME_SWCMD_CAS_OFF) { if (_is_differential_mode == 0) @@ -3466,31 +3351,30 @@ static void RunTime_SW_Cmd(DRAMC_CTX_T *p, RUNTIME_SWCMD_SEL_T runtime_SW_cmd_se break; } - // Restore rank, CKE fix on + vIO32Write4B_All(DRAMC_REG_CKECTRL, u4BackupCKECTRL); } -#else // Single end mode +#else #if 0 static void RunTime_SW_Cmd(DRAMC_CTX_T *p, RUNTIME_SWCMD_SEL_T runtime_SW_cmd_sel) { U32 u4Response = 0; U32 u4TimeCnt = TIME_OUT_CNT; - // Select a RT SW command + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), runtime_SW_cmd_sel, SWCMD_EN_RTSWCMD_SEL); - // Set _CNT, _AGE, _RANK + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RTSWCMD_CNT), 0x30, RTSWCMD_CNT_RTSWCMD_CNT); vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2), P_Fld(0, SWCMD_CTRL2_RTSWCMD_AGE) | P_Fld(p->rank, SWCMD_CTRL2_RTSWCMD_RK)); - // If command is CAS_FS/CAS_OFF, replace RTSWCMD_RK = 2'b11. - // Avoid this RK value at CAS_FS/CAS_OFF no match. + if ((runtime_SW_cmd_sel == RUNTIME_SWCMD_CAS_FS) || (runtime_SW_cmd_sel == RUNTIME_SWCMD_CAS_OFF)) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2), 0x3, SWCMD_CTRL2_RTSWCMD_RK); - // Trigger RT SW command + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_RTSWCMDEN); do @@ -3500,12 +3384,12 @@ static void RunTime_SW_Cmd(DRAMC_CTX_T *p, RUNTIME_SWCMD_SEL_T runtime_SW_cmd_se mcDELAY_US(1); }while ((u4Response == 0) && (u4TimeCnt > 0)); - if (u4TimeCnt == 0)//time out + if (u4TimeCnt == 0) { mcSHOW_ERR_MSG(("[LP5 RT SW Cmd ] Resp fail (time out)\n")); } - // Release RT SW command + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_RTSWCMDEN); } @@ -3526,7 +3410,7 @@ DRAM_STATUS_T DramcDutyCycleMonitor(DRAMC_CTX_T *p) U8 backup_rank; // U8 u8ResultDutyCycMonitor[WHOLE_STEPS_NUM] = {0}; - // error handling + if (!p) { mcSHOW_ERR_MSG(("context NULL\n")); @@ -3543,44 +3427,43 @@ DRAM_STATUS_T DramcDutyCycleMonitor(DRAMC_CTX_T *p) int i = -7; for (i = -7; i <= 7; i++) { - // MRW MR30 OP[7:4] = i(Set DCAU) and OP[3:0] = i(Set DCAL) + U8 u8RGSettingVal = FetchRGSettingVal(i); mcSHOW_ERR_MSG(("Set value %d into MR30\n", u8RGSettingVal)); MRWriteFldMulti(p, 30, P_Fld(u8RGSettingVal, MR30_DCAU) | P_Fld(u8RGSettingVal, MR30_DCAL), TO_MR); - // Start duty cycle monitor + DramcMRWriteFldAlign(p, 26, 1, MR26_DCM_START_STOP, TO_MR); - // Delay tDCMM(2us) + mcDELAY_US(2); - // Duty cycle monitor Flip 0 -> 1, and store result of flip = 0 + DramcMRWriteFldAlign(p, 26, 1, MR26_DCM_FLIP, TO_MR); - // Delay tDCMM(2us) + mcDELAY_US(2); - // Duty cycle monitor Flip 1 -> 0, and store result of flip = 1 + DramcMRWriteFldAlign(p, 26, 0, MR26_DCM_FLIP, TO_MR); - // Delay tDCMM(2us) + mcDELAY_US(2); - // Stop Duty cycle monitor + DramcMRWriteFldAlign(p, 26, 0, MR26_DCM_START_STOP, TO_MR); - // Delay tMRD + mcDELAY_US(2); mcSHOW_ERR_MSG(("Wait tMRD and MRR MR26\n")); - ///TODO: Read back result MR25[5:2] - // Store result into u8ResultDutyCycMonitor[] + } - ///TODO: Find and set a best MR30 variables + RunTime_SW_Cmd(p, RUNTIME_SWCMD_CAS_OFF); @@ -3589,7 +3472,7 @@ DRAM_STATUS_T DramcDutyCycleMonitor(DRAMC_CTX_T *p) vSetRank(p, backup_rank); } -#endif // SIMULATION_DUTY_CYC_MONITOR +#endif void vResetDelayChainBeforeCalibration(DRAMC_CTX_T *p) @@ -3642,16 +3525,14 @@ void vResetDelayChainBeforeCalibration(DRAMC_CTX_T *p) } -//Reset PHY to prevent glitch when change DQS gating delay or RX DQS input delay -// [Lynx] Evere_st : cannot reset single channel. All DramC and All Phy have to reset together. + void DramPhyReset(DRAMC_CTX_T *p) { - // Evere_st change reset order : reset DQS before DQ, move PHY reset to final. - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RX_SET0), 1, RX_SET0_RDATRST);// read data counter reset + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RX_SET0), 1, RX_SET0_RDATRST); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL1), 1, MISC_CTRL1_R_DMPHYRST); - //RG_ARCMD_RESETB & RG_ARDQ_RESETB_B0/1 only reset once at init, Justin Chan. - ///TODO: need to confirm RG_ARCMD_RESETB & RG_ARDQ_RESETB_B0/1 is reset at mem.c + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ9), P_Fld(0, B0_DQ9_RG_RX_ARDQS0_STBEN_RESETB_B0) | P_Fld(0, B0_DQ9_RG_RX_ARDQ_STBEN_RESETB_B0)); @@ -3667,17 +3548,11 @@ void DramPhyReset(DRAMC_CTX_T *p) P_Fld(1, B0_DQ9_RG_RX_ARDQ_STBEN_RESETB_B0)); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL1), 0, MISC_CTRL1_R_DMPHYRST); - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RX_SET0), 0, RX_SET0_RDATRST);// read data counter reset + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RX_SET0), 0, RX_SET0_RDATRST); } #if SIMULATION_LP4_ZQ -//------------------------------------------------------------------------- -/** DramcZQCalibration - * start Dram ZQ calibration. - * @param p Pointer of context created by DramcCtxCreate. - * @retval status (DRAM_STATUS_T): DRAM_OK or DRAM_FAIL - */ -//------------------------------------------------------------------------- + #if ZQ_SWCMD_MODE static DRAM_STATUS_T ZQ_SWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) { @@ -3685,7 +3560,7 @@ static DRAM_STATUS_T ZQ_SWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) U32 u4TimeCnt = TIME_OUT_CNT; U32 u4SWCMDEN, u4SWCMDCTRL, u4SPDCTRL, u4CKECTRL; - // Backup rank, CKE fix on/off, HW MIOCK control settings + u4SWCMDEN = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN)); u4SWCMDCTRL = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0)); u4SPDCTRL = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_DRAMC_PD_CTRL)); @@ -3694,24 +3569,24 @@ static DRAM_STATUS_T ZQ_SWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) mcSHOW_DBG_MSG4(("[ZQCalibration]\n")); //mcFPRINTF((fp_A60501, "[ZQCalibration]\n")); - // Disable HW MIOCK control to make CLK always on + DramCLKAlwaysOnOff(p, ON, TO_ONE_CHANNEL); mcDELAY_US(1); - //if CKE2RANK=1, only need to set CKEFIXON, it will apply to both rank. + CKEFixOnOff(p, rank, CKE_FIXON, TO_ONE_CHANNEL); - //select rank + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), rank, SWCMD_CTRL0_SWTRIG_ZQ_RK); - //ZQCAL Start + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_ZQCEN_SWTRIG); do { u4Response = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP3), SPCMDRESP3_ZQC_SWTRIG_RESPONSE); u4TimeCnt --; - mcDELAY_US(1); // Wait tZQCAL(min) 1us or wait next polling + mcDELAY_US(1); mcSHOW_DBG_MSG4(("%d- ", u4TimeCnt)); //mcFPRINTF((fp_A60501, "%d- ", u4TimeCnt)); @@ -3719,7 +3594,7 @@ static DRAM_STATUS_T ZQ_SWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_ZQCEN_SWTRIG); - if(u4TimeCnt==0)//time out + if(u4TimeCnt==0) { vSetCalibrationResult(p, DRAM_CALIBRATION_ZQ, DRAM_FAIL); mcSHOW_ERR_MSG(("ZQCAL Start fail (time out)\n")); @@ -3727,17 +3602,17 @@ static DRAM_STATUS_T ZQ_SWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) return DRAM_FAIL; } - // [JC] delay tZQCAL + mcDELAY_US(1); u4TimeCnt = TIME_OUT_CNT; - //ZQCAL Latch + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_ZQLATEN_SWTRIG); do { u4Response = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP3), SPCMDRESP3_ZQLAT_SWTRIG_RESPONSE); u4TimeCnt --; - mcDELAY_US(1);// Wait tZQLAT 30ns or wait next polling + mcDELAY_US(1); mcSHOW_DBG_MSG4(("%d=\n\n", u4TimeCnt)); //mcFPRINTF((fp_A60501, "%d= ", u4TimeCnt)); @@ -3753,10 +3628,10 @@ static DRAM_STATUS_T ZQ_SWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) return DRAM_FAIL; } - // [JC] delay tZQLAT + mcDELAY_US(1); - // Restore rank, CKE fix on, HW MIOCK control settings + vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), u4SWCMDEN); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u4SWCMDCTRL); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_DRAMC_PD_CTRL), u4SPDCTRL); @@ -3776,7 +3651,7 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) U32 u4TimeCnt = TIME_OUT_CNT; U32 u4SWCMDEN, u4SWCMDCTRL, u4MPCCTRL, u4RTSWCMD, u4SPDCTRL, u4CKECTRL; - // Backup rank, CKE fix on/off, HW MIOCK control settings + u4SWCMDEN = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN)); u4SWCMDCTRL = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2)); u4MPCCTRL = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_MPC_CTRL)); @@ -3787,15 +3662,15 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) mcSHOW_DBG_MSG4(("[ZQCalibration]\n")); //mcFPRINTF((fp_A60501, "[ZQCalibration]\n")); - // Disable HW MIOCK control to make CLK always on + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_DRAMC_PD_CTRL), 1, DRAMC_PD_CTRL_APHYCKCG_FIXOFF); //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_DRAMC_PD_CTRL), 1, DRAMC_PD_CTRL_TCKFIXON); mcDELAY_US(1); - //if CKE2RANK=1, only need to set CKEFIXON, it will apply to both rank. + //CKEFixOnOff(p, rank, CKE_FIXON, TO_ONE_CHANNEL); - //select rank + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2), P_Fld(rank, SWCMD_CTRL2_RTSWCMD_RK) | P_Fld(0x20, SWCMD_CTRL2_RTSWCMD_AGE)); @@ -3803,7 +3678,7 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_MPC_CTRL), 0x1, MPC_CTRL_RTSWCMD_HPRI_EN); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RTSWCMD_CNT), 0x2a, RTSWCMD_CNT_RTSWCMD_CNT); - //ZQCAL Start + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0x5, SWCMD_EN_RTSWCMD_SEL); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_RTSWCMDEN); @@ -3811,7 +3686,7 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) { u4Response = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP3), SPCMDRESP3_RTSWCMD_RESPONSE); u4TimeCnt --; - mcDELAY_US(1); // Wait tZQCAL(min) 1us or wait next polling + mcDELAY_US(1); mcSHOW_DBG_MSG4(("%d- ", u4TimeCnt)); //mcFPRINTF((fp_A60501, "%d- ", u4TimeCnt)); @@ -3819,7 +3694,7 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_RTSWCMDEN); - if(u4TimeCnt==0)//time out + if(u4TimeCnt==0) { vSetCalibrationResult(p, DRAM_CALIBRATION_ZQ, DRAM_FAIL); mcSHOW_ERR_MSG(("ZQCAL Start fail (time out)\n")); @@ -3827,11 +3702,11 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) return DRAM_FAIL; } - // [JC] delay tZQCAL + mcDELAY_US(1); u4TimeCnt = TIME_OUT_CNT; - //ZQCAL Latch + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0x6, SWCMD_EN_RTSWCMD_SEL); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_RTSWCMDEN); @@ -3839,7 +3714,7 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) { u4Response = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP3), SPCMDRESP3_RTSWCMD_RESPONSE); u4TimeCnt --; - mcDELAY_US(1);// Wait tZQLAT 30ns or wait next polling + mcDELAY_US(1); mcSHOW_DBG_MSG4(("%d=", u4TimeCnt)); //mcFPRINTF((fp_A60501, "%d= ", u4TimeCnt)); @@ -3847,7 +3722,7 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_RTSWCMDEN); - if(u4TimeCnt==0)//time out + if(u4TimeCnt==0) { vSetCalibrationResult(p, DRAM_CALIBRATION_ZQ, DRAM_FAIL); mcSHOW_ERR_MSG(("ZQCAL Latch fail (time out)\n")); @@ -3855,10 +3730,10 @@ static DRAM_STATUS_T ZQ_RTSWCMD_MODE_Cal(DRAMC_CTX_T *p, U8 rank) return DRAM_FAIL; } - // [JC] delay tZQLAT + mcDELAY_US(1); - // Restore rank, CKE fix on, HW MIOCK control settings + vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), u4SWCMDEN); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2), u4SWCMDCTRL); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_MPC_CTRL), u4MPCCTRL); @@ -3880,7 +3755,7 @@ static DRAM_STATUS_T ZQ_SCSM_MODE_Cal(DRAMC_CTX_T *p, U8 rank) U32 u4TimeCnt = TIME_OUT_CNT; U32 u4SWCMDEN, u4MPCCTRL, u4SWCMDCTRL, u4SPDCTRL, u4CKECTRL; - // Backup rank, CKE fix on/off, HW MIOCK control settings + u4SWCMDEN = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN)); u4SWCMDCTRL = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0)); u4MPCCTRL = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_MPC_OPTION)); @@ -3890,29 +3765,24 @@ static DRAM_STATUS_T ZQ_SCSM_MODE_Cal(DRAMC_CTX_T *p, U8 rank) mcSHOW_DBG_MSG4(("[ZQCalibration]\n")); //mcFPRINTF((fp_A60501, "[ZQCalibration]\n")); - // Disable HW MIOCK control to make CLK always on + DramCLKAlwaysOnOff(p, ON, TO_ONE_CHANNEL); mcDELAY_US(1); - //if CKE2RANK=1, only need to set CKEFIXON, it will apply to both rank. + CKEFixOnOff(p, rank, CKE_FIXON, TO_ONE_CHANNEL); - //Use rank swap or MRSRK to select rank - //DramcRankSwap(p, p->rank); - //!!R_DMMRSRK(R_DMMPCRKEN=1) specify rank0 or rank1 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), rank, SWCMD_CTRL0_MRSRK); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_MPC_OPTION), 1, MPC_OPTION_MPCRKEN); - //ZQCAL Start - //R_DMZQCEN, 0x1E4[4]=1 for ZQCal Start - //Wait zqc_response=1 (dramc_conf_nao, 0x3b8[4]) - //R_DMZQCEN, 0x1E4[4]=0 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_ZQCEN); do { u4Response = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP), SPCMDRESP_ZQC_RESPONSE); u4TimeCnt --; - mcDELAY_US(1); // Wait tZQCAL(min) 1us or wait next polling + mcDELAY_US(1); mcSHOW_DBG_MSG4(("%d- ", u4TimeCnt)); //mcFPRINTF((fp_A60501, "%d- ", u4TimeCnt)); @@ -3920,7 +3790,7 @@ static DRAM_STATUS_T ZQ_SCSM_MODE_Cal(DRAMC_CTX_T *p, U8 rank) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_ZQCEN); - if(u4TimeCnt==0)//time out + if(u4TimeCnt==0) { vSetCalibrationResult(p, DRAM_CALIBRATION_ZQ, DRAM_FAIL); mcSHOW_ERR_MSG(("ZQCAL Start fail (time out)\n")); @@ -3928,20 +3798,17 @@ static DRAM_STATUS_T ZQ_SCSM_MODE_Cal(DRAMC_CTX_T *p, U8 rank) return DRAM_FAIL; } - // [JC] delay tZQCAL + mcDELAY_US(1); u4TimeCnt = TIME_OUT_CNT; - //ZQCAL Latch - //R_DMZQLATEN, 0x1E4[6]=1 for ZQCal latch - //Wait zqlat_response=1 (dramc_conf_nao, 0x3b8[28]) - //R_DMZQLATEN, 0x1E4[6]=0 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_ZQLATEN); do { u4Response = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP), SPCMDRESP_ZQLAT_RESPONSE); u4TimeCnt --; - mcDELAY_US(1);// Wait tZQLAT 30ns or wait next polling + mcDELAY_US(1); mcSHOW_DBG_MSG4(("%d=", u4TimeCnt)); //mcFPRINTF((fp_A60501, "%d= ", u4TimeCnt)); @@ -3949,7 +3816,7 @@ static DRAM_STATUS_T ZQ_SCSM_MODE_Cal(DRAMC_CTX_T *p, U8 rank) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_ZQLATEN); - if(u4TimeCnt==0)//time out + if(u4TimeCnt==0) { vSetCalibrationResult(p, DRAM_CALIBRATION_ZQ, DRAM_FAIL); mcSHOW_ERR_MSG(("ZQCAL Latch fail (time out)\n")); @@ -3957,10 +3824,10 @@ static DRAM_STATUS_T ZQ_SCSM_MODE_Cal(DRAMC_CTX_T *p, U8 rank) return DRAM_FAIL; } - // [JC] delay tZQLAT + mcDELAY_US(1); - // Restore rank, CKE fix on, HW MIOCK control settings + vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), u4SWCMDEN); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL2), u4SWCMDCTRL); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_MPC_CTRL), u4MPCCTRL); @@ -3981,7 +3848,7 @@ DRAM_STATUS_T DramcZQCalibration(DRAMC_CTX_T *p, U8 rank) return ZQ_SWCMD_MODE_Cal(p, rank); #elif ZQ_RTSWCMD_MODE return ZQ_RTSWCMD_MODE_Cal(p, rank); - #else //ZQ_SCSM_MODE + #else return ZQ_SCSM_MODE_Cal(p, rank); #endif } @@ -4004,7 +3871,7 @@ static U8 RXInputBuf_DelayExchange(S8 iOfst) return u1Value; } -// cannot be simulated in DV or DSim, it's analog feature. + DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) { S8 iOffset, s1begin, s1end; @@ -4042,7 +3909,7 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) DramcBackupRegisters(p, u4RegBackupAddress, ARRAY_SIZE(u4RegBackupAddress)); - //Swith RX from Rank1 to Rank0 + DramcEngine2Run(p, TE_OP_READ_CHECK, TEST_AUDIO_PATTERN); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_RX_IN_GATE_EN_CTRL), 0xf, MISC_RX_IN_GATE_EN_CTRL_FIX_IN_GATE_EN); @@ -4069,18 +3936,17 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) P_Fld(1, CA_CMD6_RG_TX_ARCMD_DDR4_SEL)); } - //Enable VREF, (RG_RX_*DQ_VREF_EN_* =1) + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ5), 1, B0_DQ5_RG_RX_ARDQ_VREF_EN_B0); if (!isLP4_DSC) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ5), 1, B1_DQ5_RG_RX_ARDQ_VREF_EN_B1); else vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD5), 1, CA_CMD5_RG_RX_ARCMD_VREF_EN); - // Wait 1us. + mcDELAY_US(1); - //Enable RX input buffer (RG_RX_*DQ_IN_BUFF_EN_* =1, DA_RX_*DQ_IN_GATE_EN_* =1) - //Enable RX input buffer offset calibration (RG_RX_*DQ_OFFC_EN_*=1) + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ3), P_Fld(1, B0_DQ3_RG_RX_ARDQ_IN_BUFF_EN_B0) | P_Fld(1, B0_DQ3_RG_RX_ARDQ_OFFC_EN_B0)); if (!isLP4_DSC) { @@ -4091,7 +3957,7 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD3), P_Fld(1, CA_CMD3_RG_RX_ARCMD_IN_BUFF_EN) | P_Fld(1, CA_CMD3_RG_RX_ARCLK_IN_BUFF_EN)); } - // DQ_BUFF_EN_SEL + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_PHY3), 1, B0_PHY3_RG_RX_ARDQ_BUFF_EN_SEL_B0); if (!isLP4_DSC) { @@ -4124,7 +3990,7 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) else vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD6), 1, CA_CMD6_RG_RX_ARCMD_O1_SEL); - // SW parameter initialization + u1FinishCount =0; s1begin = -7; s1end = 8; @@ -4133,14 +3999,14 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) memset(s1DQFinalFlagChange, 0x7f, sizeof(s1DQFinalFlagChange)); memset(s1DQMFinalFlagChange, 0x7f, sizeof(s1DQMFinalFlagChange)); - //Sweep RX offset calibration code (RG_RX_*DQ*_OFFC<3:0>), the MSB is sign bit, sweep the code from -7(1111) to +7(0111) + for(iOffset = s1begin; iOffset < s1end; iOffset+=u1step) { u1Offc_RgValue = RXInputBuf_DelayExchange(iOffset); mcSHOW_DBG_MSG2(("iOffset= %2d, set %2d,", iOffset, u1Offc_RgValue)); - //Delay of B0/B1 DQ0~DQ7. + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQ0), P_Fld(u1Offc_RgValue, SHU_RK_B0_DQ0_RG_RX_ARDQ0_OFFC_B0) | P_Fld(u1Offc_RgValue, SHU_RK_B0_DQ0_RG_RX_ARDQ1_OFFC_B0) | @@ -4176,7 +4042,7 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) P_Fld(u1Offc_RgValue, SHU_RK_CA_DQ_OFFSET_RG_RX_ARDQ7_OFFSETC_C0)); } - //Delay of B0/B1 DQM0 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQ1), u1Offc_RgValue, SHU_RK_B0_DQ1_RG_RX_ARDQM0_OFFC_B0); if (!isLP4_DSC) { @@ -4187,11 +4053,10 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_CA_CMD1), u1Offc_RgValue, SHU_RK_CA_CMD1_RG_RX_ARCS0_OFFC); } - //For each code sweep, wait 0.1us to check the flag. + mcDELAY_US(1); - //Check offset flag of DQ (RGS_*DQ*_OFFSET_FLAG_*), the value will be from 1(-7) to 0(+7). Record the value when the flag becomes "0". - //Flag bit0 is for DQ0, Flag bit15 for DQ15 + u4RestltDQ_B0 = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_AD_RX_DQ_O1), MISC_AD_RX_DQ_O1_AD_RX_ARDQ_O1_B0); if (!isLP4_DSC) { @@ -4208,11 +4073,11 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) for(u1BitIdx= 0; u1BitIdx < DQ_DATA_WIDTH ; u1BitIdx++) { - if(s1DQFinalFlagChange[u1BitIdx] == 0x7f) //invalid + if(s1DQFinalFlagChange[u1BitIdx] == 0x7f) { u1O1_value = (u4RestltDQ >> u1BitIdx) & 0x1; - if(u1O1_value ==0) // 1 -> 0 + if(u1O1_value ==0) { s1DQFinalFlagChange[u1BitIdx] = iOffset; u1FinishCount ++; @@ -4233,7 +4098,7 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) } } - //Check offset flag of DQM (RGS_*DQ*_OFFSET_FLAG_*), the value will be from 1(-7) to 0(+7). Record the value when the flag becomes "0". + u4RestltDQM[0] = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_AD_RX_DQ_O1), MISC_AD_RX_DQ_O1_AD_RX_ARDQM0_O1_B0); if (!isLP4_DSC) { @@ -4248,9 +4113,9 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) for(u1ByteIdx= 0; u1ByteIdx < DQM_BYTE_NUM; u1ByteIdx++) { - if(s1DQMFinalFlagChange[u1ByteIdx]== 0x7f) //invalid + if(s1DQMFinalFlagChange[u1ByteIdx]== 0x7f) { - if(u4RestltDQM[u1ByteIdx]==0)// 1 -> 0 + if(u4RestltDQM[u1ByteIdx]==0) { s1DQMFinalFlagChange[u1ByteIdx]= iOffset; u1FinishCount++; @@ -4271,11 +4136,11 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) } } - if(u1FinishCount==(DQM_BYTE_NUM+DQ_DATA_WIDTH)) // (DQ8 bits, DQM 1bit, total 9 bits.) x2 bytes + if(u1FinishCount==(DQM_BYTE_NUM+DQ_DATA_WIDTH)) { vSetCalibrationResult(p, DRAM_CALIBRATION_RX_INPUT_BUFF_OFFC, DRAM_OK); mcSHOW_DBG_MSG2(("All bits find pass window, early break!\n")); - break; //all bits done, early break + break; } } @@ -4358,14 +4223,14 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) } vSetRank(p, read_val_b0); - //need to set 0 after DramcRXInputBufferOffsetCal + //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_RX_IN_GATE_EN_CTRL), 0x0, MISC_RX_IN_GATE_EN_CTRL_FIX_IN_GATE_EN); //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ11), 0x0, SHU_B0_DQ11_RG_RX_ARDQ_OFFSETC_EN_B0); //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ11), 0x0, SHU_B1_DQ11_RG_RX_ARDQ_OFFSETC_EN_B1); DramcRestoreRegisters(p, u4RegBackupAddress, ARRAY_SIZE(u4RegBackupAddress)); - //after K, must set OFFSET_BIAS_EN as1 and OFFSET_EN as 0 + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ11), P_Fld(0x1, SHU_B0_DQ11_RG_RX_ARDQ_OFFSETC_BIAS_EN_B0) | P_Fld(0x0, SHU_B0_DQ11_RG_RX_ARDQ_OFFSETC_EN_B0)); @@ -4392,10 +4257,7 @@ DRAM_STATUS_T DramcRXInputBufferOffsetCal(DRAMC_CTX_T *p) #define GATING_PATTERN_NUM_LP5 0x23 #define GATING_GOLDEND_DQSCNT_LP5 0x4646 #define RXDQS_GATING_AUTO_DBG_REG_NUM 6 -/* Preamble & Postamble setting. Currently use macro to define. - * Later may use speed or MR setting to decide - * !!! REVIEW !!! - */ + #if GATING_ADJUST_TXDLY_FOR_TRACKING U8 u1TXDLY_Cal_min =0xff, u1TXDLY_Cal_max=0; @@ -4464,26 +4326,26 @@ U8 __wa__gating_autok_init_ui[RANK_MAX] = { 0 }; static U8 u1GetGatingStartPos(DRAMC_CTX_T *p, U8 u1AutoK) { - const U8 au1MR2MappingToRL[2][8] = {{6, 10, 14, 20, 24, 28, 32, 36}, //normal mode - {6, 10, 16, 22, 26, 32, 36, 40}}; //byte mode + const U8 au1MR2MappingToRL[2][8] = {{6, 10, 14, 20, 24, 28, 32, 36}, + {6, 10, 16, 22, 26, 32, 36, 40}}; //U8 u1CK2WCK, u1DVFSCEn; U8 u1MR0_LatencyMode; U8 u1MR2RLValue; - u1MR2RLValue = u1MR02Value[p->dram_fsp] & 0x7; //MR2 Op[2:0] + u1MR2RLValue = u1MR02Value[p->dram_fsp] & 0x7; U8 u1RX_Path_delay_UI, u1RealRL,u1StartUI, u1ExtraMCKfor1_4mode; U8 u1MCK2CK_UI, u1ReadDQSINCTL, u1DQSINCTL_UI; U8 u4TDQSCK_UI_min; U8 u1GatingAheadDQS_UI; - /* LPDDR5 uses same bit */ - if(gu2MR0_Value[p->rank] == 0xffff) //MR0 is not ready + + if(gu2MR0_Value[p->rank] == 0xffff) { u1MR0_LatencyMode = CBT_NORMAL_MODE; } else { - u1MR0_LatencyMode = (gu2MR0_Value[p->rank]>>1) & 0x1; //MR0 OP[1], 0:normal mode, 1:byte mode + u1MR0_LatencyMode = (gu2MR0_Value[p->rank]>>1) & 0x1; } { @@ -4491,7 +4353,7 @@ static U8 u1GetGatingStartPos(DRAMC_CTX_T *p, U8 u1AutoK) u1RealRL = au1MR2MappingToRL[u1MR0_LatencyMode][u1MR2RLValue]; } - ///TODO: A60868 does not support LP5 DIV4, current setting is not provided for LP5 + if(vGet_Div_Mode(p) == DIV4_MODE) { u1MCK2CK_UI = 4; @@ -4506,22 +4368,22 @@ static U8 u1GetGatingStartPos(DRAMC_CTX_T *p, U8 u1AutoK) } else { - /* DIV16, only for LP5 */ + u1MCK2CK_UI = 16; u1ExtraMCKfor1_4mode = 0; u1GatingAheadDQS_UI = 8; } - // RX_Path_delay_UI = RL*2 + tDQSCK_UI<1500~3500ps> - PHY_interanl<skip 30ps> - GatingAheadDQS<2UI> + if(1:4 mod)+1MCK + u1RX_Path_delay_UI = (u1RealRL<<1) + u4TDQSCK_UI_min - u1GatingAheadDQS_UI + (u1MCK2CK_UI*u1ExtraMCKfor1_4mode); u1ReadDQSINCTL = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RK_DQSCTL), MISC_SHU_RK_DQSCTL_DQSINCTL); u1DQSINCTL_UI = u1ReadDQSINCTL * u1MCK2CK_UI; if(u1AutoK) - u1RX_Path_delay_UI += 0; //HW K start position = gating min position(1500ns) + u1RX_Path_delay_UI += 0; else - u1RX_Path_delay_UI -= 3; //SW K start position = gating min position(1500ns) -3UI + u1RX_Path_delay_UI -= 3; if(u1RX_Path_delay_UI >= u1DQSINCTL_UI) u1StartUI = u1RX_Path_delay_UI - u1DQSINCTL_UI; @@ -4595,7 +4457,7 @@ static void rxdqs_gating_fastk_save_restore(DRAMC_CTX_T *p, /* Calculate P1 */ best_win->best_dqsien_dly_ui_p1[dqs_i] = best_win->best_dqsien_dly_mck[dqs_i] * ui_per_mck + - best_win->best_dqsien_dly_ui[dqs_i] + freq_div; /* Total UI for Phase1 */ + best_win->best_dqsien_dly_ui[dqs_i] + freq_div; best_win->best_dqsien_dly_mck_p1[dqs_i] = best_win->best_dqsien_dly_ui_p1[dqs_i] / ui_per_mck; best_win->best_dqsien_dly_ui_p1[dqs_i] = @@ -4637,20 +4499,12 @@ static void rxdqs_gating_misc_process(DRAMC_CTX_T *p, "Gating_Center_", "PI", dqs_i, rxdqs_best_win->best_dqsien_dly_pi[dqs_i], NULL); #endif - /*TINFO="best DQS%d delay(2T, 0.5T, PI) = (%d, %d, %d)\n", dqs_i, rxdqs_best_win.best_dqsien_dly_mck[dqs_i], rxdqs_best_win.best_dqsien_dly_ui[dqs_i], rxdqs_best_win.best_dqsien_dly_pi[dqs_i])); */ + mcSHOW_DBG_MSG(("best DQS%d dly(MCK, UI, PI) = (%d, %d, %d)\n", dqs_i, rxdqs_best_win->best_dqsien_dly_mck[dqs_i], rxdqs_best_win->best_dqsien_dly_ui[dqs_i], rxdqs_best_win->best_dqsien_dly_pi[dqs_i])); - /*mcDUMP_REG_MSG(("best DQS%d dly(MCK, UI, PI) = (%d, %d, %d)\n", dqs_i, - rxdqs_best_win->best_dqsien_dly_mck[dqs_i], - rxdqs_best_win->best_dqsien_dly_ui[dqs_i], - rxdqs_best_win->best_dqsien_dly_pi[dqs_i]));*/ - /* cc mark mcFPRINTF((fp_A60501,"best DQS%d dly(MCK, UI, PI) = (%d, %d, %d)\n", dqs_i, - rxdqs_best_win.best_dqsien_dly_mck[dqs_i], - rxdqs_best_win.best_dqsien_dly_ui[dqs_i], - rxdqs_best_win.best_dqsien_dly_pi[dqs_i])); - */ + #if GATING_ADJUST_TXDLY_FOR_TRACKING u1TX_dly_DQSgated = (rxdqs_best_win->best_dqsien_dly_mck[dqs_i] << 4) + @@ -4672,26 +4526,18 @@ static void rxdqs_gating_misc_process(DRAMC_CTX_T *p, } mcSHOW_DBG_MSG(("\n")); - //cc mark mcFPRINTF((fp_A60501,"\n")); + for (dqs_i=0; dqs_i<DQS_BYTE_NUMBER; dqs_i++) { - /*TINFO="best DQS%d P1 delay(2T, 0.5T, PI) = (%d, %d, %d)\n", dqs_i, rxdqs_best_win.best_dqsien_dly_mck_p1[dqs_i], rxdqs_best_win.best_dqsien_dly_ui_p1[dqs_i], rxdqs_best_win.best_dqsien_dly_pi_p1[dqs_i]*/ + mcSHOW_DBG_MSG(("best DQS%d P1 dly(MCK, UI, PI) = (%d, %d, %d)\n", dqs_i, rxdqs_best_win->best_dqsien_dly_mck_p1[dqs_i], rxdqs_best_win->best_dqsien_dly_ui_p1[dqs_i], rxdqs_best_win->best_dqsien_dly_pi_p1[dqs_i])); - /*mcDUMP_REG_MSG(("best DQS%d P1 dly(MCK, UI, PI) = (%d, %d, %d)\n", dqs_i, - rxdqs_best_win->best_dqsien_dly_mck_p1[dqs_i], - rxdqs_best_win->best_dqsien_dly_ui_p1[dqs_i], - rxdqs_best_win->best_dqsien_dly_pi_p1[dqs_i]));*/ - /* cc mark mcFPRINTF((fp_A60501,"best DQS%d P1 dly(2T, 0.5T, PI) = (%d, %d, %d)\n", dqs_i, - rxdqs_best_win.best_dqsien_dly_mck_p1[dqs_i], - rxdqs_best_win.best_dqsien_dly_ui_p1[dqs_i], - rxdqs_best_win.best_dqsien_dly_pi_p1[dqs_i])); - */ + #if GATING_ADJUST_TXDLY_FOR_TRACKING - // find max gating TXDLY (should be in P1) + u1TX_dly_DQSgated = (rxdqs_best_win->best_dqsien_dly_mck_p1[dqs_i] << 4) + rxdqs_best_win->best_dqsien_dly_ui_p1[dqs_i]; @@ -4714,18 +4560,18 @@ static void rxdqs_gating_misc_process(DRAMC_CTX_T *p, if(p->frequency >= RDSEL_TRACKING_TH) { - //Byte 0 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_INI_UIPI), (ucbest_coarse_mck_backup[p->rank][0] << 4) | (ucbest_coarse_ui_backup[p->rank][0]), - SHU_R0_B0_INI_UIPI_CURR_INI_UI_B0);//UI + SHU_R0_B0_INI_UIPI_CURR_INI_UI_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_INI_UIPI), rxdqs_best_win->best_dqsien_dly_pi[0], - SHU_R0_B0_INI_UIPI_CURR_INI_PI_B0); //PI - //Byte 1 + SHU_R0_B0_INI_UIPI_CURR_INI_PI_B0); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_INI_UIPI), (ucbest_coarse_mck_backup[p->rank][1] << 4) | (ucbest_coarse_ui_backup[p->rank][1]), - SHU_R0_B1_INI_UIPI_CURR_INI_UI_B1);//UI + SHU_R0_B1_INI_UIPI_CURR_INI_UI_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_INI_UIPI), - rxdqs_best_win->best_dqsien_dly_pi[1], SHU_R0_B1_INI_UIPI_CURR_INI_PI_B1); //PI + rxdqs_best_win->best_dqsien_dly_pi[1], SHU_R0_B1_INI_UIPI_CURR_INI_PI_B1); } #endif @@ -4734,7 +4580,7 @@ static void rxdqs_gating_misc_process(DRAMC_CTX_T *p, #if GATING_AUTO_K_SUPPORT static void rxdqs_gating_auto_cal_reset(DRAMC_CTX_T *p) { - /* Reset internal autok status and logic */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DQSIEN_AUTOK_CFG0), P_Fld(0x1, MISC_DQSIEN_AUTOK_CFG0_DQSIEN_AUTOK_RK0_SW_RST) | P_Fld(0x1, MISC_DQSIEN_AUTOK_CFG0_DQSIEN_AUTOK_RK1_SW_RST) | @@ -4750,13 +4596,11 @@ static void rxdqs_gating_auto_cal_reset(DRAMC_CTX_T *p) static void rxdqs_gating_auto_cal_cfg(DRAMC_CTX_T *p, struct rxdqs_gating_auto_param *auto_param) { - /* Before start calibration, reset all state machine and all rank's state */ + rxdqs_gating_auto_cal_reset(p); - /*----------- - * Normal Setting, Same as SW calibration - *---------------*/ + if (p->frequency == 800) { vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL1), 0x1, MISC_STBCAL1_STBCNT_SW_RST); @@ -4765,7 +4609,7 @@ static void rxdqs_gating_auto_cal_cfg(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL1), 0x1, MISC_STBCAL1_STBCNT_SHU_RST_EN); - /* SELPH_MODE = BY RANK */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 0x1, MISC_STBCAL2_DQSIEN_SELPH_BY_RANK_EN); @@ -4777,7 +4621,7 @@ static void rxdqs_gating_auto_cal_cfg(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL1), 0x1, MISC_STBCAL1_DIS_PI_TRACK_AS_NOT_RD); - /* PICG_EARLY_EN */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ6), 0x1, B0_DQ6_RG_RX_ARDQ_OP_BIAS_SW_EN_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ6), @@ -4785,7 +4629,7 @@ static void rxdqs_gating_auto_cal_cfg(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 0x1, MISC_STBCAL2_STB_PICG_EARLY_1T_EN); - /* BURST_MODE */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_STBCAL), 0x1, MISC_SHU_STBCAL_DQSIEN_BURST_MODE); @@ -4803,7 +4647,7 @@ static void rxdqs_gating_auto_cal_cfg(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL), 0x1, MISC_STBCAL_DQSIENMODE); - /* New Rank Mode */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), P_Fld(0x1, MISC_STBCAL2_STB_IG_XRANK_CG_RST) | P_Fld(0x1, MISC_STBCAL2_STB_RST_BY_RANK) | @@ -4814,27 +4658,20 @@ static void rxdqs_gating_auto_cal_cfg(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_PHY2), 0x1, B1_PHY2_RG_RX_ARDQS_DQSIEN_UI_LEAD_LAG_EN_B1); - /* dummy read */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_DUMMY_RD), 0x1, DUMMY_RD_DUMMY_RD_PA_OPT); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CG_CTRL0), 0x1, MISC_CG_CTRL0_RG_CG_PHY_OFF_DIABLE); - //Yulia add workaround for auto K pattern length. : Apply for all project before IPM_V2 - //Dummy read BL should be controlled by DQSIEN_AUTOK_BURST_LENGTH, but now we can only use dummy read length(DMY_RD_LEN) - //DMY_RD_LEN (0 for BL8, 1 for BL16, 3 for BL32) - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_DUMMY_RD_ADR), 3/*auto_param->burst_len*/, RK_DUMMY_RD_ADR_DMY_RD_LEN); - /* Decide by HW Although Dummy read used, but TA2 has higher priority */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_DUMMY_RD_ADR), 3, RK_DUMMY_RD_ADR_DMY_RD_LEN); + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4), 0x4, TEST2_A4_TESTAGENTRKSEL); - //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 1, - // MISC_STBCAL2_STBENCMPEN); - /*----------- - * Auto calibration setting - *-------------------*/ vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DQSIEN_AUTOK_CFG0), P_Fld(auto_param->init_mck, MISC_DQSIEN_AUTOK_CFG0_DQSIEN_AUTOK_INI_MCK) | P_Fld(auto_param->init_ui, MISC_DQSIEN_AUTOK_CFG0_DQSIEN_AUTOK_INI__UI) | @@ -4852,9 +4689,7 @@ static void rxdqs_gating_auto_cal_cfg(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DQSIEN_AUTOK_CFG0), auto_param->early_break, MISC_DQSIEN_AUTOK_CFG0_DQSIEN_AUTOK_EARLY_BREAK_EN); - /*--------- - * DV settings - *-------------------*/ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL), 0x0, MISC_STBCAL_PICGEN); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_STBCAL), @@ -4928,7 +4763,7 @@ static void rxdqs_gating_set_final_result(DRAMC_CTX_T *p, U8 mck2ui, } #endif - /* Set DQSIEN delay in MCK and UI */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_MCK_UI_DLY), P_Fld(best_win->best_dqsien_dly_mck[0], SHU_RK_B0_DQSIEN_MCK_UI_DLY_DQSIEN_MCK_P0_B0) | @@ -4981,7 +4816,7 @@ static void rxdqs_gating_set_final_result(DRAMC_CTX_T *p, U8 mck2ui, } #if GATING_AUTO_K_SUPPORT -/* By autoK: Set the result calibrated by HW to RG */ + static void rxdqs_gating_auto_xlate(DRAMC_CTX_T *p, struct rxdqs_gating_best_win *best_win, struct rxdqs_gating_cal *rxdqs_cal) @@ -4997,7 +4832,7 @@ static void rxdqs_gating_auto_xlate(DRAMC_CTX_T *p, U16 value; u8 dqs_i; - /* Transfer HW unit to RG unit */ + for (dqs_i = 0; dqs_i < DQS_BYTE_NUMBER; dqs_i++) { mck = best_win->best_dqsien_dly_mck[dqs_i]; ui = best_win->best_dqsien_dly_ui[dqs_i]; @@ -5006,17 +4841,17 @@ static void rxdqs_gating_auto_xlate(DRAMC_CTX_T *p, freq_div = rxdqs_cal->dqsien_freq_div; if (vGet_Div_Mode(p) == DIV16_MODE) - total_ui = (mck << 4) + ui; /* 1:16 mode */ + total_ui = (mck << 4) + ui; else if (vGet_Div_Mode(p) == DIV8_MODE) - total_ui = (mck << 3) + ui; /* 1: 8 mode */ + total_ui = (mck << 3) + ui; else - total_ui = (mck << 2) + ui; /* 1: 4 mode */ + total_ui = (mck << 2) + ui; + - /* RG is always 1:16 mode */ mck = (total_ui >> 4); ui = (total_ui & 0xf); - value = mck * mck2ui + ui; /* Total UI number */ + value = mck * mck2ui + ui; mck_p1 = (value + freq_div) / mck2ui; ui_p1 = (value + freq_div) % mck2ui; @@ -5055,7 +4890,7 @@ static DRAM_STATUS_T rxdqs_gating_auto_cal_status(DRAMC_CTX_T *p, while (done_bytes < total_bytes) { for (dqs_i = 0; dqs_i < DQS_BYTE_NUMBER; dqs_i++) { - /* If already done, skip this byte */ + if (done[dqs_i]) continue; @@ -5068,9 +4903,9 @@ static DRAM_STATUS_T rxdqs_gating_auto_cal_status(DRAMC_CTX_T *p, DDRPHY_REG_DQSIEN_AUTOK_B0_RK0_STATUS0 + byte_ofst), DQSIEN_AUTOK_B0_RK0_STATUS0_AUTOK_ERR_B0_RK0); - /* If autok fail, done flag will not be asserted. */ + if (done[dqs_i] || error[dqs_i]) { - /* Done and Pass */ + if (error[dqs_i] == 0) { mck_center[dqs_i] = u4IO32ReadFldAlign(DRAMC_REG_ADDR( DDRPHY_REG_DQSIEN_AUTOK_B0_RK0_STATUS0 + byte_ofst), @@ -5092,7 +4927,7 @@ static DRAM_STATUS_T rxdqs_gating_auto_cal_status(DRAMC_CTX_T *p, DDRPHY_REG_DQSIEN_AUTOK_B0_RK0_STATUS1 + byte_ofst), DQSIEN_AUTOK_B0_RK0_STATUS1_DQSIEN_AUTOK_L__PI_B0_RK0); - /* If early break mode not enabled, right boundary could be found */ + if (auto_param->early_break == DISABLE) { mck_right[dqs_i] = u4IO32ReadFldAlign(DRAMC_REG_ADDR( DDRPHY_REG_DQSIEN_AUTOK_B0_RK0_STATUS1 + byte_ofst), @@ -5107,7 +4942,7 @@ static DRAM_STATUS_T rxdqs_gating_auto_cal_status(DRAMC_CTX_T *p, } else { - /* If error occurred for this byte, it will be treated as a DONE condition */ + done[dqs_i] = 1; } @@ -5138,7 +4973,7 @@ static DRAM_STATUS_T rxdqs_gating_auto_cal_status(DRAMC_CTX_T *p, mcDELAY_MS(1); } - /* Log it */ + for (dqs_i = 0; dqs_i < DQS_BYTE_NUMBER; dqs_i++) { mcSHOW_DBG_MSG(("[Gating][%s] AUTOK of CH-%d, Rk-%d, Byte-%d:\n", error[dqs_i]? "Fail" : "Pass", p->channel, p->rank, dqs_i)); @@ -5158,7 +4993,7 @@ static DRAM_STATUS_T rxdqs_gating_auto_cal_status(DRAMC_CTX_T *p, if (error[dqs_i]) { ret = DRAM_FAIL; } else { - /* If passed, shall set the result to RG */ + best_win->best_dqsien_dly_mck[dqs_i] = mck_center[dqs_i]; best_win->best_dqsien_dly_ui[dqs_i] = ui_center[dqs_i]; best_win->best_dqsien_dly_pi[dqs_i] = pi_center[dqs_i]; @@ -5218,14 +5053,14 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_auto_cal(DRAMC_CTX_T *p) start_ui = u1GetGatingStartPos(p, AUTOK_ON); end_ui = start_ui + 32; - /* Set auto calibration params */ + auto_param.early_break = ENABLE; auto_param.dbg_mode = ENABLE; auto_param.init_mck = start_ui / mck2ui_hw; auto_param.init_ui = start_ui % mck2ui_hw; auto_param.end_mck = end_ui / mck2ui_hw; auto_param.end_ui = end_ui % mck2ui_hw; - auto_param.pi_offset = 2; /* 2 ^ 2 = 4 */ + auto_param.pi_offset = 2; auto_param.burst_len = RXDQS_BURST_LEN_8; @@ -5240,11 +5075,11 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_auto_cal(DRAMC_CTX_T *p) auto_param.pi_offset = psra->dqsien_autok_pi_offset? ENABLE: DISABLE; } -#endif /* FOR_DV_SIMULATION_USED == 1 */ +#endif rxdqs_gating_auto_cal_cfg(p, &auto_param); - /* Trigger HW auto k */ + rxdqs_gating_auto_cal_trigger(p); ret = rxdqs_gating_auto_cal_status(p, &auto_param, &rxdqs_best_win); @@ -5270,12 +5105,10 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_auto_cal(DRAMC_CTX_T *p) static void rxdqs_gating_sw_cal_init(DRAMC_CTX_T *p, U8 use_enhanced_rdqs) { - /* Disable Per-Bank ref */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_CONF0), 0, SHU_CONF0_PBREFEN); - /*---------------- - * From DV - *------------------------*/ + if (p->frequency == 800) { vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL1), 0x1, MISC_STBCAL1_STBCNT_SW_RST); @@ -5284,7 +5117,7 @@ static void rxdqs_gating_sw_cal_init(DRAMC_CTX_T *p, U8 use_enhanced_rdqs) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL1), 0x1, MISC_STBCAL1_STBCNT_SHU_RST_EN); - /* SELPH_MODE = BY RANK */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 0x1, MISC_STBCAL2_DQSIEN_SELPH_BY_RANK_EN); @@ -5296,7 +5129,7 @@ static void rxdqs_gating_sw_cal_init(DRAMC_CTX_T *p, U8 use_enhanced_rdqs) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL1), 0x1, MISC_STBCAL1_DIS_PI_TRACK_AS_NOT_RD); - /* PICG_EARLY_EN */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ6), 0x1, B0_DQ6_RG_RX_ARDQ_OP_BIAS_SW_EN_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ6), @@ -5304,7 +5137,7 @@ static void rxdqs_gating_sw_cal_init(DRAMC_CTX_T *p, U8 use_enhanced_rdqs) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 0x1, MISC_STBCAL2_STB_PICG_EARLY_1T_EN); - /* BURST_MODE */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_STBCAL), 0x1, MISC_SHU_STBCAL_DQSIEN_BURST_MODE); @@ -5322,7 +5155,7 @@ static void rxdqs_gating_sw_cal_init(DRAMC_CTX_T *p, U8 use_enhanced_rdqs) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL), 0x1, MISC_STBCAL_DQSIENMODE); - /* New Rank Mode */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), P_Fld(0x1, MISC_STBCAL2_STB_IG_XRANK_CG_RST) | P_Fld(0x1, MISC_STBCAL2_STB_RST_BY_RANK) | @@ -5341,14 +5174,14 @@ static void rxdqs_gating_sw_cal_init(DRAMC_CTX_T *p, U8 use_enhanced_rdqs) vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RX_SET0), 0, RX_SET0_DM4TO1MODE); - /* enable &reset DQS counter */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 1, MISC_STBCAL2_DQSG_CNT_EN); - mcDELAY_US(4); /* wait 1 auto refresh after DQS Counter enable */ + mcDELAY_US(4); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 1, MISC_STBCAL2_DQSG_CNT_RST); - mcDELAY_US(1); /* delay 2T */ + mcDELAY_US(1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 0, MISC_STBCAL2_DQSG_CNT_RST); @@ -5358,7 +5191,7 @@ static void rxdqs_gating_sw_cal_init(DRAMC_CTX_T *p, U8 use_enhanced_rdqs) 0xaa000000 | GATING_PATTERN_NUM_LP5, TEST_AUDIO_PATTERN, 0, TE_NO_UI_SHIFT); if (use_enhanced_rdqs) { - /* TBD. Enter Enhanced RDQS training mode */ + } } @@ -5388,7 +5221,7 @@ static void rxdqs_gating_set_dqsien_dly(DRAMC_CTX_T *p, U8 dly_ui, value = (reg_mck * mck2ui) + reg_ui; if (value >= 11) { - /* For RODT, MCK2UI is different from Gating */ + U8 rodt_mck2ui = get_rodt_mck2ui(p); value -= 11; @@ -5407,7 +5240,7 @@ static void rxdqs_gating_set_dqsien_dly(DRAMC_CTX_T *p, U8 dly_ui, } #endif - /* Set DQSIEN delay in MCK and UI */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_MCK_UI_DLY), P_Fld(reg_mck, SHU_RK_B0_DQSIEN_MCK_UI_DLY_DQSIEN_MCK_P0_B0) | @@ -5454,7 +5287,7 @@ static void rxdqs_gating_set_dqsien_dly(DRAMC_CTX_T *p, U8 dly_ui, static void rxdqs_gating_sw_cal_trigger(DRAMC_CTX_T *p, struct rxdqs_gating_cal *rxdqs_cal) { -#if 0//ENABLE_DDR800_OPEN_LOOP_MODE_OPTION -> No 0.5UI after A60868 +#if 0 if (u1IsPhaseMode(p) == TRUE) { vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_DQ0), rxdqs_cal->dqsien_dly_pi >> 4, SHU_R0_B0_DQ0_DA_ARPI_DDR400_0D5UI_RK0_B0); @@ -5476,7 +5309,7 @@ static void rxdqs_gating_sw_cal_trigger(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2), 0, MISC_STBCAL2_DQSG_CNT_RST); - /* enable TE2, audio pattern */ + DramcEngine2Run(p, TE_OP_READ_CHECK, TEST_AUDIO_PATTERN); } @@ -5520,7 +5353,7 @@ static void rxdqs_gating_get_leadlag(DRAMC_CTX_T *p, rxdqs_trans->dqs_high[dqs_i]++; rxdqs_trans->dqs_transition[dqs_i] = 1; - /* Record the latest value that causes (lead, lag) = (1, 1) */ + rxdqs_trans->dqsien_dly_mck_leadlag[dqs_i] = rxdqs_cal->dqsien_dly_mck; rxdqs_trans->dqsien_dly_ui_leadlag[dqs_i] = @@ -5529,7 +5362,7 @@ static void rxdqs_gating_get_leadlag(DRAMC_CTX_T *p, rxdqs_cal->dqsien_dly_pi; } else if ((rxdqs_trans->dqs_high[dqs_i] * rxdqs_cal->dqsien_pi_adj_step) >= debounce_thrd_PI) { - /* Consecutive 16 PI DQS high for de-glitch */ + if (((rxdqs_trans->dqs_lead[dqs_i] == 1) && (rxdqs_trans->dqs_lag[dqs_i] == 0)) || ((rxdqs_trans->dqs_lead[dqs_i] == 0) && @@ -5541,7 +5374,7 @@ static void rxdqs_gating_get_leadlag(DRAMC_CTX_T *p, (rxdqs_trans->dqs_lag[dqs_i] == 0)){ if ((rxdqs_trans->dqs_low[dqs_i] * rxdqs_cal->dqsien_pi_adj_step) >= debounce_thrd_PI) { - /* (lead, lag) = (0, 0), transition done */ + rxdqs_trans->dqs_transitioned[dqs_i] = 1; } rxdqs_trans->dqs_low[dqs_i]++; @@ -5551,12 +5384,12 @@ static void rxdqs_gating_get_leadlag(DRAMC_CTX_T *p, } #else else { - /* (lead, lag) = (0, 0), transition done */ + rxdqs_trans->dqs_transitioned[dqs_i] = 1; } #endif } else { - /* Lead/lag = (1, 1) number is too few. Reset dqs_high */ + rxdqs_trans->dqs_high[dqs_i] = 0; #if GATING_LEADLAG_LOW_LEVEL_CHECK rxdqs_trans->dqs_low[dqs_i] = 0; @@ -5599,15 +5432,11 @@ static U8 rxdqs_gating_sw_cal(DRAMC_CTX_T *p, MISC_STBERR_ALL_GATING_ERROR_B1_RK1); } - /* read DQS counter - * Note: DQS counter is no longer used as pass condition. Here - * Read it and log it is just as debug method. Any way, DQS counter - * can still be used as a clue: it will be n*0x23 when gating is correct - */ + debug_cnt[0] = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_CAL_DQSG_CNT_B0)); debug_cnt[1] = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_CAL_DQSG_CNT_B1)); - /* read (lead, lag) */ + rxdqs_gating_get_leadlag(p, rxdqs_trans, rxdqs_cal); mcSHOW_DBG_MSG2(("%2d %2d %2d | ", @@ -5621,13 +5450,13 @@ static U8 rxdqs_gating_sw_cal(DRAMC_CTX_T *p, debug_pass_cnt = GATING_GOLDEND_DQSCNT_LP5; - /* Decide the window center */ + for (dqs_i = 0; dqs_i < DQS_BYTE_NUMBER; dqs_i++) { if (passed_bytes & (1 << dqs_i)) continue; if ((gating_error[dqs_i] == 0) && (debug_cnt[dqs_i] == debug_pass_cnt)) { - /* Calcuate DQSIEN position */ + if (rxdqs_trans->dqs_transitioned[dqs_i] != 0) { U8 pass_count = rxdqs_trans->dqs_transition[dqs_i]; U8 offset = (pass_count * rxdqs_cal->dqsien_pi_adj_step) / 2; @@ -5638,23 +5467,23 @@ static U8 rxdqs_gating_sw_cal(DRAMC_CTX_T *p, ui2pi = rxdqs_cal->dqsien_pi_per_ui; freq_div = rxdqs_cal->dqsien_freq_div; - /* PI */ + tmp = rxdqs_trans->dqsien_dly_pi_leadlag[dqs_i] + offset; best_win->best_dqsien_dly_pi[dqs_i] = tmp % ui2pi; best_win->best_dqsien_dly_pi_p1[dqs_i] = best_win->best_dqsien_dly_pi[dqs_i]; - /* UI & MCK - P0 */ + tmp /= ui2pi; tmp = rxdqs_trans->dqsien_dly_ui_leadlag[dqs_i] + tmp; best_win->best_dqsien_dly_ui[dqs_i] = tmp % mck2ui; best_win->best_dqsien_dly_mck[dqs_i] = rxdqs_trans->dqsien_dly_mck_leadlag[dqs_i] + (tmp / mck2ui); - /* UI & MCK - P1 */ + best_win->best_dqsien_dly_ui_p1[dqs_i] = best_win->best_dqsien_dly_mck[dqs_i] * mck2ui + - best_win->best_dqsien_dly_ui[dqs_i] + freq_div; /* Total UI for Phase1 */ + best_win->best_dqsien_dly_ui[dqs_i] + freq_div; /*mcSHOW_DBG_MSG(("Total UI for P1: %d, mck2ui %d\n", best_win->best_dqsien_dly_mck_p1[dqs_i], mck2ui));*/ best_win->best_dqsien_dly_mck_p1[dqs_i] = @@ -5677,9 +5506,7 @@ static U8 rxdqs_gating_sw_cal(DRAMC_CTX_T *p, } } } else { - /* Clear lead lag info in case lead/lag flag toggled - * while gating counter & gating error still incorrect - */ + rxdqs_trans->dqs_high[dqs_i] = 0; rxdqs_trans->dqs_transition[dqs_i] = 0; rxdqs_trans->dqs_transitioned[dqs_i] = 0; @@ -5712,8 +5539,8 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_sw_cal(DRAMC_CTX_T *p, memset(&rxdqs_trans, 0, sizeof(struct rxdqs_gating_trans)); memset(&rxdqs_best_win, 0, sizeof(struct rxdqs_gating_best_win)); - pi_per_ui = DQS_GW_PI_PER_UI; /* 1 UI = ? PI. Sams as CBT, differ according to data rate?? */ - ui_per_mck = DQS_GW_UI_PER_MCK; /* 1 mck = ? UI. Decided by (Tmck/Tck) * (Tck/Twck) */ + pi_per_ui = DQS_GW_PI_PER_UI; + ui_per_mck = DQS_GW_UI_PER_MCK; if (vGet_Div_Mode(p) == DIV4_MODE) freq_div = 2; else @@ -5740,7 +5567,6 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_sw_cal(DRAMC_CTX_T *p, (DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2)), }; - /* Register backup */ DramcBackupRegisters(p, reg_backup_address, sizeof (reg_backup_address) / sizeof (U32)); @@ -5754,16 +5580,16 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_sw_cal(DRAMC_CTX_T *p, else if((is_lp5_family(p)) && (p->frequency == 2750)) dly_ui_start = 12; else - dly_ui_start = u1GetGatingStartPos(p, AUTOK_OFF);//7; //12;ly_ui_start + 32; + dly_ui_start = u1GetGatingStartPos(p, AUTOK_OFF); #else - dly_ui_start = u1GetGatingStartPos(p, AUTOK_OFF);//7; //12;ly_ui_start + 32; + dly_ui_start = u1GetGatingStartPos(p, AUTOK_OFF); #endif dly_ui_end = dly_ui_start+ 32; pass_byte_count = 0; #else { - dly_ui_start = 9; //12; Eddie change to 9 for Hynix Normal Mode + dly_ui_start = 9; if(p->freq_sel==LP4_DDR4266) { dly_ui_start = 16; @@ -5791,8 +5617,8 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_sw_cal(DRAMC_CTX_T *p, DramcEngine2End(p); - //check if there is no pass taps for each DQS - if (pass_byte_count == 0x3)//byte0 pass: pass_byte_count bit0=1, byte1 pass: pass_byte_count bit1=1 .LP4/LP5 pass=0x3(2 bytes). need modification for LP3 pass=0xf(4 bytes) + + if (pass_byte_count == 0x3) { u1GatingErrorFlag=0; vSetCalibrationResult(p, DRAM_CALIBRATION_GATING, DRAM_OK); @@ -5829,7 +5655,7 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_sw_cal(DRAMC_CTX_T *p, mcSHOW_DBG_MSG4(("[Gating] SW calibration Done\n")); - /* Set MCK & UI */ + rxdqs_gating_set_final_result(p, ui_per_mck, &rxdqs_best_win); DramcRestoreRegisters(p, reg_backup_address, @@ -5840,7 +5666,7 @@ static DRAM_STATUS_T dramc_rx_dqs_gating_sw_cal(DRAMC_CTX_T *p, return DRAM_OK; } -/* LPDDR5 Rx DQS Gating */ + DRAM_STATUS_T dramc_rx_dqs_gating_cal(DRAMC_CTX_T *p, u8 autok, U8 use_enhanced_rdqs) { @@ -5858,16 +5684,14 @@ DRAM_STATUS_T dramc_rx_dqs_gating_cal(DRAMC_CTX_T *p, } #endif - // default set FAIL + vSetCalibrationResult(p, DRAM_CALIBRATION_GATING, DRAM_FAIL); - /* Try HW auto calibration first. If failed, - * will try SW mode. - */ + #if GATING_AUTO_K_SUPPORT if (autok) { #if ENABLE_GATING_AUTOK_WA - if (rxdqs_gating_bypass(p)) /* Already done by SWK */ + if (rxdqs_gating_bypass(p)) return DRAM_OK; #endif @@ -5885,7 +5709,7 @@ DRAM_STATUS_T dramc_rx_dqs_gating_cal(DRAMC_CTX_T *p, return dramc_rx_dqs_gating_sw_cal(p, use_enhanced_rdqs); } -///TODO: wait for porting +++ + #if GATING_ADJUST_TXDLY_FOR_TRACKING void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) { @@ -5909,7 +5733,7 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) #ifdef XRTR2R_PERFORM_ENHANCE_DQSG_RX_DLY if (vGet_Div_Mode(p) == DIV8_MODE) { - // wei-jen: DQSgated_min should be 2 when freq >= 1333, 1 when freq < 1333 + if (p->frequency >= 1333) { reg_TX_dly_DQSgated_min = 2; @@ -5919,13 +5743,12 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) reg_TX_dly_DQSgated_min = 1; } } - else // for LPDDR4 1:4 mode + else { - //tg: DDR800/400: reg_TX_dly_DQSgated (min) =1 reg_TX_dly_DQSgated_min = 1; } #else - // wei-jen: DQSgated_min should be 3 when freq >= 1333, 2 when freq < 1333 + if (p->frequency >= 1333) { reg_TX_dly_DQSgated_min = 3; @@ -5936,12 +5759,12 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) } #endif - //Sylv_ia MP setting is switched to new mode, so RANKRXDVS can be set as 0 (review by HJ Huang) + #if 0 vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_SHU_B0_DQ7), u1RankRxDVS, SHU_B0_DQ7_R_DMRANKRXDVS_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_SHU_B1_DQ7), u1RankRxDVS, SHU_B1_DQ7_R_DMRANKRXDVS_B1); #endif - // === End of DVS setting ===== + s1ChangeDQSINCTL = reg_TX_dly_DQSgated_min - u1TXDLY_Cal_min; @@ -5963,7 +5786,7 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) else mck2ui_shift = 2; - if (s1ChangeDQSINCTL != 0) // need to change DQSINCTL and TXDLY of each byte + if (s1ChangeDQSINCTL != 0) { u1TXDLY_Cal_min += s1ChangeDQSINCTL; u1TXDLY_Cal_max += s1ChangeDQSINCTL; @@ -6005,7 +5828,7 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) ucbest_coarse_mck_backup[u1RankIdx][dqs_i] = u4ReadTXDLY[u1RankIdx][dqs_i]; ucbest_coarse_mck_P1_backup[u1RankIdx][dqs_i] = u4ReadTXDLY_P1[u1RankIdx][dqs_i]; } - else // LP3 or LP4 1:4 mode + else { u4ReadTXDLY[u1RankIdx][dqs_i] = ((ucbest_coarse_mck_backup[u1RankIdx][dqs_i] << 1) + ((ucbest_coarse_ui_backup[u1RankIdx][dqs_i] >> 2) & 0x1)); u4ReadTXDLY_P1[u1RankIdx][dqs_i] = ((ucbest_coarse_mck_P1_backup[u1RankIdx][dqs_i] << 1) + ((ucbest_coarse_ui_P1_backup[u1RankIdx][dqs_i] >> 2) & 0x1)); @@ -6039,8 +5862,7 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) for (u1RankIdx = 0; u1RankIdx < u1RankMax; u1RankIdx++) { vSetRank(p, u1RankIdx); - // 4T or 2T coarse tune - /* Set DQSIEN delay in MCK and UI */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_MCK_UI_DLY), P_Fld(ucbest_coarse_mck_backup[u1RankIdx][0], SHU_RK_B0_DQSIEN_MCK_UI_DLY_DQSIEN_MCK_P0_B0) | @@ -6063,14 +5885,14 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) #if RDSEL_TRACKING_EN if(p->frequency >= RDSEL_TRACKING_TH) { - //Byte 0 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_INI_UIPI), (ucbest_coarse_mck_backup[u1RankIdx][0] << 4) | (ucbest_coarse_ui_backup[u1RankIdx][0]), - SHU_R0_B0_INI_UIPI_CURR_INI_UI_B0);//UI - //Byte 1 + SHU_R0_B0_INI_UIPI_CURR_INI_UI_B0); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_INI_UIPI), (ucbest_coarse_mck_backup[u1RankIdx][1] << 4) | (ucbest_coarse_ui_backup[u1RankIdx][1]), - SHU_R0_B1_INI_UIPI_CURR_INI_UI_B1);//UI + SHU_R0_B1_INI_UIPI_CURR_INI_UI_B1); } #endif } @@ -6086,9 +5908,9 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) if (p->DBI_R_onoff[p->dram_fsp]) { u4ReadDQSINCTL++; - #if 0//cc mark for reg not found + #if 0 u4ReadRODT = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_ODTCTRL), SHU_ODTCTRL_RODT); - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_ODTCTRL), u4ReadRODT + 1, SHU_ODTCTRL_RODT); //update RODT value when READ_DBI is on + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_ODTCTRL), u4ReadRODT + 1, SHU_ODTCTRL_RODT); #endif } #endif @@ -6121,8 +5943,7 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) #endif #ifdef XRTR2R_PERFORM_ENHANCE_DQSG_RX_DLY - // Wei-Jen: RANKINCTL_RXDLY = RANKINCTL = RankINCTL_ROOT = u4ReadDQSINCTL-2, if XRTR2R_PERFORM_ENHANCE_DQSG_RX_DLY enable - // Wei-Jen: New algorithm : u4ReadDQSINCTL-2 >= 0 + if (u4ReadDQSINCTL >= 2) { u4RankINCTL_ROOT = u4ReadDQSINCTL - 2; @@ -6136,7 +5957,7 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) #endif } #else - //Modify for corner IC failed at HQA test XTLV + if (u4ReadDQSINCTL >= 3) { u4RankINCTL_ROOT = u4ReadDQSINCTL - 3; @@ -6148,23 +5969,21 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) } #endif - //DQSINCTL + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RK_DQSCTL), - u4ReadDQSINCTL, MISC_SHU_RK_DQSCTL_DQSINCTL); //Rank0 DQSINCTL + u4ReadDQSINCTL, MISC_SHU_RK_DQSCTL_DQSINCTL); vSetRank(p, RANK_1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RK_DQSCTL), - u4ReadDQSINCTL, MISC_SHU_RK_DQSCTL_DQSINCTL); //Rank1 DQSINCTL + u4ReadDQSINCTL, MISC_SHU_RK_DQSCTL_DQSINCTL); vSetRank(p, backup_rank); - //No need to update RODT. If we update RODT, also need to update SELPH_ODTEN0_TXDLY - //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_ODTCTRL), u4ReadDQSINCTL, SHU_ODTCTRL_RODT); //RODT = DQSINCTL vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RANKCTL), - u4ReadDQSINCTL, MISC_SHU_RANKCTL_RANKINCTL_PHY); //RANKINCTL_PHY = DQSINCTL + u4ReadDQSINCTL, MISC_SHU_RANKCTL_RANKINCTL_PHY); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RANKCTL), - u4RankINCTL_ROOT, MISC_SHU_RANKCTL_RANKINCTL); //RANKINCTL= DQSINCTL -3 + u4RankINCTL_ROOT, MISC_SHU_RANKCTL_RANKINCTL); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RANKCTL), - u4RankINCTL_ROOT, MISC_SHU_RANKCTL_RANKINCTL_ROOT1); //RANKINCTL_ROOT1= DQSINCTL -3 + u4RankINCTL_ROOT, MISC_SHU_RANKCTL_RANKINCTL_ROOT1); #ifdef XRTR2R_PERFORM_ENHANCE_DQSG_RX_DLY vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RANKCTL), @@ -6177,12 +5996,9 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) //mcDUMP_REG_MSG(("TX_dly_DQSgated check: min %d max %d, ChangeDQSINCTL=%d\n", u1TXDLY_Cal_min, u1TXDLY_Cal_max, s1ChangeDQSINCTL)); //mcDUMP_REG_MSG(("DQSINCTL=%d, RANKINCTL=%d, u4XRTR2R=%d\n", u4ReadDQSINCTL, u4RankINCTL_ROOT, u4XRTR2R)); #else - //XRTR2R=A-phy forbidden margin(6T) + reg_TX_dly_DQSgated (max) +Roundup(tDQSCKdiff/MCK+0.25MCK)+1(05T sel_ph margin)-1(forbidden margin overlap part) - //Roundup(tDQSCKdiff/MCK+1UI) =1~2 all LP3 and LP4 timing - //u4XRTR2R= 8 + u1TXDLY_Cal_max; // 6+ u1TXDLY_Cal_max +2 - //Modify for corner IC failed at HQA test XTLV @ 3200MHz - u4XRTR2R = 8 + u1TXDLY_Cal_max + 1; // 6+ u1TXDLY_Cal_max +2 + + u4XRTR2R = 8 + u1TXDLY_Cal_max + 1; if (u4XRTR2R > 12) { u4XRTR2R = 12; @@ -6196,12 +6012,8 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) //mcDUMP_REG_MSG(("DQSINCTL=%d, RANKINCTL=%d, u4XRTR2R=%d\n", u4ReadDQSINCTL, u4RankINCTL_ROOT, u4XRTR2R)); #endif -#if 0//ENABLE_RODT_TRACKING - //Because Ki_bo+,WE2,Bi_anco,Vin_son...or behind project support WDQS, they need to apply the correct new setting - //The following 2 items are indepentent - //1. if TX_WDQS on(by vendor_id) or p->odt_onoff = 1, ROEN/RODTE/RODTE2 = 1 - //2. if ENABLE_RODT_TRACKING on, apply new setting and RODTENSTB_TRACK_EN = ROEN - // LP4 support only +#if 0 + U8 u1ReadROEN; u1ReadROEN = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_ODTCTRL), SHU_ODTCTRL_ROEN); vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHU_RODTENSTB), P_Fld(0xff, SHU_RODTENSTB_RODTENSTB_EXT) | \ @@ -6209,7 +6021,7 @@ void DramcRxdqsGatingPostProcess(DRAMC_CTX_T *p) #endif #ifdef XRTR2W_PERFORM_ENHANCE_RODTEN - // LP4 support only + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RODTENSTB), P_Fld(0x0fff, MISC_SHU_RODTENSTB_RODTENSTB_EXT) | P_Fld(1, MISC_SHU_RODTENSTB_RODTEN_P1_ENABLE) | @@ -6229,7 +6041,7 @@ void DramcRxdqsGatingPreProcess(DRAMC_CTX_T *p) u1TXDLY_Cal_max = 0; } #endif -///TODO: wait for porting --- + #endif @@ -6253,26 +6065,25 @@ static void RDDQCPinmuxWorkaround(DRAMC_CTX_T *p) const U8 uiLPDDR4_RDDQC_Mapping_POP[PINMUX_MAX][CHANNEL_NUM][16] = { { - // for EMCP - //CH-A + { 0, 1, 2, 3, 7, 4, 6, 5, 9, 8, 12, 14, 15, 10, 13, 11 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 1, 7, 4, 3, 2, 6, 5, 9, 8, 12, 14, 15, 10, 11, 13 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 2, 3, 7, 4, 6, 5, 9, 8, 12, 14, 15, 10, 13, 11 }, - //CH-D + { 0, 1, 7, 4, 3, 2, 6, 5, 9, 8, 12, 14, 15, 10, 11, 13 @@ -6280,26 +6091,25 @@ static void RDDQCPinmuxWorkaround(DRAMC_CTX_T *p) #endif }, { - // for DSC_2CH, HFID RESERVED - //CH-A + { 0, 1, 4, 3, 2, 5, 7, 6, 9, 8, 10, 11, 15, 13, 12, 14 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 1, 2, 5, 3, 4, 7, 6, 8, 9, 10, 11, 15, 14, 13, 12 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, - //CH-D + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 @@ -6307,26 +6117,25 @@ static void RDDQCPinmuxWorkaround(DRAMC_CTX_T *p) #endif }, { - // for MCP - //CH-A + { 0, 1, 6, 2, 4, 7, 3, 5, 8, 9, 10, 12, 13, 11, 15, 14 }, #if (CHANNEL_NUM>1) - //CH-B + { 0, 1, 7, 4, 2, 5, 6, 3, 9, 8, 10, 12, 11, 14, 13, 15 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 1, 0, 3, 2, 4, 7, 6, 5, 8, 9, 10, 12, 15, 14, 11, 13 }, - //CH-D + { 0, 1, 7, 4, 2, 5, 6, 3, 9, 8, 10, 12, 11, 14, 13, 15 @@ -6334,26 +6143,25 @@ static void RDDQCPinmuxWorkaround(DRAMC_CTX_T *p) #endif }, { - // for DSC_180 - //CH-A + { 8, 9, 14, 15, 12, 13, 11, 10, 1, 0, 3, 2, 7, 6, 4, 5 }, #if (CHANNEL_NUM>1) - //CH-B + { 9, 8, 13, 12, 15, 10, 11, 14, 0, 1, 3, 2, 4, 6, 5, 7 }, #endif #if (CHANNEL_NUM>2) - //CH-C + { 0, 1, 6, 7, 4, 5, 3, 2, 9, 8, 11, 10, 15, 14, 12, 13 }, - //CH-D + { 1, 0, 5, 4, 7, 2, 3, 6, 8, 9, 11, 10, 12, 14, 13, 15 @@ -6367,7 +6175,7 @@ static void RDDQCPinmuxWorkaround(DRAMC_CTX_T *p) } - //Set RDDQC pinmux + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_MRR_BIT_MUX1), P_Fld(uiLPDDR_RDDQC_Mapping[0], MRR_BIT_MUX1_MRR_BIT0_SEL) | P_Fld(uiLPDDR_RDDQC_Mapping[1], MRR_BIT_MUX1_MRR_BIT1_SEL) | P_Fld(uiLPDDR_RDDQC_Mapping[2], MRR_BIT_MUX1_MRR_BIT2_SEL) | P_Fld(uiLPDDR_RDDQC_Mapping[3], MRR_BIT_MUX1_MRR_BIT3_SEL)); vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_MRR_BIT_MUX2), P_Fld(uiLPDDR_RDDQC_Mapping[4], MRR_BIT_MUX2_MRR_BIT4_SEL) | P_Fld(uiLPDDR_RDDQC_Mapping[5], MRR_BIT_MUX2_MRR_BIT5_SEL) | @@ -6403,27 +6211,22 @@ static U32 DramcRxWinRDDQCInit(DRAMC_CTX_T *p) RDDQC_Pattern_A = psra->mr_dq_a_golden; RDDQC_Pattern_B = psra->mr_dq_b_golden; - /* - * TODO - * - * sv also passes mr20_6 and mr20_7 to sa. - * currently, sa does NOT use these two random arguments. - */ + } -#endif /* FOR_DV_SIMULATION_USED == 1 */ +#endif + - // Disable Read DBI vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ7), 0, SHU_B0_DQ7_R_DMDQMDBI_SHU_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ7), 0, SHU_B1_DQ7_R_DMDQMDBI_SHU_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1GetRank(p), SWCMD_CTRL0_MRSRK); #if RDDQC_PINMUX_WORKAROUND - // Translate pin order by MRR bit sel + RDDQCPinmuxWorkaround(p); #endif - // Set golden values into dram MR + { DramcModeRegWriteByRank(p, p->rank, 15, RDDQC_Bit_Ctrl_Lower); DramcModeRegWriteByRank(p, p->rank, 20, RDDQC_Bit_Ctrl_Upper); @@ -6431,14 +6234,14 @@ static U32 DramcRxWinRDDQCInit(DRAMC_CTX_T *p) DramcModeRegWriteByRank(p, p->rank, 40, RDDQC_Pattern_B); } - //Set golden values into RG, watch out the MR_index of RGs are reference LP4 + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_RDDQCGOLDEN), P_Fld(RDDQC_Bit_Ctrl_Lower, RDDQCGOLDEN_LP5_MR30_BIT_CTRL_LOWER) | P_Fld(RDDQC_Bit_Ctrl_Upper, RDDQCGOLDEN_LP5_MR31_BIT_CTRL_UPPER) | P_Fld(RDDQC_Pattern_A, RDDQCGOLDEN_LP5_MR32_PATTERN_A) | P_Fld(RDDQC_Pattern_B, RDDQCGOLDEN_LP5_MR33_PATTERN_B)); - // Open gated clock, by KaiHsin (DCM) + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ8), P_Fld(1, SHU_B0_DQ8_R_DMRXDLY_CG_IG_B0)); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ8), @@ -6449,7 +6252,7 @@ static U32 DramcRxWinRDDQCInit(DRAMC_CTX_T *p) #if PRINT_CALIBRATION_SUMMARY_FASTK_CHECK static U32 DramcRxWinRDDQCEnd(DRAMC_CTX_T *p) { - // Recover MPC Rank + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), 0, SWCMD_CTRL0_MRSRK); return 0; @@ -6499,51 +6302,44 @@ static void SetRxDqDqsDelay(DRAMC_CTX_T *p, S16 iDelay) } else { - // Adjust DQM output delay. + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_RXDLY4), iDelay, SHU_R0_B0_RXDLY4_RX_ARDQM0_R_DLY_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_RXDLY4), iDelay, SHU_R0_B1_RXDLY4_RX_ARDQM0_R_DLY_B1); //DramPhyReset(p); - // Adjust DQ output delay. + for (ii = 0; ii < 4; ii++) SetRxDqDelay(p, ii, iDelay); } } -/* Issue "RD DQ Calibration" - * 1. SWCMD_CTRL1_RDDQC_LP_ENB = 1 to stop RDDQC burst - * 2. RDDQCEN = 1 for RDDQC - * 3. Wait rddqc_response = 1 - * 4. Read compare result - * 5. RDDQCEN = 0 - */ static U32 DramcRxWinRDDQCRun(DRAMC_CTX_T *p) { U32 u4Result = 0, u4TmpResult; DRAM_STATUS_T u4Response = DRAM_FAIL; - //Issue RD DQ calibration + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL1), 1, SWCMD_CTRL1_RDDQC_LP_ENB); - // Trigger and wait + REG_TRANSFER_T TriggerReg = {DRAMC_REG_SWCMD_EN, SWCMD_EN_RDDQCEN}; REG_TRANSFER_T RepondsReg = {DRAMC_REG_SPCMDRESP, SPCMDRESP_RDDQC_RESPONSE}; u4Response = DramcTriggerAndWait(p, TriggerReg, RepondsReg); - // Read RDDQC compare result + u4TmpResult = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_RDQC_CMP)); - u4Result = (0xFFFF) & ((u4TmpResult) | (u4TmpResult >> 16)); // (BL0~7) | (BL8~15) + u4Result = (0xFFFF) & ((u4TmpResult) | (u4TmpResult >> 16)); #if (FEATURE_RDDQC_K_DMI == TRUE) - // Read DQM compare result + u4TmpResult = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RDQC_DQM_CMP), RDQC_DQM_CMP_RDDQC_DQM_CMP0_ERR); u4TmpResult |= u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RDQC_DQM_CMP), RDQC_DQM_CMP_RDDQC_DQM_CMP1_ERR); u4Result |= (u4TmpResult << 16); #endif - //R_DMRDDQCEN -> 0 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_RDDQCEN); return u4Result; @@ -6587,7 +6383,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, U8 backup_rank, rank_i, u1KnownVref[2]={0xff, 0xff}; BOOL isLP4_DSC = (p->DRAMPinmux == PINMUX_DSC)?1:0; - // error handling + if (!p) { mcSHOW_ERR_MSG(("context NULL\n")); @@ -6609,7 +6405,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, #endif }; - //Back up dramC register + DramcBackupRegisters(p, u4RegBackupAddress, ARRAY_SIZE(u4RegBackupAddress)); #if (FEATURE_RDDQC_K_DMI == TRUE) @@ -6672,7 +6468,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, #endif } - //RX_ARDQS_DLY_LAT_EN=1: RX delay will update when GATE_EN=0, and can prevent glitch in ACD. + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ10), 1, SHU_B0_DQ10_RG_RX_ARDQS_DLY_LAT_EN_B0); if (!isLP4_DSC) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ10), 1, SHU_B1_DQ10_RG_RX_ARDQS_DLY_LAT_EN_B1); @@ -6680,13 +6476,13 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD10), 1, SHU_CA_CMD10_RG_RX_ARCLK_DLY_LAT_EN_CA); - //When doing RxWindowPerbitCal, should make sure that auto refresh is disable + vAutoRefreshSwitch(p, DISABLE); //CKEFixOnOff(p, p->rank, CKE_FIXON, TO_ONE_CHANNEL); backup_rank = u1GetRank(p); - //defult set result fail. When window found, update the result as oK + if (u1UseTestEngine == PATTERN_TEST_ENGINE) { if (u1RXEyeScanEnable == DISABLE) @@ -6694,7 +6490,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, vSetCalibrationResult(p, DRAM_CALIBRATION_RX_PERBIT, DRAM_FAIL); } - // Something wrong with TA2 pattern -- SI, which causes RX autoK fail. + if (isAutoK == TRUE) { DramcEngine2Init(p, p->test2_1, p->test2_2, TEST_XTALK_PATTERN, 0, TE_NO_UI_SHIFT); @@ -6702,7 +6498,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, else { #if ENABLE_K_WITH_WORST_SI_UI_SHIFT - DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT);//UI_SHIFT + LEN1 + DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT); #else DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern, 0, TE_NO_UI_SHIFT); #endif @@ -6717,7 +6513,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, DramcRxWinRDDQCInit(p); } - // Intialize, diable RX Vref + u2VrefBegin = 0; u2VrefEnd = 0; u2VrefStep = 1; @@ -6745,7 +6541,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, //mcDUMP_REG_MSG(("\n[dumpRG] %s\n",u1UseTestEngine==PATTERN_RDDQC?"RDDQC":"DramcRxWindowPerbitCal")); #if VENDER_JV_LOG -#if 0 //BU don't want customer knows our RX's ability +#if 0 if (u1UseTestEngine == 1) vPrintCalibrationBasicInfo_ForJV(p); #endif @@ -6763,8 +6559,8 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, { u2VrefBegin = 0; u2VrefEnd = 0; - u1KnownVref[0] = gFinalRXVrefDQForSpeedUp[p->channel][p->rank][p->odt_onoff][0];// byte 0 - u1KnownVref[1] = gFinalRXVrefDQForSpeedUp[p->channel][p->rank][p->odt_onoff][1];// byte 1 + u1KnownVref[0] = gFinalRXVrefDQForSpeedUp[p->channel][p->rank][p->odt_onoff][0]; + u1KnownVref[1] = gFinalRXVrefDQForSpeedUp[p->channel][p->rank][p->odt_onoff][1]; if (u1UseTestEngine == PATTERN_TEST_ENGINE && ((u1KnownVref[0] == 0) || (u1KnownVref[1] == 0))) { @@ -6774,12 +6570,12 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, #endif } } - else if (u1AssignedVref != NULL) // need to specify RX Vref and don't scan RX Vref. + else if (u1AssignedVref != NULL) { u2VrefBegin = 0; u2VrefEnd = 0; - u1KnownVref[0] = u1AssignedVref[0]; // byte 0 - u1KnownVref[1] = u1AssignedVref[1]; // byte 1 + u1KnownVref[0] = u1AssignedVref[0]; + u1KnownVref[1] = u1AssignedVref[1]; } else { @@ -6802,7 +6598,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, } else { - u2VrefBegin = 0;//Lewis@20160817: Enlarge RX Vref range for eye scan + u2VrefBegin = 0; u2VrefEnd = EYESCAN_RX_VREF_RANGE_END-1; //mcSHOW_DBG_MSG(("\nSet Eyescan Vref Range= %d -> %d\n",u2VrefBegin,u2VrefEnd)); } @@ -6824,26 +6620,26 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, else vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD5), 1, CA_CMD5_RG_RX_ARCMD_VREF_EN); } - else // Disable RX Vref + else { u2VrefBegin = 0; u2VrefEnd = 0; u2VrefStep = 1; } - //if RDDQD, roughly calibration + if (u1UseTestEngine == PATTERN_RDDQC) u16DelayStep <<= 1; #if SUPPORT_SAVE_TIME_FOR_CALIBRATION if (p->femmc_Ready == 1 && ((p->Bypass_RDDQC && u1UseTestEngine == PATTERN_RDDQC) || (p->Bypass_RXWINDOW && u1UseTestEngine == PATTERN_TEST_ENGINE))) { - // load RX DQS and DQM delay from eMMC + for (u1ByteIdx = 0; u1ByteIdx < DQS_BYTE_NUMBER; u1ByteIdx++) { if (u1VrefScanEnable) { - // load RX Vref from eMMC + #if ( SUPPORT_SAVE_TIME_FOR_CALIBRATION && BYPASS_VREF_CAL) u2FinalVref[u1ByteIdx] = p->pSavetimeData->u1RxWinPerbitVref_Save[p->channel][p->rank][u1ByteIdx]; #endif @@ -6853,7 +6649,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, iDQMDlyPerbyte[u1ByteIdx] = p->pSavetimeData->u1RxWinPerbit_DQM[p->channel][p->rank][u1ByteIdx]; } - // load RX DQ delay from eMMC + for (u1BitIdx = 0; u1BitIdx < 16; u1BitIdx++) { FinalWinPerBit[u1BitIdx].best_dqdly = p->pSavetimeData->u1RxWinPerbit_DQ[p->channel][p->rank][u1BitIdx]; @@ -6890,7 +6686,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, if (u1VrefScanEnable == TRUE) { - // When only calibrate RX Vref for Rank 0, apply the same value for Rank 1. + for (rank_i = p->rank; rank_i < p->support_rank_num; rank_i++) { vSetRank(p, rank_i); @@ -6911,7 +6707,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, mcSHOW_DBG_MSG(("\n")); #if DUMP_TA2_WINDOW_SIZE_RX_TX - //RX + if (u1UseTestEngine == PATTERN_TEST_ENGINE) { U32 u4B0Tatal =0; @@ -6933,7 +6729,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, } #endif - // set dqs delay, (dqm delay) + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_RXDLY5), P_Fld((U32)iDQSDlyPerbyte[0], SHU_R0_B0_RXDLY5_RX_ARDQS0_R_DLY_B0)); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_RXDLY4), @@ -6943,7 +6739,7 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_RXDLY4), P_Fld((U32)iDQMDlyPerbyte[1], SHU_R0_B1_RXDLY4_RX_ARDQM0_R_DLY_B1)); - // set dq delay + for (u1BitIdx = 0; u1BitIdx < DQS_BIT_NUMBER; u1BitIdx += 2) { vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_RXDLY0 + u1BitIdx * 2), @@ -7012,65 +6808,6 @@ DRAM_STATUS_T DramcRxWindowPerbitCal(DRAMC_CTX_T *p, return DRAM_OK; - // Log example ==> Neec to update - /* ------------------------------------------------------- -Start calculate dq time and dqs time / -Find max DQS delay per byte / Adjust DQ delay to align DQS... ------------------------------------------------------- -bit# 0 : dq time=11 dqs time= 8 -bit# 1 : dq time=11 dqs time= 8 -bit# 2 : dq time=11 dqs time= 6 -bit# 3 : dq time=10 dqs time= 8 -bit# 4 : dq time=11 dqs time= 8 -bit# 5 : dq time=10 dqs time= 8 -bit# 6 : dq time=11 dqs time= 8 -bit# 7 : dq time= 9 dqs time= 6 -----seperate line---- -bit# 8 : dq time=12 dqs time= 7 -bit# 9 : dq time=10 dqs time= 8 -bit#10 : dq time=11 dqs time= 8 -bit#11 : dq time=10 dqs time= 8 -bit#12 : dq time=11 dqs time= 8 -bit#13 : dq time=11 dqs time= 8 -bit#14 : dq time=11 dqs time= 8 -bit#15 : dq time=12 dqs time= 8 -----seperate line---- -bit#16 : dq time=11 dqs time= 7 -bit#17 : dq time=10 dqs time= 8 -bit#18 : dq time=11 dqs time= 7 -bit#19 : dq time=11 dqs time= 6 -bit#20 : dq time=10 dqs time= 9 -bit#21 : dq time=11 dqs time=10 -bit#22 : dq time=11 dqs time=10 -bit#23 : dq time= 9 dqs time= 9 -----seperate line---- -bit#24 : dq time=12 dqs time= 6 -bit#25 : dq time=13 dqs time= 6 -bit#26 : dq time=13 dqs time= 7 -bit#27 : dq time=11 dqs time= 7 -bit#28 : dq time=12 dqs time= 8 -bit#29 : dq time=10 dqs time= 8 -bit#30 : dq time=13 dqs time= 7 -bit#31 : dq time=11 dqs time= 8 -----seperate line---- -================================================== - dramc_rxdqs_perbit_swcal_v2 - channel=2(2:cha, 3:chb) apply = 1 -================================================== -DQS Delay : - DQS0 = 0 DQS1 = 0 DQS2 = 0 DQS3 = 0 -DQ Delay : -DQ 0 = 1 DQ 1 = 1 DQ 2 = 2 DQ 3 = 1 -DQ 4 = 1 DQ 5 = 1 DQ 6 = 1 DQ 7 = 1 -DQ 8 = 2 DQ 9 = 1 DQ10 = 1 DQ11 = 1 -DQ12 = 1 DQ13 = 1 DQ14 = 1 DQ15 = 2 -DQ16 = 2 DQ17 = 1 DQ18 = 2 DQ19 = 2 -DQ20 = 0 DQ21 = 0 DQ22 = 0 DQ23 = 0 -DQ24 = 3 DQ25 = 3 DQ26 = 3 DQ27 = 2 -DQ28 = 2 DQ29 = 1 DQ30 = 3 DQ31 = 1 -_______________________________________________________________ - */ } #if SIMULATION_RX_DVS @@ -7085,7 +6822,7 @@ static U8 DramcRxDVSCal(DRAMC_CTX_T *p, U8 u1byte) u1rising_lag = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_FT_STATUS0), MISC_FT_STATUS0_AD_RX_ARDQ_DVS_R_LAG_B0); u1falling_lag = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_FT_STATUS1), MISC_FT_STATUS1_AD_RX_ARDQ_DVS_F_LAG_B0); } - else //byte1 + else { u1rising_lead = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_FT_STATUS0), MISC_FT_STATUS0_AD_RX_ARDQ_DVS_R_LAG_B1); u1falling_lead = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_FT_STATUS1), MISC_FT_STATUS1_AD_RX_ARDQ_DVS_F_LEAD_B1); @@ -7120,7 +6857,7 @@ DRAM_STATUS_T DramcRxDVSWindowCal(DRAMC_CTX_T *p) (DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B1_RXDLY4)), }; - // error handling + if (!p) { mcSHOW_ERR_MSG(("context NULL\n")); @@ -7129,16 +6866,16 @@ DRAM_STATUS_T DramcRxDVSWindowCal(DRAMC_CTX_T *p) mcSHOW_DBG_MSG(("[RX DVS calibration]\n")); - //When doing RxWindowPerbitCal, should make sure that auto refresh is disable + vAutoRefreshSwitch(p, DISABLE); //CKEFixOnOff(p, p->rank, CKE_FIXON, TO_ONE_CHANNEL); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ11), 1, SHU_B0_DQ11_RG_RX_ARDQ_DVS_EN_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ11), 1, SHU_B1_DQ11_RG_RX_ARDQ_DVS_EN_B1); - //defult set result fail. When window found, update the result as oK + #if ENABLE_K_WITH_WORST_SI_UI_SHIFT - DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT);//PIC Need to check if need to use UI_SHIFT;//UI_SHIFT + LEN1 + DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT); #else DramcEngine2Init(p, p->test2_1, p->test2_2, TEST_XTALK_PATTERN, 0, TE_NO_UI_SHIFT); #endif @@ -7146,14 +6883,14 @@ DRAM_STATUS_T DramcRxDVSWindowCal(DRAMC_CTX_T *p) { u16DelayStep = 4; } - // Just for DV SIM test + S16DelayBegin = -80; u16DelayEnd = 100; mcSHOW_DBG_MSG2(("\nRX Delay %d -> %d, step: %d\n", S16DelayBegin, u16DelayEnd, u16DelayStep)); { - // Adjust DQM output delay to 0 + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_RXDLY4), P_Fld(0, SHU_R0_B0_RXDLY4_RX_ARDQM0_R_DLY_B0) | P_Fld(0, SHU_R0_B0_RXDLY4_RX_ARDQM0_F_DLY_B0)); @@ -7161,12 +6898,11 @@ DRAM_STATUS_T DramcRxDVSWindowCal(DRAMC_CTX_T *p) P_Fld(0, SHU_R0_B1_RXDLY4_RX_ARDQM0_R_DLY_B1) | P_Fld(0, SHU_R0_B1_RXDLY4_RX_ARDQM0_F_DLY_B1)); - // Adjust DQ output delay to 0 - //every 2bit dq have the same delay register address + for (ii = 0; ii < 4; ii++) SetRxDqDelay(p, ii, 0); { - // non-autok flow + for (iDelay = S16DelayBegin; iDelay <= u16DelayEnd; iDelay += u16DelayStep) { SetRxDqDqsDelay(p, iDelay); @@ -7190,7 +6926,7 @@ DRAM_STATUS_T DramcRxDVSWindowCal(DRAMC_CTX_T *p) { u1DVS_pass_window[u1ByteIdx] = iDelay - u1DVS_first_pass[u1ByteIdx] - u16DelayStep; - if (u1DVS_pass_window[u1ByteIdx] < 7) //if window size bigger than 7, consider as real pass window. + if (u1DVS_pass_window[u1ByteIdx] < 7) { u1DVS_pass_window[u1ByteIdx] = 0; u1DVS_first_flag[u1ByteIdx] = 0; @@ -7252,7 +6988,7 @@ void DramcDramcRxDVSCalPostProcess(DRAMC_CTX_T *p) u1DVS_dly_final[u1ByteIdx] = u1DVS_increase_final + (u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ11), SHU_B0_DQ11_RG_RX_ARDQ_DVS_DLY_B0)); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ11), u1DVS_dly_final[u1ByteIdx], SHU_B0_DQ11_RG_RX_ARDQ_DVS_DLY_B0); } - else //byte1 + else { u1DVS_dly_final[u1ByteIdx] = u1DVS_increase_final + (u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ11), SHU_B1_DQ11_RG_RX_ARDQ_DVS_DLY_B1)); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ11), u1DVS_dly_final[u1ByteIdx], SHU_B1_DQ11_RG_RX_ARDQ_DVS_DLY_B1); @@ -7266,7 +7002,7 @@ void DramcDramcRxDVSCalPostProcess(DRAMC_CTX_T *p) DramcRxWindowPerbitCal(p, PATTERN_TEST_ENGINE, DVS_CAL_KEEP_VREF, AUTOK_OFF, NORMAL_K); } - if ((DramcRxDVSCal(p, 0) == 1) || (DramcRxDVSCal(p, 1) == 1)) //Prevent set wrong DV dly + if ((DramcRxDVSCal(p, 0) == 1) || (DramcRxDVSCal(p, 1) == 1)) { mcSHOW_ERR_MSG(("Final DVS delay is out of RX window\n")); for (u1ByteIdx = 0; u1ByteIdx < DQS_BYTE_NUMBER; u1ByteIdx++) @@ -7278,7 +7014,7 @@ void DramcDramcRxDVSCalPostProcess(DRAMC_CTX_T *p) { vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ11), u1DVS_dly_final[u1ByteIdx], SHU_B0_DQ11_RG_RX_ARDQ_DVS_DLY_B0); } - else //byte1 + else { vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ11), u1DVS_dly_final[u1ByteIdx], SHU_B1_DQ11_RG_RX_ARDQ_DVS_DLY_B1); } @@ -7306,8 +7042,7 @@ static void dle_factor_handler(DRAMC_CTX_T *p, U8 curr_val) U8 u1DLECG_OptionEXT2 = 0; U8 u1DLECG_OptionEXT3 = 0; - // If (RX_PIPE_BYPASS_ENABLE == 1) bypass RX PIPE, so RG_DATLAT_DSEL = RG_DATLAT - // else RG_DATLAT_DSEL = RG_DATLAT - 1 + if (u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_MISC_RX_PIPE_CTRL), SHU_MISC_RX_PIPE_CTRL_RX_PIPE_BYPASS_EN)) { u1DATLAT_DSEL = curr_val; @@ -7327,10 +7062,7 @@ static void dle_factor_handler(DRAMC_CTX_T *p, U8 curr_val) P_Fld(u1DATLAT_DSEL, MISC_SHU_RDAT_DATLAT_DSEL) | P_Fld(u1DATLAT_DSEL, MISC_SHU_RDAT_DATLAT_DSEL_PHY)); - // Had been adjusted for 868 already. - //(>=8 & <14) set EXT1 =1, EXT2=0, EXT3=0 - //(>= 14 & <19) set EXT1=1, EXT2=1, EXT3=0 - //(>=19) set EXT1=1, EXT2=1, EXT3=1 + u1DLECG_OptionEXT1 = (curr_val >= 8)? (1): (0); u1DLECG_OptionEXT2 = (curr_val >= 14)? (1): (0); u1DLECG_OptionEXT3 = (curr_val >= 19)? (1): (0); @@ -7356,7 +7088,7 @@ DRAM_STATUS_T DramcRxdatlatCal(DRAMC_CTX_T *p) U8 ucfirst, ucbegin, ucsum, ucbest_step; //ucpipe_num = 0; U16 u2DatlatBegin; - // error handling + if (!p) { mcSHOW_ERR_MSG(("context NULL\n")); @@ -7371,29 +7103,23 @@ DRAM_STATUS_T DramcRxdatlatCal(DRAMC_CTX_T *p) #endif mcSHOW_DBG_MSG(("[RxdatlatCal]\n")); - // pre-save - // 0x07c[6:4] DATLAT bit2-bit0 + u4prv_register_080 = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RDAT)); - //default set FAIL + vSetCalibrationResult(p, DRAM_CALIBRATION_DATLAT, DRAM_FAIL); - // init best_step to default + ucbest_step = (U8) u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_RDAT), MISC_SHU_RDAT_DATLAT); mcSHOW_DBG_MSG2(("DATLAT Default: 0x%x\n", ucbest_step)); //mcDUMP_REG_MSG(("DATLAT Default: 0x%x\n", ucbest_step)); - // 1.set DATLAT 0-15 (0-21 for MT6595) - // 2.enable engine1 or engine2 - // 3.check result ,3~4 taps pass - // 4.set DATLAT 2nd value for optimal - // Initialize ucfirst = 0xff; ucbegin = 0; ucsum = 0; - DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT);//UI_SHIFT + LEN1 + DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT); u2DatlatBegin = 0; #if (SUPPORT_SAVE_TIME_FOR_CALIBRATION && BYPASS_DATLAT) @@ -7494,33 +7220,22 @@ DRAM_STATUS_T DramcDualRankRxdatlatCal(DRAMC_CTX_T *p) return DRAM_OK; } -#endif // SIMULATION_DATLAT +#endif #if SIMULATION_TX_PERBIT -//============================================================= -///// DramC TX perbi calibration ----------Begin-------------- -//============================================================= -//------------------------------------------------------------------------- -/** DramcTxWindowPerbitCal (v2) - * TX DQS per bit SW calibration. - * @param p Pointer of context created by DramcCtxCreate. - * @param apply (U8): 0 don't apply the register we set 1 apply the register we set ,default don't apply. - * @retval status (DRAM_STATUS_T): DRAM_OK or DRAM_FAIL - */ -//------------------------------------------------------------------------- #if (SW_CHANGE_FOR_SIMULATION || FOR_DV_SIMULATION_USED) #define TX_VREF_RANGE_BEGIN 0 -#define TX_VREF_RANGE_END 2 // binary 110010 +#define TX_VREF_RANGE_END 2 #define TX_VREF_RANGE_STEP 2 #else #define TX_VREF_RANGE_BEGIN 16 -#define TX_VREF_RANGE_END 50 // binary 110010 +#define TX_VREF_RANGE_END 50 #define TX_VREF_RANGE_STEP 2 #endif -#define TX_DQ_UI_TO_PI_TAP 64 // 1 PI = tCK/64, total 128 PI, 1UI = 32 PI -#define TX_PHASE_DQ_UI_TO_PI_TAP 32 // 1 PI = tCK/64, total 128 PI, 1UI = 32 PI for DDR800 semi open loop mode +#define TX_DQ_UI_TO_PI_TAP 64 +#define TX_PHASE_DQ_UI_TO_PI_TAP 32 #define LP4_TX_VREF_DATA_NUM 50 #define LP4_TX_VREF_PASS_CONDITION 0 #define TX_PASS_WIN_CRITERIA 7 @@ -7587,12 +7302,12 @@ void TxWinTransferDelayToUIPI(DRAMC_CTX_T *p, U16 uiDelay, U8 u1AdjustPIToCenter *pu1PI =u1PI; } - if (u1IsLP4Div4DDR800(p) /*DDR800 close loop mode*/ || u1IsPhaseMode(p)) + if (u1IsLP4Div4DDR800(p) || u1IsPhaseMode(p)) u164PIto1UI = 0; else u164PIto1UI = 1; - u2TmpValue = (uiDelay /u1PiTap)<<u164PIto1UI; // 1:8 mode for 2UI carry, DDR800 1:4 mode for 1UI carry + u2TmpValue = (uiDelay /u1PiTap)<<u164PIto1UI; if (u1AdjustPIToCenter && (pu1PI != NULL) && (eDdr800Mode == CLOSE_LOOP_MODE)) { @@ -7617,17 +7332,17 @@ void TxWinTransferDelayToUIPI(DRAMC_CTX_T *p, U16 uiDelay, U8 u1AdjustPIToCenter *pu1UISmall_DQ = u2TmpValue - ((u2TmpValue >> u1Small_ui_to_large) << u1Small_ui_to_large); *pu1UILarge_DQ = (u2TmpValue >> u1Small_ui_to_large); #endif - // calculate DQ OE according to DQ UI + { u2TmpValue -= u1TxDQOEShift; } - if(((u1MR03Value[p->dram_fsp]&0x80)>>7)==1) //if WDBI is on, OE_DLY don't need to shift 1 MCK with DLY + if(((u1MR03Value[p->dram_fsp]&0x80)>>7)==1) { if (vGet_Div_Mode(p) == DIV4_MODE) - u2DQOE_shift = 4; //OE_shift = OE_shift - 3(original OE position) + 4 (MCK) + u2DQOE_shift = 4; else - u2DQOE_shift = 8; //OE_shift = OE_shift - 3(original OE position) + 8 (MCK) + u2DQOE_shift = 8; u2TmpValue += u2DQOE_shift; } @@ -7682,14 +7397,14 @@ static void TxPrintWidnowInfo(DRAMC_CTX_T *p, PASS_WIN_DATA_T WinPerBitData[]) static void TXPerbitCalibrationInit(DRAMC_CTX_T *p, U8 calType) { - //Set TX delay chain to 0 + if (calType != TX_DQ_DQS_MOVE_DQM_ONLY) { #if 1 #if PINMUX_AUTO_TEST_PER_BIT_TX if(gTX_check_per_bit_flag == 1) { - //not reset delay cell + } else #endif @@ -7722,25 +7437,13 @@ static void TXPerbitCalibrationInit(DRAMC_CTX_T *p, U8 calType) } - //Use HW TX tracking value - //R_DMARPIDQ_SW :drphy_conf (0x170[7])(default set 1) - // 0: DQS2DQ PI setting controlled by HW - //R_DMARUIDQ_SW : Dramc_conf(0x156[15])(default set 1) - // 0: DQS2DQ UI setting controlled by HW - ///TODO: need backup original setting? - //vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_MISC_CTRL1), 1, MISC_CTRL1_R_DMARPIDQ_SW); - //vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_DQSOSCR), 1, DQSOSCR_ARUIDQ_SW); } #define TX_TDQS2DQ_PRE_CAL 0 #if TX_TDQS2DQ_PRE_CAL -// (1) DDR800 1:4 mode -// (2) DDR1200/1600 1:4 mode -// (3) 1:8 mode -// The 3 condition have different MCK2UI/UI2PI. Therefore, TX DQS2DQ should be record separately. -// Here, we record (2) and (3). DDR800 1:4 skip recording DQS2DQ. -U16 u2DQS2DQ_Pre_Cal[CHANNEL_NUM][RANK_MAX][2/*DIV_Mode*/] = {0}; + +U16 u2DQS2DQ_Pre_Cal[CHANNEL_NUM][RANK_MAX][2] = {0}; #endif static void TXScanRange_PI(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T calType, U16 *pu2Begin, U16 *pu2End) @@ -7764,15 +7467,12 @@ static void TXScanRange_PI(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T ca u1UI2PI = 5; - // find smallest DQS delay + for (u1ByteIdx = 0; u1ByteIdx < DQS_BYTE_NUMBER; u1ByteIdx++) { - ucdq_ui_large_bak[u1ByteIdx] = (u4RegValue_TXDLY >> (u1ByteIdx << 2)) & 0x7;// MCK - ucdq_ui_small_bak[u1ByteIdx] = (u4RegValue_dly >> (u1ByteIdx << 2)) & 0x7;// UI - //wrlevel_dqs_final_delay[p->rank][u1ByteIdx] ==> PI + ucdq_ui_large_bak[u1ByteIdx] = (u4RegValue_TXDLY >> (u1ByteIdx << 2)) & 0x7; + ucdq_ui_small_bak[u1ByteIdx] = (u4RegValue_dly >> (u1ByteIdx << 2)) & 0x7; - //LP4 : Virtual Delay = 256 * MCK + 32*UI + PI; - //LP3 : Virtual Delay = 128 * MCK + 32*UI + PI; u2TempVirtualDelay = (((ucdq_ui_large_bak[u1ByteIdx] << u1MCK2UI) + ucdq_ui_small_bak[u1ByteIdx]) << u1UI2PI) + wrlevel_dqs_final_delay[p->rank][u1ByteIdx]; if (u2TempVirtualDelay < u2SmallestVirtualDelay) @@ -7809,17 +7509,17 @@ static void TXScanRange_PI(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T ca #if TX_K_DQM_WITH_WDBI if (calType == TX_DQ_DQS_MOVE_DQM_ONLY) { - // DBI on, calibration range -1MCK + u2DQDelayBegin -= (1 << (u1MCK2UI + 5)); } #endif - /* Scan range: 1MCK */ + u2DQDelayEnd = u2DQDelayBegin + ((1 << u1MCK2UI) << u1UI2PI); *pu2Begin = u2DQDelayBegin; *pu2End = u2DQDelayEnd; - #if 0//TX_TDQS2DQ_PRE_CAL + #if 0 mcSHOW_DBG_MSG(("TXScanRange_PI %d~%d\n", u2DQDelayBegin, u2DQDelayEnd)); #endif } @@ -7834,13 +7534,13 @@ static void TXScanRange_Vref(DRAMC_CTX_T *p, U8 u1VrefScanEnable, U16* pu2Range, #if (SUPPORT_SAVE_TIME_FOR_CALIBRATION && BYPASS_VREF_CAL) if (p->femmc_Ready == 1) { - // if fast K, use TX Vref that saved. + u2VrefBegin = p->pSavetimeData->u1TxWindowPerbitVref_Save[p->channel][p->rank]; u2VrefEnd = u2VrefBegin + 1; } #endif } - else //LPDDR3, the for loop will only excute u2VrefLevel=TX_VREF_RANGE_END/2. + else { u2VrefBegin = 0; u2VrefEnd = 0; @@ -7914,14 +7614,14 @@ static U16 TxChooseVref(DRAMC_CTX_T *p, PASS_WIN_DATA_BY_VREF_T pVrefInfo[], U8 //if((u1VrefPassBegin_Final !=LP4_TX_VREF_BOUNDARY_NOT_READY) && (u1VrefPassEnd_Final!=LP4_TX_VREF_BOUNDARY_NOT_READY)) if (u1MaxVerfPassNum > 0) { - // vref pass window found + u2FinalVref = (u1VrefPassBegin_Final + u1VrefPassEnd_Final) >> 1; mcSHOW_DBG_MSG(("[TxChooseVref] Window > %d, Vref (%d~%d), Final Vref %d\n", LP4_TX_VREF_PASS_CONDITION, u1VrefPassBegin_Final, u1VrefPassEnd_Final, u2FinalVref)); } else #endif { - // not vref found + for (u1VrefIdx = 0; u1VrefIdx < u1VrefNum; u1VrefIdx++) { if ((pVrefInfo[u1VrefIdx].u1WorseBitWinSize_byVref > u1WinSizeOfWorseBit) || @@ -7949,7 +7649,7 @@ static void DramcTXSetVref(DRAMC_CTX_T *p, U8 u1VrefRange, U8 u1VrefValue) u1TempOPValue = ((u1VrefValue & 0x3f) | (u1VrefRange << 6)); u1MR14Value[p->channel][p->rank][p->dram_fsp] = u1TempOPValue; - //For TX VREF of different byte + DramcModeRegWriteByRank(p, p->rank, 14, u1TempOPValue); @@ -7987,17 +7687,17 @@ void TXUpdateTXTracking(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T calTy { if (calType == TX_DQ_DQS_MOVE_DQ_ONLY || calType == TX_DQ_DQS_MOVE_DQM_ONLY) { - //make a copy to dramc reg for TX DQ tracking used + if (calType == TX_DQ_DQS_MOVE_DQ_ONLY) { vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_PI), P_Fld(ucdq_pi[0], SHURK_PI_RK0_ARPI_DQ_B0) | P_Fld(ucdq_pi[1], SHURK_PI_RK0_ARPI_DQ_B1)); - // Source DQ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_DQS2DQ_CAL1), P_Fld(ucdq_pi[1], SHURK_DQS2DQ_CAL1_BOOT_ORIG_UI_RK0_DQ1) | P_Fld(ucdq_pi[0], SHURK_DQS2DQ_CAL1_BOOT_ORIG_UI_RK0_DQ0)); - // Target DQ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_DQS2DQ_CAL2), P_Fld(ucdq_pi[1], SHURK_DQS2DQ_CAL2_BOOT_TARG_UI_RK0_DQ1) | P_Fld(ucdq_pi[0], SHURK_DQS2DQ_CAL2_BOOT_TARG_UI_RK0_DQ0)); @@ -8008,7 +7708,7 @@ void TXUpdateTXTracking(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T calTy vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_PI), P_Fld(ucdqm_pi[0], SHURK_PI_RK0_ARPI_DQM_B0) | P_Fld(ucdqm_pi[1], SHURK_PI_RK0_ARPI_DQM_B1)); - // Target DQM + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_DQS2DQ_CAL5), P_Fld(ucdqm_pi[1], SHURK_DQS2DQ_CAL5_BOOT_TARG_UI_RK0_DQM1) | P_Fld(ucdqm_pi[0], SHURK_DQS2DQ_CAL5_BOOT_TARG_UI_RK0_DQM0)); @@ -8016,8 +7716,7 @@ void TXUpdateTXTracking(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T calTy } -#if 0// for LP3 , TX tracking will be disable, don't need to set DQ delay in DramC. - ///TODO: check LP3 byte mapping of dramC +#if 0 vIO32WriteFldMulti(DRAMC_REG_SHURK0_PI + (CHANNEL_A << POS_BANK_NUM), \ P_Fld(ucdq_final_pi[0], SHURK0_PI_RK0_ARPI_DQ_B0) | P_Fld(ucdq_final_pi[1], SHURK0_PI_RK0_ARPI_DQ_B1)); @@ -8026,7 +7725,7 @@ void TXUpdateTXTracking(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T calTy #endif } -#endif //End ENABLE_TX_TRACKING +#endif #if !BYPASS_CALIBRATION static @@ -8041,7 +7740,7 @@ void TXSetDelayReg_DQ(DRAMC_CTX_T *p, U8 u1UpdateRegUI, U8 ucdq_ui_large[], U8 u P_Fld(ucdq_oen_ui_large[0], SHURK_SELPH_DQ0_TXDLY_OEN_DQ0) | P_Fld(ucdq_oen_ui_large[1], SHURK_SELPH_DQ0_TXDLY_OEN_DQ1)); - // DLY_DQ[2:0] + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ2), \ P_Fld(ucdq_ui_small[0], SHURK_SELPH_DQ2_DLY_DQ0) | P_Fld(ucdq_ui_small[1], SHURK_SELPH_DQ2_DLY_DQ1) | @@ -8067,7 +7766,7 @@ void TXSetDelayReg_DQM(DRAMC_CTX_T *p, U8 u1UpdateRegUI, U8 ucdqm_ui_large[], U8 P_Fld(ucdqm_oen_ui_large[0], SHURK_SELPH_DQ1_TXDLY_OEN_DQM0) | P_Fld(ucdqm_oen_ui_large[1], SHURK_SELPH_DQ1_TXDLY_OEN_DQM1)); - // DLY_DQM[2:0] + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ3), P_Fld(ucdqm_ui_small[0], SHURK_SELPH_DQ3_DLY_DQM0) | P_Fld(ucdqm_ui_small[1], SHURK_SELPH_DQ3_DLY_DQM1) | @@ -8102,13 +7801,13 @@ static void Tx_Auto_K_Init(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T ca if (calType == TX_DQ_DQS_MOVE_DQ_DQM) { vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), - P_Fld(0x1, TX_ATK_SET1_TX_ATK_DQ_PI_EN) | //enable TX DQ auto K - P_Fld(0x1, TX_ATK_SET1_TX_ATK_DQM_PI_EN)); //enable TX DQM auto K + P_Fld(0x1, TX_ATK_SET1_TX_ATK_DQ_PI_EN) | + P_Fld(0x1, TX_ATK_SET1_TX_ATK_DQM_PI_EN)); vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET0), - P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQ_B0_PI_INIT) | //Set begin position of DQ B0 - P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQ_B1_PI_INIT) | //Set begin position of DQ B1 - P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQM_B0_PI_INIT) | //Set begin position of DQM B0 - P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQM_B1_PI_INIT)); //Set begin position of DQM B1 + P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQ_B0_PI_INIT) | + P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQ_B1_PI_INIT) | + P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQM_B0_PI_INIT) | + P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQM_B1_PI_INIT)); } else if (calType == TX_DQ_DQS_MOVE_DQM_ONLY) { @@ -8125,18 +7824,18 @@ static void Tx_Auto_K_Init(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION_TYTE_T ca P_Fld(ucdq_pi, TX_ATK_SET0_TX_ATK_DQ_B1_PI_INIT)); } - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL1), 0, MISC_CTRL1_R_DMARPIDQ_SW); //Switch PI SW mode to HW mode (control by DRAMC not APHY) + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL1), 0, MISC_CTRL1_R_DMARPIDQ_SW); vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), - P_Fld(u1PI_Len, TX_ATK_SET1_TX_ATK_PI_LEN) | //enable TX auto k len - P_Fld(pi_thrd, TX_ATK_SET1_TX_ATK_PASS_PI_THRD)); //Set threshold of PI pass window -#if (fcFOR_CHIP_ID == fcIPM) //Fix at Mar_gaux - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), early_break, TX_ATK_SET1_TX_ATK_EARLY_BREAK); //Enable early break + P_Fld(u1PI_Len, TX_ATK_SET1_TX_ATK_PI_LEN) | + P_Fld(pi_thrd, TX_ATK_SET1_TX_ATK_PASS_PI_THRD)); +#if (fcFOR_CHIP_ID == fcIPM) + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), early_break, TX_ATK_SET1_TX_ATK_EARLY_BREAK); #endif { vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHU_TX_SET0), P_Fld(0x3, SHU_TX_SET0_TXOEN_AUTOSET_OFFSET) | - P_Fld(0x1, SHU_TX_SET0_TXOEN_AUTOSET_EN)); //Enable OE auto adjust + P_Fld(0x1, SHU_TX_SET0_TXOEN_AUTOSET_EN)); } #if TX_AUTO_K_DEBUG_ENABLE @@ -8173,11 +7872,11 @@ static void Tx_Auto_K_complete_check(DRAMC_CTX_T *p) static void Tx_Auto_K_Clear(DRAMC_CTX_T *p) { - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x0, TX_ATK_SET1_TX_ATK_TRIG); //Disable Tx auto K + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x0, TX_ATK_SET1_TX_ATK_TRIG); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_TX_SET0), 0x0, SHU_TX_SET0_TXOEN_AUTOSET_EN); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL1), 0x1, MISC_CTRL1_R_DMARPIDQ_SW); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x0, TX_ATK_SET1_TX_ATK_DBG_EN); - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x1, TX_ATK_SET1_TX_ATK_CLR); //Clear state machine + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x1, TX_ATK_SET1_TX_ATK_CLR); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x0, TX_ATK_SET1_TX_ATK_CLR); vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), P_Fld(0x0, TX_ATK_SET1_TX_ATK_PI_LEN) | @@ -8192,7 +7891,7 @@ static void Tx_Auto_K_Clear(DRAMC_CTX_T *p) static void Tx_Auto_K_DQM_Workaround(DRAMC_CTX_T *p) { //U32 u4DQM_MCK, u4DQM_UI, u4DQM_PI_B0, u4DQM_PI_B1; - //Set RK1 DQM DLY to RK0 + vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ1), u4DQM_MCK_RK1_backup); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ3), u4DQM_UI_RK1_backup); vIO32Write4B(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_DQ0), u4DQM_PI_RK1_backup[0]); @@ -8201,7 +7900,7 @@ static void Tx_Auto_K_DQM_Workaround(DRAMC_CTX_T *p) static void Tx_Auto_K_DQ_Workaround(DRAMC_CTX_T *p) { //U32 u4DQ_MCK, u4DQ_UI, u4DQ_PI_B0, u4DQ_PI_B1; - //Set RK1 DQM DLY to RK0 + vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ0), u4DQ_MCK_RK1_backup); vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ2), u4DQ_UI_RK1_backup); vIO32Write4B(DRAMC_REG_ADDR(DDRPHY_REG_SHU_R0_B0_DQ0), u4DQ_PI_RK1_backup[0]); @@ -8269,7 +7968,7 @@ void vSwitchWriteDBISettings(DRAMC_CTX_T *p, U8 u1OnOff) S8 u1TXShiftMCK; u1TXShiftMCK = (u1OnOff)? -1: 1; - DramcWriteShiftMCKForWriteDBI(p, u1TXShiftMCK); //Tx DQ/DQM -1 MCK for write DBI ON + DramcWriteShiftMCKForWriteDBI(p, u1TXShiftMCK); SetDramModeRegForWriteDBIOnOff(p, p->dram_fsp, u1OnOff); DramcWriteDBIOnOff(p, u1OnOff); @@ -8295,7 +7994,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION U16 uiDelay, u2DQDelayBegin, u2DQDelayEnd, u2DQDelayStep = 1; U8 ucdq_pi, ucdq_ui_small, ucdq_ui_large, ucdq_oen_ui_small, ucdq_oen_ui_large; - U8 ucdq_ui_small_reg_value, u1UpdateRegUI; // for UI and TXDLY change check, if different , set reg. + U8 ucdq_ui_small_reg_value, u1UpdateRegUI; U8 ucdq_reg_pi[DQS_BYTE_NUMBER], ucdq_reg_ui_large[DQS_BYTE_NUMBER], ucdq_reg_ui_small[DQS_BYTE_NUMBER]; U8 ucdq_reg_oen_ui_large[DQS_BYTE_NUMBER], ucdq_reg_oen_ui_small[DQS_BYTE_NUMBER]; @@ -8303,8 +8002,8 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION U8 ucdq_reg_dqm_pi[DQS_BYTE_NUMBER] = {0}, ucdq_reg_dqm_ui_large[DQS_BYTE_NUMBER] = {0}, ucdq_reg_dqm_ui_small[DQS_BYTE_NUMBER] = {0}; U8 ucdq_reg_dqm_oen_ui_large[DQS_BYTE_NUMBER] = {0}, ucdq_reg_dqm_oen_ui_small[DQS_BYTE_NUMBER] = {0}; - #if 1//TX_DQM_CALC_MAX_MIN_CENTER - U16 u2DQM_Delay; // LP4 only + #if 1 + U16 u2DQM_Delay; U16 u2Center_min[DQS_BYTE_NUMBER] = {0}, u2Center_max[DQS_BYTE_NUMBER] = {0}; #endif U8 u1EnableDelayCell = 0; @@ -8381,15 +8080,15 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION TXScanRange_PI(p, calType, &u2DQDelayBegin, &u2DQDelayEnd); TXScanRange_Vref(p, u1VrefScanEnable, &u2FinalRange, &u2VrefBegin, &u2VrefEnd, &u2VrefStep); - //default set FAIL + vSetCalibrationResult(p, DRAM_CALIBRATION_TX_PERBIT, DRAM_FAIL); if (isAutoK) { #if TX_AUTO_K_SUPPORT - //CKEFixOnOff(p, p->rank, CKE_FIXON, TO_ONE_CHANNEL); //Let CLK always on + //CKEFixOnOff(p, p->rank, CKE_FIXON, TO_ONE_CHANNEL); + - //Set base address of TX MCK and UI u1UpdateRegUI = 1; uiDelay = u2DQDelayBegin; u1PI_Len = 3; @@ -8430,7 +8129,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION #if TX_AUTO_K_WORKAROUND if ((calType == TX_DQ_DQS_MOVE_DQ_ONLY) && (u1backup_Rank == 1)) - Tx_Auto_K_DQM_Workaround(p); //Set best DLY value of RK1 DQM to RK0 DQM + Tx_Auto_K_DQM_Workaround(p); #endif } if (calType == TX_DQ_DQS_MOVE_DQM_ONLY || calType == TX_DQ_DQS_MOVE_DQ_DQM) @@ -8441,7 +8140,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION #if TX_AUTO_K_WORKAROUND if ((calType == TX_DQ_DQS_MOVE_DQM_ONLY) && (u1backup_Rank == 1)) - Tx_Auto_K_DQ_Workaround(p); //Set best DLY value of RK1 DQ to RK0 DQ + Tx_Auto_K_DQ_Workaround(p); #endif } @@ -8450,7 +8149,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION p->rank = 1; #endif - //Tx_Auto_K_Init(p, calType, ucdq_pi, u1PI_Len); //u1PI_Len = 1 means that PI len is 64 PI + #endif } else @@ -8495,14 +8194,14 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION #endif { #if ENABLE_K_WITH_WORST_SI_UI_SHIFT - DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT);//UI_SHIFT + LEN1 + DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT); #else DramcEngine2Init(p, p->test2_1, p->test2_2, TEST_XTALK_PATTERN, 0, TE_NO_UI_SHIFT); #endif for (u2VrefLevel = u2VrefBegin; u2VrefLevel <= u2VrefEnd; u2VrefLevel += u2VrefStep) { - // SET tx Vref (DQ) here, LP3 no need to set this. + if (u1VrefScanEnable) { #if (!REDUCE_LOG_FOR_PRELOADER) @@ -8523,7 +8222,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION mcSHOW_DBG_MSG(("\n\tTX Vref Scan disable\n")); } - // initialize parameters + uiFinishCount = 0; u2TempWinSum = 0; ucdq_ui_small_reg_value = 0xff; @@ -8539,20 +8238,18 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION if (isAutoK) { #if TX_AUTO_K_SUPPORT - Tx_Auto_K_Init(p, calType, ucdq_pi, u1PI_Len); //u1PI_Len = 1 means that PI len is 64 PI - vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x1, TX_ATK_SET1_TX_ATK_TRIG); //TX Auto K start + Tx_Auto_K_Init(p, calType, ucdq_pi, u1PI_Len); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TX_ATK_SET1), 0x1, TX_ATK_SET1_TX_ATK_TRIG); #endif } else { - //Move DQ delay , 1 PI = tCK/64, total 128 PI, 1UI = 32 PI - //For data rate 3200, max tDQS2DQ is 2.56UI (82 PI) - //For data rate 4266, max tDQS2DQ is 3.41UI (109 PI) + for (uiDelay = u2DQDelayBegin; uiDelay < u2DQDelayEnd; uiDelay += u2DQDelayStep) { TxWinTransferDelayToUIPI(p, uiDelay, 0, &ucdq_ui_large, &ucdq_ui_small, &ucdq_pi, &ucdq_oen_ui_large, &ucdq_oen_ui_small); - // Check if TX UI changed, if not change , don't need to set reg again + if (ucdq_ui_small_reg_value != ucdq_ui_small) { u1UpdateRegUI = 1; @@ -8592,21 +8289,16 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION u4err_value = 0; #if ENABLE_K_WITH_WORST_SI_UI_SHIFT - //DramcEngine2SetPat(p, p->test_pattern, 0, 0, TE_UI_SHIFT); + u4err_value = DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, p->test_pattern); #else - //audio + xtalk pattern + DramcEngine2SetPat(p, TEST_AUDIO_PATTERN, 0, 0, TE_NO_UI_SHIFT); u4err_value = DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_AUDIO_PATTERN); DramcEngine2SetPat(p, TEST_XTALK_PATTERN, 0, 1, TE_NO_UI_SHIFT); u4err_value |= DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_XTALK_PATTERN); #endif - //audio + xtalk pattern - //u4err_value = 0; - //DramcEngine2SetPat(p, TEST_AUDIO_PATTERN, 0, 0); - //u4err_value = DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_AUDIO_PATTERN); - //DramcEngine2SetPat(p, TEST_XTALK_PATTERN, 0, 1); - //u4err_value |= DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_XTALK_PATTERN); + if (u1VrefScanEnable == 0 && (calType != TX_DQ_DQS_MOVE_DQM_ONLY)) { @@ -8621,7 +8313,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION #endif } - // check fail bit ,0 ok ,others fail + for (u1BitIdx = 0; u1BitIdx < p->data_width; u1BitIdx++) { u4fail_bit = u4err_value & ((U32)1 << u1BitIdx); @@ -8648,7 +8340,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION if (WinPerBit[u1BitIdx].first_pass == PASS_RANGE_NA) { - if (u4fail_bit == 0) //compare correct: pass + if (u4fail_bit == 0) { WinPerBit[u1BitIdx].first_pass = uiDelay; @@ -8673,7 +8365,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION } else if (WinPerBit[u1BitIdx].last_pass == PASS_RANGE_NA) { - if (u4fail_bit != 0) //compare error : fail + if (u4fail_bit != 0) { WinPerBit[u1BitIdx].last_pass = uiDelay - u2DQDelayStep; } @@ -8696,17 +8388,17 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION (WinPerBit[u1BitIdx].last_pass - WinPerBit[u1BitIdx].first_pass), (VrefWinPerBit[u1BitIdx].last_pass - VrefWinPerBit[u1BitIdx].first_pass))); } - //if window size bigger than TX_PASS_WIN_CRITERIA, consider as real pass window. If not, don't update finish counte and won't do early break; + if (((WinPerBit[u1BitIdx].last_pass - WinPerBit[u1BitIdx].first_pass) > TX_PASS_WIN_CRITERIA) - ||((u2DQDelayStep>=16) && (WinPerBit[u1BitIdx].first_pass!=PASS_RANGE_NA))) //DDR400 stepsize is too big, can't find last pass. + ||((u2DQDelayStep>=16) && (WinPerBit[u1BitIdx].first_pass!=PASS_RANGE_NA))) uiFinishCount |= (1 << u1BitIdx); - //update bigger window size + VrefWinPerBit[u1BitIdx].first_pass = WinPerBit[u1BitIdx].first_pass; VrefWinPerBit[u1BitIdx].last_pass = WinPerBit[u1BitIdx].last_pass; } - //reset tmp window + WinPerBit[u1BitIdx].first_pass = PASS_RANGE_NA; WinPerBit[u1BitIdx].last_pass = PASS_RANGE_NA; } @@ -8721,7 +8413,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION } } - //if all bits widnow found and all bits turns to fail again, early break; + if (uiFinishCount == 0xffff) { vSetCalibrationResult(p, DRAM_CALIBRATION_TX_PERBIT, DRAM_OK); @@ -8732,7 +8424,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION mcSHOW_DBG_MSG3(("TX calibration finding left boundary early break. PI DQ delay=0x%2x\n", uiDelay)); #endif #endif - break; //early break + break; } } } @@ -8747,9 +8439,6 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION #endif } - // (1) calculate per bit window size - // (2) find out min win of all DQ bits - // (3) calculate perbit window center u1min_winsize = 0xff; u1min_bit = 0xff; for (u1BitIdx = 0; u1BitIdx < p->data_width; u1BitIdx++) @@ -8795,7 +8484,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION u1min_winsize = VrefWinPerBit[u1BitIdx].win_size; } - u2TempWinSum += VrefWinPerBit[u1BitIdx].win_size; //Sum of CA Windows for vref selection + u2TempWinSum += VrefWinPerBit[u1BitIdx].win_size; #if VENDER_JV_LOG if (calType == TX_DQ_DQS_MOVE_DQ_ONLY) @@ -8805,7 +8494,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION #endif - // calculate per bit window position and print + VrefWinPerBit[u1BitIdx].win_center = (VrefWinPerBit[u1BitIdx].first_pass + VrefWinPerBit[u1BitIdx].last_pass) >> 1; #if PINMUX_AUTO_TEST_PER_BIT_TX gFinalTXPerbitFirstPass[p->channel][u1BitIdx] = VrefWinPerBit[u1BitIdx].first_pass; @@ -8864,13 +8553,12 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION } #endif - if (u1VrefScanEnable == 0)// ..if time domain (not vref scan) , calculate window center of all bits. + if (u1VrefScanEnable == 0) { - // Calculate the center of DQ pass window - // Record center sum of each byte + for (u1ByteIdx = 0; u1ByteIdx < DQS_BYTE_NUMBER; u1ByteIdx++) { - #if 1//TX_DQM_CALC_MAX_MIN_CENTER + #if 1 u2Center_min[u1ByteIdx] = 0xffff; u2Center_max[u1ByteIdx] = 0; #endif @@ -8897,7 +8585,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION } } - // SET tx Vref (DQ) = u2FinalVref, LP3 no need to set this. + if (u1VrefScanEnable) { #if SUPPORT_SAVE_TIME_FOR_CALIBRATION && BYPASS_VREF_CAL @@ -8916,7 +8604,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION } #ifdef FOR_HQA_TEST_USED - // LP4 DQ time domain || LP3 DQ_DQM time domain + if (calType == TX_DQ_DQS_MOVE_DQ_ONLY) { gFinalTXPerbitWin_min_max[p->channel][p->rank] = u1min_winsize; @@ -8930,8 +8618,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION } #endif - // LP3 only use "TX_DQ_DQS_MOVE_DQ_DQM" scan - // first freq 800(LP4-1600) doesn't support jitter meter(data < 1T), therefore, don't use delay cell + if ((calType == TX_DQ_DQS_MOVE_DQ_ONLY) && (p->frequency >= 1333) && (p->u2DelayCellTimex100 != 0)) { u1EnableDelayCell = 1; @@ -8939,23 +8626,22 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION //mcDUMP_REG_MSG(("[TX_PER_BIT_DELAY_CELL] DelayCellTimex100 =%d/100 ps\n", p->u2DelayCellTimex100)); } - //Calculate the center of DQ pass window - //average the center delay + for (u1ByteIdx = 0; u1ByteIdx < DQS_BYTE_NUMBER; u1ByteIdx++) { mcSHOW_DBG_MSG((" == TX Byte %d ==\n", u1ByteIdx)); //mcDUMP_REG_MSG((" == TX Byte %d ==\n", u1ByteIdx)); - u2DQM_Delay = ((u2Center_min[u1ByteIdx] + u2Center_max[u1ByteIdx]) >> 1); //(max +min)/2 + u2DQM_Delay = ((u2Center_min[u1ByteIdx] + u2Center_max[u1ByteIdx]) >> 1); if (u1EnableDelayCell == 0) { uiDelay = u2DQM_Delay; } - else// if(calType == TX_DQ_DQS_MOVE_DQ_ONLY) + else { - uiDelay = u2Center_min[u1ByteIdx]; // for DQ PI delay , will adjust with delay cell + uiDelay = u2Center_min[u1ByteIdx]; + - // calculate delay cell perbit for (u1BitIdx = 0; u1BitIdx < DQS_BIT_NUMBER; u1BitIdx++) { u1BitTemp = u1ByteIdx * DQS_BIT_NUMBER + u1BitIdx; @@ -9057,7 +8743,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION RegLogEnable = 1; #endif - /* p->rank = RANK_0, save to Reg Rank0 and Rank1, p->rank = RANK_1, save to Reg Rank1 */ + for (u1RankIdx = p->rank; u1RankIdx < RANK_MAX; u1RankIdx++) { vSetRank(p, u1RankIdx); @@ -9107,7 +8793,7 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION P_Fld(ucdq_reg_pi[0], TX_ATK_SET0_TX_ATK_DQ_B0_PI_INIT) | P_Fld(ucdq_reg_pi[1], TX_ATK_SET0_TX_ATK_DQ_B1_PI_INIT) | P_Fld(ucdq_reg_dqm_pi[0], TX_ATK_SET0_TX_ATK_DQM_B0_PI_INIT) | - P_Fld(ucdq_reg_dqm_pi[1], TX_ATK_SET0_TX_ATK_DQM_B1_PI_INIT)); //If TX auto-k is enable, TX_PI will be switch to PI_INIT + P_Fld(ucdq_reg_dqm_pi[1], TX_ATK_SET0_TX_ATK_DQM_B1_PI_INIT)); #endif #endif } @@ -9133,13 +8819,13 @@ DRAM_STATUS_T DramcTxWindowPerbitCal(DRAMC_CTX_T *p, DRAM_TX_PER_BIT_CALIBRATION mcSHOW_DBG_MSG4(("[TxWindowPerbitCal] Done\n\n")); #if 0 - vIO32WriteFldAlign_All(DRAMC_REG_ADDR(DRAMC_REG_PADCTL4), 1, PADCTL4_CKEFIXON); // test only + vIO32WriteFldAlign_All(DRAMC_REG_ADDR(DRAMC_REG_PADCTL4), 1, PADCTL4_CKEFIXON); #endif return DRAM_OK; } -#endif //SIMULATION_TX_PERBIT +#endif #if ENABLE_EYESCAN_GRAPH void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) @@ -9154,7 +8840,7 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) U32 uiFinishCount; U16 u2TempWinSum, u2tx_window_sum=0; U32 u4err_value, u4fail_bit; - #if 1//TX_DQM_CALC_MAX_MIN_CENTER + #if 1 U16 u2Center_min[DQS_BYTE_NUMBER],u2Center_max[DQS_BYTE_NUMBER]; #endif @@ -9183,15 +8869,15 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) //if (gTX_EYE_Scan_only_higheset_freq_flag==1 && p->frequency != u2DFSGetHighestFreq(p)) return; - //backup register value + DramcBackupRegisters(p, u4RegBackupAddress, sizeof(u4RegBackupAddress)/sizeof(U32)); backup_u1MR14Value = u1MR14Value[p->channel][p->rank][p->dram_fsp]; - if (gFinalTXVrefDQ[p->channel][p->rank] ==0) //Set final TX Vref as default value + if (gFinalTXVrefDQ[p->channel][p->rank] ==0) gFinalTXVrefDQ[p->channel][p->rank] = u1MR14Value[p->channel][p->rank][p->dram_fsp]; - //set initial values + for(u1vrefidx=0; u1vrefidx<=VREF_VOLTAGE_TABLE_NUM_LP5-1;u1vrefidx++) { for (u1BitIdx = 0; u1BitIdx < p->data_width; u1BitIdx++) @@ -9255,7 +8941,7 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) mcSHOW_DBG_MSG3(("\nTX Vref %d -> %d, step: %d\n", u2VrefBegin, u2VrefEnd, u2VrefStep)); #if ENABLE_K_WITH_WORST_SI_UI_SHIFT - DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT);//UI_SHIFT + LEN1 + DramcEngine2Init(p, p->test2_1, p->test2_2, p->test_pattern | 0x80, 0, TE_UI_SHIFT); #else DramcEngine2Init(p, p->test2_1, p->test2_2, TEST_XTALK_PATTERN, 0, TE_NO_UI_SHIFT); #endif @@ -9263,12 +8949,11 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) for(u2VrefLevel = u2VrefBegin; u2VrefLevel <= u2VrefEnd; u2VrefLevel += u2VrefStep) { - //set vref -//fra u1MR14Value[p->channel][p->rank][p->dram_fsp] = (u2VrefLevel | (u2VrefRange<<6)); + DramcTXSetVref(p, u2VrefRange, u2VrefLevel); mcSHOW_DBG_MSG3(("\n\n Set TX VrefRange %d, VrefLevel=%d\n", u2VrefRange, u2VrefLevel)); - // initialize parameters + uiFinishCount = 0; u2TempWinSum =0; @@ -9328,20 +9013,13 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) //DramcEngine2SetPat(p, p->test_pattern, 0, 0, TE_UI_SHIFT); u4err_value = DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, p->test_pattern); #else - //audio + xtalk pattern + DramcEngine2SetPat(p, TEST_AUDIO_PATTERN, 0, 0, TE_NO_UI_SHIFT); u4err_value = DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_AUDIO_PATTERN); DramcEngine2SetPat(p, TEST_XTALK_PATTERN, 0, 1, TE_NO_UI_SHIFT); u4err_value |= DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_XTALK_PATTERN); #endif - // audio + xtalk pattern - //u4err_value=0; - //DramcEngine2SetPat(p,TEST_AUDIO_PATTERN, 0, 0, TE_NO_UI_SHIFT); - //u4err_value = DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_AUDIO_PATTERN); - //DramcEngine2SetPat(p,TEST_XTALK_PATTERN, 0, 1, TE_NO_UI_SHIFT); - //u4err_value |= DramcEngine2Run(p, TE_OP_WRITE_READ_CHECK, TEST_XTALK_PATTERN); - // check fail bit ,0 ok ,others fail for (u1BitIdx = 0; u1BitIdx < p->data_width; u1BitIdx++) { u4fail_bit = u4err_value&((U32)1<<u1BitIdx); @@ -9353,7 +9031,7 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) if(WinPerBit[u1BitIdx].first_pass== PASS_RANGE_NA) { - if(u4fail_bit==0) //compare correct: pass + if(u4fail_bit==0) { WinPerBit[u1BitIdx].first_pass = uiDelay; u1pass_in_this_vref_flag[u1BitIdx] = 1; @@ -9361,7 +9039,7 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) } else if(WinPerBit[u1BitIdx].last_pass == PASS_RANGE_NA) { - if(u4fail_bit !=0) //compare error : fail + if(u4fail_bit !=0) { WinPerBit[u1BitIdx].last_pass = (uiDelay-1); } @@ -9374,11 +9052,11 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) { if((WinPerBit[u1BitIdx].last_pass -WinPerBit[u1BitIdx].first_pass) >= (VrefWinPerBit[u1BitIdx].last_pass -VrefWinPerBit[u1BitIdx].first_pass)) { - //if window size bigger than 7, consider as real pass window. If not, don't update finish counte and won't do early break; + if((WinPerBit[u1BitIdx].last_pass -WinPerBit[u1BitIdx].first_pass) >7) uiFinishCount |= (1<<u1BitIdx); - //update bigger window size + VrefWinPerBit[u1BitIdx].first_pass = WinPerBit[u1BitIdx].first_pass; VrefWinPerBit[u1BitIdx].last_pass = WinPerBit[u1BitIdx].last_pass; } @@ -9390,18 +9068,17 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) gEyeScan_Min[(u2VrefLevel+u2VrefRange*30)/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]] = WinPerBit[u1BitIdx].first_pass; gEyeScan_Max[(u2VrefLevel+u2VrefRange*30)/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]] = WinPerBit[u1BitIdx].last_pass; #else -//fra gEyeScan_Min[(u2VrefLevel+u2VrefRange*30)/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]] = WinPerBit[u1BitIdx].first_pass + tx_pi_delay[u1BitIdx/8]-32; -//fra gEyeScan_Max[(u2VrefLevel+u2VrefRange*30)/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]] = WinPerBit[u1BitIdx].last_pass + tx_pi_delay[u1BitIdx/8]-32; + gEyeScan_Min[(u2VrefLevel+u2VrefRange*30)/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]] = (S8) WinPerBit[u1BitIdx].first_pass; gEyeScan_Max[(u2VrefLevel+u2VrefRange*30)/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]] = (S8) WinPerBit[u1BitIdx].last_pass; mcSHOW_DBG_MSG3(("VrefRange %d, VrefLevel=%d, u1BitIdx=%d, index=%d (%d, %d)==\n",u2VrefRange,u2VrefLevel, u1BitIdx, EyeScan_index[u1BitIdx], gEyeScan_Min[u2VrefLevel/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]], gEyeScan_Max[u2VrefLevel/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx][EyeScan_index[u1BitIdx]])); - gEyeScan_MinMax_store_delay[u1BitIdx/8] = tx_pi_delay[u1BitIdx/8]-32; /* save this information for HQA pass/fail judgement used */ + gEyeScan_MinMax_store_delay[u1BitIdx/8] = tx_pi_delay[u1BitIdx/8]-32; #endif EyeScan_index[u1BitIdx]=EyeScan_index[u1BitIdx]+1; } - //reset tmp window + WinPerBit[u1BitIdx].first_pass = PASS_RANGE_NA; WinPerBit[u1BitIdx].last_pass = PASS_RANGE_NA; } @@ -9421,7 +9098,7 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) min_winsize = VrefWinPerBit[u1BitIdx].win_size; } - u2TempWinSum += VrefWinPerBit[u1BitIdx].win_size; //Sum of CA Windows for vref selection + u2TempWinSum += VrefWinPerBit[u1BitIdx].win_size; gEyeScan_WinSize[(u2VrefLevel+u2VrefRange*30)/EYESCAN_GRAPH_CATX_VREF_STEP][u1BitIdx] = VrefWinPerBit[u1BitIdx].win_size; @@ -9441,11 +9118,10 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) u2FinalRange = u2VrefRange; u2FinalVref = u2VrefLevel; - //Calculate the center of DQ pass window - // Record center sum of each byte + for (u1ByteIdx=0; u1ByteIdx<DQS_BYTE_NUMBER; u1ByteIdx++) { - #if 1//TX_DQM_CALC_MAX_MIN_CENTER + #if 1 u2Center_min[u1ByteIdx] = 0xffff; u2Center_max[u1ByteIdx] = 0; #endif @@ -9476,17 +9152,16 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) for (u1BitIdx = 0; u1BitIdx < p->data_width; u1BitIdx++) { - if (u1pass_in_this_vref_flag[u1BitIdx]) gEyeScan_ContinueVrefHeight[u1BitIdx]+=EYESCAN_GRAPH_CATX_VREF_STEP; //count pass number of continue vref + if (u1pass_in_this_vref_flag[u1BitIdx]) gEyeScan_ContinueVrefHeight[u1BitIdx]+=EYESCAN_GRAPH_CATX_VREF_STEP; } } DramcEngine2End(p); - //Calculate the center of DQ pass window - //average the center delay + for (u1ByteIdx=0; u1ByteIdx<DQS_BYTE_NUMBER; u1ByteIdx++) { - uiDelay = ((u2Center_min[u1ByteIdx] + u2Center_max[u1ByteIdx])>>1); //(max +min)/2 + uiDelay = ((u2Center_min[u1ByteIdx] + u2Center_max[u1ByteIdx])>>1); #if VENDER_JV_LOG || defined(RELEASE) gEyeScan_CaliDelay[u1ByteIdx] = uiDelay; @@ -9496,10 +9171,10 @@ void Dramc_K_TX_EyeScan_Log(DRAMC_CTX_T *p) } - //restore to orignal value + DramcRestoreRegisters(p, u4RegBackupAddress, sizeof(u4RegBackupAddress)/sizeof(U32)); - //restore Vref + { u2VrefRange = backup_u1MR14Value>>6; u2VrefLevel = backup_u1MR14Value & 0x3f; @@ -9544,7 +9219,7 @@ void DramcTxOECalibration(DRAMC_CTX_T *p) mcSHOW_DBG_MSG(("\n[DramC_TX_OE_Calibration] DMA\n")); #endif - //default set FAIL + vSetCalibrationResult(p, DRAM_CALIBRATION_TX_OE, DRAM_FAIL); #if (SUPPORT_SAVE_TIME_FOR_CALIBRATION) @@ -9573,11 +9248,11 @@ void DramcTxOECalibration(DRAMC_CTX_T *p) vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ1), \ P_Fld(ucdq_oen_ui_large[0], SHURK_SELPH_DQ1_TXDLY_OEN_DQM0) | \ P_Fld(ucdq_oen_ui_large[1], SHURK_SELPH_DQ1_TXDLY_OEN_DQM1)); - // DLY_DQ[2:0] + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ2), \ P_Fld(ucdq_oen_ui_small[0], SHURK_SELPH_DQ2_DLY_OEN_DQ0) | \ P_Fld(ucdq_oen_ui_small[1], SHURK_SELPH_DQ2_DLY_OEN_DQ1) ); - // DLY_DQM[2:0] + vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_SHURK_SELPH_DQ3), \ P_Fld(ucdq_oen_ui_small[0], SHURK_SELPH_DQ3_DLY_OEN_DQM0) | \ P_Fld(ucdq_oen_ui_small[1], SHURK_SELPH_DQ3_DLY_OEN_DQM1)); @@ -9589,10 +9264,7 @@ void DramcTxOECalibration(DRAMC_CTX_T *p) ((_reg & Fld2Msk32(_fld)) >> Fld_shft(_fld)) static void OECKCKE_Control(DRAMC_CTX_T *p, U32 option) { - /* In case to prevent illegal command during JM/8Phase cal and Duty cal, - * OE for CK/CKE/CA/CS will be disabled. But CK/CKE has timing requirement. - * Adding this flow to fix it - */ + static U32 u4CA_CMD2_backup = 0; static U32 u4SHU_CA_CMD13_backup = 0; static U32 u4CS_CTRL_backup = 0; @@ -9623,24 +9295,23 @@ static void OECKCKE_Control(DRAMC_CTX_T *p, U32 option) } u4backup_done = 1; - /* CS/CKE/CA */ - /* CKE need disable before CS */ + if (!isLP4_DSC) { - /* CKE/CA */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD2), P_Fld( 0, CA_CMD2_RG_TX_ARCS_OE_TIE_SEL_CA) \ | P_Fld( 1, CA_CMD2_RG_TX_ARCS_OE_TIE_EN_CA) \ | P_Fld( 0, CA_CMD2_RG_TX_ARCA_OE_TIE_SEL_CA) \ | P_Fld( 0xff, CA_CMD2_RG_TX_ARCA_OE_TIE_EN_CA)); - /* CS */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_CA_TX_ARCS_CTRL), P_Fld( 0, CA_TX_ARCS_CTRL_RG_TX_ARCS_OE_TIE_SEL_C0)); } else { - /* CKE */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B1_TX_CKE_CTRL), P_Fld( 0, B1_TX_CKE_CTRL_RG_TX_ARCKE_OE_TIE_SEL_B1) \ | P_Fld( 1, B1_TX_CKE_CTRL_RG_TX_ARCKE_OE_TIE_EN_B1)); - /* CS/CA */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ2), P_Fld( 0, B1_DQ2_RG_TX_ARDQM_OE_TIE_SEL_B1) \ | P_Fld( 1, B1_DQ2_RG_TX_ARDQM_OE_TIE_EN_B1) \ | P_Fld( 0, B1_DQ2_RG_TX_ARDQ_OE_TIE_SEL_B1) \ @@ -9650,21 +9321,21 @@ static void OECKCKE_Control(DRAMC_CTX_T *p, U32 option) mcDELAY_US(1); if (!isLP4_DSC) { - /* CLK */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD2), P_Fld( 0, CA_CMD2_RG_TX_ARCLK_OE_TIE_SEL_CA) \ | P_Fld( 1, CA_CMD2_RG_TX_ARCLK_OE_TIE_EN_CA)); - /* CLKB */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD13), P_Fld( 0, SHU_CA_CMD13_RG_TX_ARCLKB_OE_TIE_SEL_CA) \ | P_Fld( 1, SHU_CA_CMD13_RG_TX_ARCLKB_OE_TIE_EN_CA)); } else { - /* CLK */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ2), P_Fld( 0, B1_DQ2_RG_TX_ARDQS_OE_TIE_SEL_B1) \ | P_Fld( 1, B1_DQ2_RG_TX_ARDQS_OE_TIE_EN_B1)); - /* CLKB */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ13), P_Fld( 0, SHU_B1_DQ13_RG_TX_ARDQSB_OE_TIE_SEL_B1) \ | P_Fld( 1, SHU_B1_DQ13_RG_TX_ARDQSB_OE_TIE_EN_B1)); } @@ -9695,7 +9366,7 @@ static void OECKCKE_Control(DRAMC_CTX_T *p, U32 option) u4CSOE_TieSel = fld_val(u4CS_CTRL_backup, CA_TX_ARCS_CTRL_RG_TX_ARCS_OE_TIE_SEL_C0); u4CSOE_TieEn = fld_val(u4CA_CMD2_backup, CA_CMD2_RG_TX_ARCA_OE_TIE_EN_CA); u4CKEOE_TieSel = fld_val(u4CA_CMD2_backup, CA_CMD2_RG_TX_ARCS_OE_TIE_SEL_CA); - /* CKE OE controlled by CS OE */ + u4CKEOE_TieEN = u4CSOE_TieEn; } else @@ -9708,33 +9379,32 @@ static void OECKCKE_Control(DRAMC_CTX_T *p, U32 option) if (!isLP4_DSC) { - /* CLK */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD2), P_Fld( u4CKOE_TieSel, CA_CMD2_RG_TX_ARCLK_OE_TIE_SEL_CA) \ | P_Fld( u4CKOE_TieEn, CA_CMD2_RG_TX_ARCLK_OE_TIE_EN_CA)); - /* CLKB */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD13), P_Fld( u4CKBOE_TieSel, SHU_CA_CMD13_RG_TX_ARCLKB_OE_TIE_SEL_CA ) \ | P_Fld( u4CKBOE_TieEn, SHU_CA_CMD13_RG_TX_ARCLKB_OE_TIE_EN_CA)); } else { - /* CLK */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ2), P_Fld( u4CKOE_TieSel, B1_DQ2_RG_TX_ARDQS_OE_TIE_SEL_B1) \ | P_Fld( u4CKOE_TieEn, B1_DQ2_RG_TX_ARDQS_OE_TIE_EN_B1)); - /* CLKB */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ13), P_Fld( u4CKBOE_TieSel, SHU_B1_DQ13_RG_TX_ARDQSB_OE_TIE_SEL_B1 ) \ | P_Fld( u4CKBOE_TieEn, SHU_B1_DQ13_RG_TX_ARDQSB_OE_TIE_EN_B1)); } mcDELAY_US(1); - /* CS/CKE/CA */ - /* CS need enable before CKE */ + if (!isLP4_DSC) { - /* CS */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_CA_TX_ARCS_CTRL), P_Fld( u4CSOE_TieSel, CA_TX_ARCS_CTRL_RG_TX_ARCS_OE_TIE_SEL_C0)); - /* CKE/CA */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_CA_CMD2), P_Fld( u4CKEOE_TieSel, CA_CMD2_RG_TX_ARCS_OE_TIE_SEL_CA) \ | P_Fld( u4CSOE_TieEn, CA_CMD2_RG_TX_ARCS_OE_TIE_EN_CA) \ | P_Fld( u4CAOE_TieSel, CA_CMD2_RG_TX_ARCA_OE_TIE_SEL_CA) \ @@ -9742,12 +9412,12 @@ static void OECKCKE_Control(DRAMC_CTX_T *p, U32 option) } else { - /* CS/CA */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ2), P_Fld( u4CSOE_TieSel, B1_DQ2_RG_TX_ARDQM_OE_TIE_SEL_B1) \ | P_Fld( u4CSOE_TieEn, B1_DQ2_RG_TX_ARDQM_OE_TIE_EN_B1) \ | P_Fld( u4CAOE_TieSel, B1_DQ2_RG_TX_ARDQ_OE_TIE_SEL_B1) \ | P_Fld( u4CAOE_TieEn, B1_DQ2_RG_TX_ARDQ_OE_TIE_EN_B1)); - /* CKE */ + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B1_TX_CKE_CTRL), P_Fld( u4CKEOE_TieSel, B1_TX_CKE_CTRL_RG_TX_ARCKE_OE_TIE_SEL_B1) \ | P_Fld( u4CKEOE_TieEN, B1_TX_CKE_CTRL_RG_TX_ARCKE_OE_TIE_EN_B1)); } @@ -9760,7 +9430,7 @@ static void OEDisable(DRAMC_CTX_T *p) { BOOL isLP4_DSC = (p->DRAMPinmux == PINMUX_DSC)?1:0; - //OE disable - start + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ2), P_Fld( 0 , B0_DQ2_RG_TX_ARDQS_OE_TIE_SEL_B0 ) \ | P_Fld( 1 , B0_DQ2_RG_TX_ARDQS_OE_TIE_EN_B0 ) \ | P_Fld( 0 , B0_DQ2_RG_TX_ARWCK_OE_TIE_SEL_B0 ) \ @@ -9809,11 +9479,11 @@ static void OEDisable(DRAMC_CTX_T *p) | P_Fld( 1 , SHU_CA_CMD13_RG_TX_ARCLKB_OE_TIE_EN_CA )); } - //OE disable - end + } #ifdef FOR_HQA_TEST_USED -// P_lm_r is 6nm, use same table with M_rg__x + VCORE_DELAYCELL_T gVcoreDelayCellTable[49]={ {500000, 512}, {506250, 496}, {512500, 482}, @@ -9904,28 +9574,20 @@ static U16 GetVcoreDelayCellTimeFromTable(DRAMC_CTX_T *p) } #endif -//------------------------------------------------------------------------- -/** DramcJmeterCalib - * start MIOCK jitter meter. - * @param p Pointer of context created by DramcCtxCreate. - * @param *pJmtrInfo DQSIEN signal high/low level transaction status - * @param u2JmDlyStep Clk delay step w/ DQSIEN signal - */ -//------------------------------------------------------------------------- + #if ENABLE_8PHASE_CALIBRATION || defined(ENABLE_MIOCK_JMETER) static void DramcJmeterInit(DRAMC_CTX_T *p, U8 u1IsJmtrK) { OEDisable(p); - //DramcHWGatingOnOff(p, 0); // disable Gating tracking for DQS PI, Remove to vApplyConfigBeforeCalibration + //DramcHWGatingOnOff(p, 0); if(u1IsJmtrK != TRUE) { vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_STBCAL), P_Fld(0x0, MISC_SHU_STBCAL_STBCALEN) | P_Fld(0x0, MISC_SHU_STBCAL_STB_SELPHCALEN)); } -#if 0 // 8-Phase calib must to do before DLL init for test only - //@A60868, Reset PI code to avoid 8-phase offset +#if 0 vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DLL_ARPI0), 0, B0_DLL_ARPI0_RG_ARPI_RESETB_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_DLL_ARPI0), 0, B1_DLL_ARPI0_RG_ARPI_RESETB_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_CA_DLL_ARPI0), 0, CA_DLL_ARPI0_RG_ARPI_RESETB_CA); @@ -9933,23 +9595,18 @@ static void DramcJmeterInit(DRAMC_CTX_T *p, U8 u1IsJmtrK) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DLL_ARPI0), 1, B0_DLL_ARPI0_RG_ARPI_RESETB_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_DLL_ARPI0), 1, B1_DLL_ARPI0_RG_ARPI_RESETB_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_CA_DLL_ARPI0), 1, CA_DLL_ARPI0_RG_ARPI_RESETB_CA); - //@A60868, End - // @A60868, DQSIEN PI offset clear to 0 vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ6), 0, SHU_B0_DQ6_RG_ARPI_OFFSET_DQSIEN_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ6), 0, SHU_B1_DQ6_RG_ARPI_OFFSET_DQSIEN_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD6), 0, SHU_CA_CMD6_RG_ARPI_OFFSET_DQSIEN_CA); #endif - // @A60868 for *RANK_SEL_SER_EN* = 0 to DA_RX_ARDQ_RANK_SEL_TXD_*[0] - // for *RANK_SEL_SER_EN* = 1 to DA_RX_ARDQ_RANK_SEL_TXD_*[7:0] - // The *RANK_SEL_SER_EN* = 0 is old mode. - // The *RANK_SEL_SER_EN* = 1 is new mode when background no any access. + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DQ11), 0, SHU_B0_DQ11_RG_RX_ARDQ_RANK_SEL_SER_EN_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ11), 0, SHU_B1_DQ11_RG_RX_ARDQ_RANK_SEL_SER_EN_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD11), 0, SHU_CA_CMD11_RG_RX_ARCA_RANK_SEL_SER_EN_CA); - //@Darren, DLL off to stable fix middle transion from high to low or low to high at high vcore + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_DLL1), P_Fld(0x0, SHU_CA_DLL1_RG_ARDLL_PHDET_EN_CA) | P_Fld(0x0, SHU_CA_DLL1_RG_ARDLL_PHDET_OUT_SEL_CA)); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DLL1), P_Fld(0x0, SHU_B0_DLL1_RG_ARDLL_PHDET_EN_B0) @@ -9957,25 +9614,19 @@ static void DramcJmeterInit(DRAMC_CTX_T *p, U8 u1IsJmtrK) vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DLL1), P_Fld(0x0, SHU_B1_DLL1_RG_ARDLL_PHDET_EN_B1) | P_Fld(0x0, SHU_B1_DLL1_RG_ARDLL_PHDET_OUT_SEL_B1)); - //MCK4X CG + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL1), 0, MISC_CTRL1_R_DMDQSIENCG_EN); - //@A60868, DQS PI mode for JMTR - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DLL_ARPI2), 0, SHU_B0_DLL_ARPI2_RG_ARPI_CG_DQSIEN_B0); // DQS PI mode - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DLL_ARPI2), 0, SHU_B1_DLL_ARPI2_RG_ARPI_CG_DQSIEN_B1); // DQS PI mode - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 1, MISC_DUTYSCAN1_RX_EYE_SCAN_CG_EN); // enable toggle cnt - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL4), 0, MISC_CTRL4_R_OPT2_CG_DQSIEN); // Remove to Golden settings for Jmeter clock - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL), 0, MISC_STBCAL_DQSIENCG_NORMAL_EN); // @Darren need confirm for DQS*_ERR_CNT, APHY PICG freerun - //@A60868, End - - // Bypass DQS glitch-free mode - // RG_RX_*RDQ_EYE_DLY_DQS_BYPASS_B** + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B0_DLL_ARPI2), 0, SHU_B0_DLL_ARPI2_RG_ARPI_CG_DQSIEN_B0); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DLL_ARPI2), 0, SHU_B1_DLL_ARPI2_RG_ARPI_CG_DQSIEN_B1); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 1, MISC_DUTYSCAN1_RX_EYE_SCAN_CG_EN); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CTRL4), 0, MISC_CTRL4_R_OPT2_CG_DQSIEN); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL), 0, MISC_STBCAL_DQSIENCG_NORMAL_EN); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ6), 1, B0_DQ6_RG_RX_ARDQ_EYE_DLY_DQS_BYPASS_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ6), 1, B1_DQ6_RG_RX_ARDQ_EYE_DLY_DQS_BYPASS_B1); - //Enable DQ eye scan - //RG_*_RX_EYE_SCAN_EN - //RG_*_RX_VREF_EN - //RG_*_RX_SMT_EN + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 1, MISC_DUTYSCAN1_RX_EYE_SCAN_EN); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), P_Fld(0x1, MISC_DUTYSCAN1_EYESCAN_DQS_SYNC_EN) | P_Fld(0x1, MISC_DUTYSCAN1_EYESCAN_NEW_DQ_SYNC_EN) @@ -9986,26 +9637,25 @@ static void DramcJmeterInit(DRAMC_CTX_T *p, U8 u1IsJmtrK) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ5), 1, B1_DQ5_RG_RX_ARDQ_VREF_EN_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ3), 1, B0_DQ3_RG_RX_ARDQ_SMT_EN_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ3), 1, B1_DQ3_RG_RX_ARDQ_SMT_EN_B1); - //@A60868, JMTR en + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_PHY2), 1, B0_PHY2_RG_RX_ARDQS_JM_EN_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_PHY2), 1, B1_PHY2_RG_RX_ARDQS_JM_EN_B1); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_JMETER), 1, MISC_JMETER_JMTR_EN); - //@A60868, End - //@A60868, JM_SEL = 1, JM_SEL = 0 for LPBK + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_PHY2), 1, B0_PHY2_RG_RX_ARDQS_JM_SEL_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_PHY2), 1, B1_PHY2_RG_RX_ARDQS_JM_SEL_B1); - //@A60868, End - //Enable MIOCK jitter meter mode ( RG_RX_MIOCK_JIT_EN=1) + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 1, MISC_DUTYSCAN1_RX_MIOCK_JIT_EN); - //Disable DQ eye scan (b'1), for counter clear + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 0, MISC_DUTYSCAN1_RX_EYE_SCAN_EN); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 0, MISC_DUTYSCAN1_DQSERRCNT_DIS); #if MIOCK_JMETER_CNT_WA - //Fix problem of diff between sample_cnt and ones_cnt. Should be removed after IPMV2.1 (except 60892) + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 0, MISC_DUTYSCAN1_EYESCAN_DQS_OPT); #endif @@ -10023,25 +9673,25 @@ static void DramcJmeterCalib(DRAMC_CTX_T *p, JMETER_T *pJmtrInfo, U16 u2JmDlySte for (ucdqs_dly = u2Jm_dly_start; ucdqs_dly < u2Jm_dly_end; ucdqs_dly += u2Jm_dly_step) { - //@A60868, Set CLK delay (RG_*_RX_ARDQS_JM_DLY_B*) + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B0_PHY2), ucdqs_dly, B0_PHY2_RG_RX_ARDQS_JM_DLY_B0); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_B1_PHY2), ucdqs_dly, B1_PHY2_RG_RX_ARDQS_JM_DLY_B1); - //@A60868, End - //Reset eye scan counters (reg_sw_rst): 1 to 0 + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 1, MISC_DUTYSCAN1_REG_SW_RST); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 0, MISC_DUTYSCAN1_REG_SW_RST); - //Enable DQ eye scan (b'1) + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 1, MISC_DUTYSCAN1_RX_EYE_SCAN_EN); - //2ns/sample, here we delay 1ms about 500 samples + mcDELAY_US(10); - //Disable DQ eye scan (b'1), for counter latch + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTYSCAN1), 0, MISC_DUTYSCAN1_RX_EYE_SCAN_EN); - //Read the counter values from registers (toggle_cnt*, dqs_err_cnt*); + u4sample_cnt = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTY_TOGGLE_CNT), MISC_DUTY_TOGGLE_CNT_TOGGLE_CNT); u4ones_cnt[0] = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTY_DQS0_ERR_CNT), MISC_DUTY_DQS0_ERR_CNT_DQS0_ERR_CNT); //u4ones_cnt[1] = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DUTY_DQS1_ERR_CNT), MISC_DUTY_DQS1_ERR_CNT_DQS1_ERR_CNT); @@ -10053,7 +9703,7 @@ static void DramcJmeterCalib(DRAMC_CTX_T *p, JMETER_T *pJmtrInfo, U16 u2JmDlySte } #endif - //change to boolean value + if (u4ones_cnt[0] < (u4sample_cnt / 2)) { fgcurrent_value = 0; @@ -10066,16 +9716,16 @@ static void DramcJmeterCalib(DRAMC_CTX_T *p, JMETER_T *pJmtrInfo, U16 u2JmDlySte if (ucsearch_state == 0xffff) { - //record initial value at the beginning + fginitial_value = fgcurrent_value; ucsearch_state = 0; } else { - // check if change value + if (fgcurrent_value != fginitial_value) { - // start of the period + fginitial_value = fgcurrent_value; pJmtrInfo->JmtrInfo[ucsearch_state].u1JmDelay = ucdqs_dly; pJmtrInfo->JmtrInfo[ucsearch_state].u1TransLevel = fgcurrent_value; @@ -10083,27 +9733,16 @@ static void DramcJmeterCalib(DRAMC_CTX_T *p, JMETER_T *pJmtrInfo, U16 u2JmDlySte ucsearch_state++; pJmtrInfo->u1TransCnt = ucsearch_state; if (ucsearch_state == CYCLE_1T) - break; // 1T early break; + break; } } } } #endif -//------------------------------------------------------------------------- -/** DramcMiockJmeter - * start MIOCK jitter meter. - * @param p Pointer of context created by DramcCtxCreate. - * @param block_no (U8): block 0 or 1. - * @retval status (DRAM_STATUS_T): DRAM_OK or DRAM_FAIL - */ -//------------------------------------------------------------------------- #ifdef ENABLE_MIOCK_JMETER -/* "picoseconds per delay cell" depends on Vcore only (frequency doesn't matter) - * 1. Retrieve current freq's vcore voltage using pmic API - * 2. Perform delay cell time calculation (Bypass if shuffle vcore value is the same as before) - */ + U16 GetVcoreDelayCellTime(DRAMC_CTX_T *p) { @@ -10125,7 +9764,7 @@ void Get_RX_DelayCell(DRAMC_CTX_T *p) #if SUPPORT_SAVE_TIME_FOR_CALIBRATION if(p->femmc_Ready == 1) { - return; //gHQALOG_RX_delay_cell_ps_075V is not used in fastk (Only needed in HQA report and eyescan log). + return; } #endif @@ -10146,27 +9785,19 @@ void Get_RX_DelayCell(DRAMC_CTX_T *p) break; } #else - // set vcore to RX used 0.75V - dramc_set_vcore_voltage(SEL_PREFIX_VMDDR); //set vmddr voltage to vcore to K RX delay cell + + dramc_set_vcore_voltage(SEL_PREFIX_VMDDR); #endif gHQALOG_RX_delay_cell_ps_075V = GetVcoreDelayCellTime(p); - // set vocre back + vSetVcoreByFreq(p); } #endif } #endif -//------------------------------------------------------------------------- -/** Dramc8PhaseCal - * start 8-Phase Calibration. - * @param p Pointer of context created by DramcCtxCreate. - * @param block_no (U8): block 0 or 1. - * @retval status (DRAM_STATUS_T): DRAM_OK or DRAM_FAIL - */ -//------------------------------------------------------------------------- DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) { @@ -10183,20 +9814,20 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) U8 backup_rank, u1RankIdx, u18PhDlyBackup = 0; U8 u1loop_cnt = 0, u1early_break_cnt = 5; - // Jmeter Scan + JMETER_T JmtrInfo; U8 u1JmtrPrintCnt = 0; U32 u4backup_broadcast= GetDramcBroadcast(); DRAM_STATUS_T eDRAMStatus = DRAM_OK; -#ifdef DUMP_INIT_RG_LOG_TO_DE //for FT dump 3733 dram_init.c +#ifdef DUMP_INIT_RG_LOG_TO_DE return DRAM_OK; #endif u1DqsienPI = 0x0; - // error handling + if (!p) { mcSHOW_ERR_MSG(("context NULL\n")); @@ -10237,12 +9868,12 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) (DRAMC_REG_ADDR(DDRPHY_REG_SHU_B1_DQ11)), (DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD11)), (DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL)), - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_PI_DLY)), // need porting to Jmeter - (DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_PI_DLY + DDRPHY_AO_RANK_OFFSET)), // need porting to Jmeter + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_PI_DLY)), + (DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_PI_DLY + DDRPHY_AO_RANK_OFFSET)), (DRAMC_REG_ADDR(DDRPHY_REG_MISC_JMETER)), - //(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2)), // for gating on/off backup/restore - //(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DVFSCTL2)), // for gating on/off backup/restore - (DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_STBCAL)), // for gating on/off backup/restore + //(DRAMC_REG_ADDR(DDRPHY_REG_MISC_STBCAL2)), + //(DRAMC_REG_ADDR(DDRPHY_REG_MISC_DVFSCTL2)), + (DRAMC_REG_ADDR(DDRPHY_REG_MISC_SHU_STBCAL)), #if 0 (DRAMC_REG_ADDR(DDRPHY_REG_B0_DLL_ARPI0)), (DRAMC_REG_ADDR(DDRPHY_REG_B1_DLL_ARPI0)), @@ -10267,7 +9898,7 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) memset(&JmtrInfo, 0, sizeof(JmtrInfo)); DramcBroadcastOnOff(DRAMC_BROADCAST_OFF); - //backup register value + DramcBackupRegisters(p, u4RegBackupAddress, sizeof(u4RegBackupAddress) / sizeof(U32)); DramcJmeterInit(p, FALSE); @@ -10302,13 +9933,12 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) mcSHOW_DBG_MSG2(("\n[Dramc8PhaseCal] 8-Phase SM_%d, 8PH_dly (%d~%d), DQSIEN PI = %d, 8PH_Dly = %d\n", u18Phase_SM, u18Ph_start, u18Ph_end, u1DqsienPI, u18PhDlyBackup)); - //to see 1T(H,L) or 1T(L,H) from delaycell=0 to 127 - //NOTE: Must set dual ranks for Rx path + for (u1RankIdx = RANK_0; u1RankIdx < p->support_rank_num; u1RankIdx++) { vSetRank(p, u1RankIdx); - // SHU_RK_B0_DQSIEN_PI_DLY_DQSIEN_PI_B0[6] no use (ignore) - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_PI_DLY), u1DqsienPI, SHU_RK_B0_DQSIEN_PI_DLY_DQSIEN_PI_B0); // for rank*_B0 + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_RK_B0_DQSIEN_PI_DLY), u1DqsienPI, SHU_RK_B0_DQSIEN_PI_DLY_DQSIEN_PI_B0); } vSetRank(p, backup_rank); @@ -10324,7 +9954,7 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) for (u1JmtrPrintCnt = 0; u1JmtrPrintCnt < JmtrInfo.u1TransCnt; u1JmtrPrintCnt++) { - if (JmtrInfo.JmtrInfo[u1JmtrPrintCnt].u1TransLevel == 1) // find the High Level + if (JmtrInfo.JmtrInfo[u1JmtrPrintCnt].u1TransLevel == 1) { ucdqs_dly = JmtrInfo.JmtrInfo[u1JmtrPrintCnt].u1JmDelay; @@ -10332,24 +9962,24 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) { u2R0 = ucdqs_dly; mcSHOW_DBG_MSG2(("R0 (H) = %d\n", u2R0)); - break; // break ucdqs_dly for loop + break; } else if (u18Phase_SM == DQS_8PH_DEGREE_180) { u2R180 = ucdqs_dly; if (u2R180 > u2R0) { - u2R = u2R0 + ((u2R180 - u2R0) >> 2); // u2R180 >= u2R0 for (u1R180 - u1R0)/4 for 180 degree. /2 for 90 degree + u2R = u2R0 + ((u2R180 - u2R0) >> 2); mcSHOW_DBG_MSG2(("R = %d, R180 (H) = %d\n", u2R, u2R180)); - break; // break ucdqs_dly for loop + break; } } else if (u18Phase_SM == DQS_8PH_DEGREE_45) { u2P = ucdqs_dly; - if (u2P > u2R0) // u2P ~= DQS_8PH_DEGREE_180 + if (u2P > u2R0) { - // Absolute to find min diff + if (u2R > u2P) s2Err_code = u2R - u2P; else @@ -10369,7 +9999,7 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) } else if (s2Err_code >= s2Err_code_min) { - // check early break for u18Ph_dly for loop + u1loop_cnt++; if (u1loop_cnt > u1early_break_cnt) u18Ph_dly_loop_break = 1; @@ -10377,7 +10007,7 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) mcSHOW_DBG_MSG2(("diff (P-R) = %d, min = %d, early break count = %d, R45 (H) = %d\n", s2Err_code, s2Err_code_min, u1loop_cnt, u2P)); - break; // if (s2Err_code == s2Err_code_min) for next u18Ph_dly + break; } } else @@ -10390,15 +10020,15 @@ DRAM_STATUS_T Dramc8PhaseCal(DRAMC_CTX_T *p) } } - // Error handing when not find transaction + if (JmtrInfo.u1TransCnt == u1JmtrPrintCnt) { - u18Ph_dly_final = u18PhDlyBackup; //rollback to init settings + u18Ph_dly_final = u18PhDlyBackup; eDRAMStatus = DRAM_FAIL; mcSHOW_ERR_MSG(("\n[Dramc8PhaseCal] 8-Phase SM_%d is fail (to Default) !!!\n", u18Phase_SM)); goto exit; } else if (u18Ph_dly_loop_break == 1) - break; // early break + break; } } @@ -10410,7 +10040,7 @@ exit: vIO32WriteFldAlign_All(DDRPHY_REG_SHU_B1_DQ1, u18Ph_dly_final, SHU_B1_DQ1_RG_ARPI_MIDPI_8PH_DLY_B1); vIO32WriteFldAlign_All(DDRPHY_REG_SHU_CA_CMD1, u18Ph_dly_final, SHU_CA_CMD1_RG_ARPI_MIDPI_8PH_DLY_CA); - //restore to orignal value + OECKCKE_Control(p, ENABLE); DramcRestoreRegisters(p, u4RegBackupAddress, sizeof(u4RegBackupAddress) / sizeof(U32)); @@ -10421,34 +10051,25 @@ exit: } #if SIMULATION_SW_IMPED -/* Impedance have a total of 19 steps, but the HW value mapping to hardware is 0~15, 29~31 -* This function adjusts passed value u1ImpVal by adjust step count "u1AdjStepCnt" -* After adjustment, if value is 1. Too large (val > 31) -> set to max 31 -* 2. Too small (val < 0) -> set to min 0 -* 3. Value is between 15 & 29, adjust accordingly ( 15 < value < 29 ) -* returns: Impedance value after adjustment -*/ + #if 0 static U32 SwImpedanceAdjust(U32 u4ImpVal, S8 s1StepCnt) { S32 S4ImpedanceTemp = (S32)u4ImpVal; - // Perform impedance value adjustment + S4ImpedanceTemp += s1StepCnt; - /* After adjustment, if value is 1. Too large (val > 31) -> set to max 31 - * 2. Too small (val < 0) -> set to min 0 - * 3. Value is between 15 & 29, adjust accordingly ( 15 < value < 29 ) - */ - if ((S4ImpedanceTemp > 15) && (S4ImpedanceTemp < 29)) //Value is between 15 & 29 ( 15 < value < 29) + + if ((S4ImpedanceTemp > 15) && (S4ImpedanceTemp < 29)) { S4ImpedanceTemp = S4ImpedanceTemp - 16 + 29; } - if (S4ImpedanceTemp > 31) //Value after adjustment too large -> set to max 31 + if (S4ImpedanceTemp > 31) { S4ImpedanceTemp = 31; } - else if (S4ImpedanceTemp < 0) //Value after adjustment too small -> set to min 0 + else if (S4ImpedanceTemp < 0) { S4ImpedanceTemp = 0; } @@ -10456,47 +10077,35 @@ static U32 SwImpedanceAdjust(U32 u4ImpVal, S8 s1StepCnt) return (U32)S4ImpedanceTemp; } #endif -//------------------------------------------------------------------------- -/** vImpCalVrefSel - * Set IMP_VREF_SEL for DRVP, DRVN, Run-time/Tracking - * (Refer to "IMPCAL Settings" document register "RG_RIMP_VREF_SEL" settings) - * @param p Pointer of context created by DramcCtxCreate. - * @param freq_region (enum): pass freq_region (IMP_LOW_FREQ/IMP_HIGH_FREQ) for LP4X - * @param u1ImpCalStage (U8): During DRVP, DRVN, run-time/tracking stages - * some vref_sel values are different - */ -//------------------------------------------------------------------------- -/* Definitions to make IMPCAL_VREF_SEL function more readable */ + #define IMPCAL_STAGE_DRVP 0 #define IMPCAL_STAGE_DRVN 1 #define IMPCAL_STAGE_ODTP 2 #define IMPCAL_STAGE_ODTN 3 #define IMPCAL_STAGE_TRACKING 4 -/* LP4X IMP_VREF_SEL w/o term ==== */ -#define IMP_TRACK_LP4X_LOWFREQ_VREF_SEL 0x37 // for <= DDR3733 -#define IMP_TRACK_LP4X_HIGHFREQ_VREF_SEL 0x3a // for > 3733 and Samsung NT-ODTN -/* LPDDR5 IMP_VREF_SEL w/o term ==== */ -#define IMP_TRACK_LP5_LOWFREQ_VREF_SEL 0x38 // for <= DDR3733 -#define IMP_TRACK_LP5_HIGHFREQ_VREF_SEL 0x3a // for > 3733 and Samsung NT-ODTN + +#define IMP_TRACK_LP4X_LOWFREQ_VREF_SEL 0x37 +#define IMP_TRACK_LP4X_HIGHFREQ_VREF_SEL 0x3a + +#define IMP_TRACK_LP5_LOWFREQ_VREF_SEL 0x38 +#define IMP_TRACK_LP5_HIGHFREQ_VREF_SEL 0x3a static const U8 ImpLP4VrefSel[IMP_VREF_MAX][IMP_DRV_MAX] = { - /* DRVP DRVN ODTP ODTN */ -/* IMP_LOW_FREQ */ {0x37, 0x33, 0x00, 0x37}, -/* IMP_HIGH_FREQ */ {0x3a, 0x33, 0x00, 0x3a}, -/* IMP_NT_ODTN */ {0x2a, 0x2a, 0x00, 0x3a} + + {0x37, 0x33, 0x00, 0x37}, + {0x3a, 0x33, 0x00, 0x3a}, + {0x2a, 0x2a, 0x00, 0x3a} }; static const U8 ImpLP5VrefSel[IMP_VREF_MAX][IMP_DRV_MAX] = { - /* DRVP DRVN ODTP ODTN */ -/* IMP_LOW_FREQ */ {0x38, 0x33, 0x00, 0x38}, -/* IMP_HIGH_FREQ */ {0x3a, 0x33, 0x00, 0x3a}, -/* IMP_NT_ODTN */ {0x2a, 0x2a, 0x00, 0x3a} + + {0x38, 0x33, 0x00, 0x38}, + {0x3a, 0x33, 0x00, 0x3a}, + {0x2a, 0x2a, 0x00, 0x3a} }; -/* Refer to "IMPCAL Settings" document register "RG_RIMP_VREF_SEL" settings */ -// @Maoauo: DRVP/ODTN for IMP tracking. But DRVN not support IMP tracking. (before La_fite) -// DRVP/DRVN/ODTN for IMP tracking after Pe_trus + static void vImpCalVrefSel(DRAMC_CTX_T *p, DRAMC_IMP_T efreq_region, U8 u1ImpCalStage) { U8 u1RegTmpValue = 0; @@ -10542,13 +10151,13 @@ static void vImpCalVrefSel(DRAMC_CTX_T *p, DRAMC_IMP_T efreq_region, U8 u1ImpCal break; } - // dbg msg after vref_sel selection + mcSHOW_DBG_MSG3(("[vImpCalVrefSel] IMP_VREF_SEL 0x%x, IMPCAL stage:%u, freq_region:%u\n", u1RegTmpValue, u1ImpCalStage, efreq_region)); - /* Set IMP_VREF_SEL register field's value */ + if (u1ImpCalStage == IMPCAL_STAGE_TRACKING) { - /* SEL_DVRP/ODTN shall diff by freq, value of them are equal */ + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD12), u1RegTmpValue, SHU_CA_CMD12_RG_RIMP_VREF_SEL_DRVP); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD12), u1RegTmpValue, SHU_CA_CMD12_RG_RIMP_VREF_SEL_ODTN); } else { @@ -10567,16 +10176,16 @@ void DramcSwImpedanceSaveRegister(DRAMC_CTX_T *p, U8 ca_freq_option, U8 dq_freq_ DramcBroadcastOnOff(DRAMC_BROADCAST_ON); - /* Save RIMP_VREF_SEL by shuffle. Will be broadcasted to ALL CH even if unused */ + vImpCalVrefSel(p, dq_freq_option, IMPCAL_STAGE_TRACKING); - //DQ + vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING1 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[dq_freq_option][DRVP], SHU_MISC_DRVING1_DQDRVP2) | P_Fld(gDramcImpedanceResult[dq_freq_option][DRVN], SHU_MISC_DRVING1_DQDRVN2)); vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING2 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[dq_freq_option][DRVP], SHU_MISC_DRVING2_DQDRVP1) | P_Fld(gDramcImpedanceResult[dq_freq_option][DRVN], SHU_MISC_DRVING2_DQDRVN1)); vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING3 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[dq_freq_option][ODTP], SHU_MISC_DRVING3_DQODTP2) | P_Fld(gDramcImpedanceResult[dq_freq_option][ODTN], SHU_MISC_DRVING3_DQODTN2)); vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING4 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[dq_freq_option][ODTP], SHU_MISC_DRVING4_DQODTP1) | P_Fld(gDramcImpedanceResult[dq_freq_option][ODTN], SHU_MISC_DRVING4_DQODTN1)); - //DQS + #if SUPPORT_HYNIX_RX_DQS_WEAK_PULL if (p->vendor_id == VENDOR_HYNIX) { U32 temp_value[4]; @@ -10599,33 +10208,18 @@ void DramcSwImpedanceSaveRegister(DRAMC_CTX_T *p, U8 ca_freq_option, U8 dq_freq_ vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING3 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[dq_freq_option][ODTP], SHU_MISC_DRVING3_DQSODTP) | P_Fld(gDramcImpedanceResult[dq_freq_option][ODTN], SHU_MISC_DRVING3_DQSODTN)); } - //CMD & CLK + vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING2 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[ca_freq_option][DRVP], SHU_MISC_DRVING2_CMDDRVP2) | P_Fld(gDramcImpedanceResult[ca_freq_option][DRVN], SHU_MISC_DRVING2_CMDDRVN2)); vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING2 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[ca_freq_option][DRVP], SHU_MISC_DRVING2_CMDDRVP1) | P_Fld(gDramcImpedanceResult[ca_freq_option][DRVN], SHU_MISC_DRVING2_CMDDRVN1)); vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING4 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[ca_freq_option][ODTP], SHU_MISC_DRVING4_CMDODTP2) | P_Fld(gDramcImpedanceResult[ca_freq_option][ODTN], SHU_MISC_DRVING4_CMDODTN2)); vIO32WriteFldMulti((DDRPHY_REG_SHU_MISC_DRVING4 + save_to_where * SHU_GRP_DDRPHY_OFFSET), P_Fld(gDramcImpedanceResult[ca_freq_option][ODTP], SHU_MISC_DRVING4_CMDODTP1) | P_Fld(gDramcImpedanceResult[ca_freq_option][ODTN], SHU_MISC_DRVING4_CMDODTN1)); - //RG_TX_*RCKE_DRVP/RG_TX_*RCKE_DRVN doesn't set, so set 0xA first - //@Maoauo confirm, RG no function - //vIO32WriteFldAlign((DDRPHY_SHU_CA_CMD11 + save_to_where * SHU_GRP_DDRPHY_OFFSET), gDramcImpedanceResult[ca_freq_option][DRVP], SHU_CA_CMD11_RG_TX_ARCKE_DRVP); - //vIO32WriteFldAlign((DDRPHY_SHU_CA_CMD11 + save_to_where * SHU_GRP_DDRPHY_OFFSET), gDramcImpedanceResult[ca_freq_option][DRVN], SHU_CA_CMD11_RG_TX_ARCKE_DRVN); - - //CKE - // CKE is full swing. - // LP4/LP4X set DRVP/DRVN as LP3's default value - // DRVP=8 -> 0xA for 868 by Alucary Chen - // DRVN=9 -> 0xA for 868 by Alucary Chen - //DRVP[4:0] = RG_TX_ARCMD_PU_PRE<1:0>, RG_TX_ARCLK_DRVN_PRE<2:0> for La_fite only - //@Darren-vIO32WriteFldAlign((DDRPHY_REG_SHU_CA_CMD3 + save_to_where * SHU_GRP_DDRPHY_OFFSET), (8>>3)&0x3, SHU_CA_CMD3_RG_TX_ARCMD_PU_PRE); //Darren need confirm - //@Darren-vIO32WriteFldAlign((DDRPHY_REG_SHU_CA_CMD0 + save_to_where * SHU_GRP_DDRPHY_OFFSET), 8&0x7, SHU_CA_CMD0_RG_TX_ARCLK_DRVN_PRE); //Darren need confirm - //DRVN[4:0] = RG_ARCMD_REV<12:8> - //@Darren-vIO32WriteFldAlign_All((DDRPHY_SHU_CA_DLL2 + save_to_where * SHU_GRP_DDRPHY_OFFSET), 9, SHU_CA_DLL2_RG_TX_ARCKE_DRVN_B0); - #if (fcFOR_CHIP_ID == fcA60868) // for 868 CS and CKE control together + + #if (fcFOR_CHIP_ID == fcA60868) vIO32WriteFldAlign((DDRPHY_REG_MISC_SHU_DRVING8 + save_to_where * SHU_GRP_DDRPHY_OFFSET), 0xA, MISC_SHU_DRVING8_CS_DRVP); vIO32WriteFldAlign((DDRPHY_REG_MISC_SHU_DRVING8 + save_to_where * SHU_GRP_DDRPHY_OFFSET), 0xA, MISC_SHU_DRVING8_CS_DRVN); #elif (fcFOR_CHIP_ID == fc8195) - // @Darren, confirm with ACD Alucary, - // MISC_SHU_DRVING8_CS_DRVP & MISC_SHU_DRVING8_CS_DRVN -> DA_TX_ARCKE_DRVP_C0[4:0] & DA_TX_ARCKE_DRVN_C0[4:0] + vIO32WriteFldAlign((DDRPHY_REG_MISC_SHU_DRVING8 + save_to_where * SHU_GRP_DDRPHY_OFFSET), 0xF, MISC_SHU_DRVING8_CS_DRVP); vIO32WriteFldAlign((DDRPHY_REG_MISC_SHU_DRVING8 + save_to_where * SHU_GRP_DDRPHY_OFFSET), 0x14, MISC_SHU_DRVING8_CS_DRVN); #endif @@ -10642,29 +10236,28 @@ static void Dramc_Hw_ImpedanceCal(DRAMC_CTX_T *p, DRAMC_IMP_T freq_region) vAutoRefreshSwitch(p, ENABLE); vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SHU_CONF0), 0, SHU_CONF0_PBREFEN); - for (u1DrvType = DRVP; u1DrvType < IMP_DRV_MAX; u1DrvType++) // Calibration sequence for DRVP, DRVN and ODTN + for (u1DrvType = DRVP; u1DrvType < IMP_DRV_MAX; u1DrvType++) { - if (u1DrvType == ODTP) // no use, skip ODTP + if (u1DrvType == ODTP) continue; - /* Set IMP_VREF_SEL value for DRVP/DRVN and ODTN */ + vImpCalVrefSel(p, freq_region, u1DrvType); } ImpedanceTracking_DisImpHw_Setting(p, DISABLE); - //IMPCALCNT should be bigger than 0x4 (set as minimum value to save calibration time) - //clock_period *IMPCAL_CHKCYCLE* 16 should be bigger than 200ns. + vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_MISC_IMPCAL1), P_Fld(4, SHU_MISC_IMPCAL1_IMPCALCNT) | P_Fld(1, SHU_MISC_IMPCAL1_IMPCAL_CHKCYCLE)); DramcImpedanceTrackingEnable(p); - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), 0, MISC_IMPCAL_IMPCAL_ECO_OPT); //No need to wait slave channel's handshake signal in calibration + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), 0, MISC_IMPCAL_IMPCAL_ECO_OPT); - mcDELAY_US(16); //Need to wait IMPCALCNT times of all-bank refresh + mcDELAY_US(16); u4DRVN_Result = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL_STATUS3), MISC_IMPCAL_STATUS3_DRVNDQ_SAVE_1); u4DRVP_Result = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL_STATUS3), MISC_IMPCAL_STATUS3_DRVPDQ_SAVE_1); u4ODTN_Result = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL_STATUS3), MISC_IMPCAL_STATUS3_ODTNDQ_SAVE_1); - //DRVP=DRVP_FINAL + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_MISC_IMPCAL1), u4DRVP_Result, SHU_MISC_IMPCAL1_IMPDRVP); vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_MISC_IMPCAL1), u4DRVN_Result, SHU_MISC_IMPCAL1_IMPDRVN); @@ -10687,8 +10280,8 @@ static U32 DramcSwImpCalResult(DRAMC_CTX_T *p, const char *drvType, U32 u4Fld) for (u4ImpxDrv = 0; u4ImpxDrv < 32; u4ImpxDrv++) { -#if 0 // for A60868 no need - if (u4ImpxDrv == 16) //0~15, 29~31 +#if 0 + if (u4ImpxDrv == 16) u4ImpxDrv = 29; #endif @@ -10697,14 +10290,14 @@ static U32 DramcSwImpCalResult(DRAMC_CTX_T *p, const char *drvType, U32 u4Fld) u4ImpCalResult = u4IO32ReadFldAlign((DDRPHY_REG_MISC_PHY_RGS_CMD), MISC_PHY_RGS_CMD_RGS_RIMPCALOUT); mcSHOW_DBG_MSG2(("OCD %s=%d ,CALOUT=%d\n", drvType, u4ImpxDrv, u4ImpCalResult)); - if (u4ImpCalResult == u4CheckImpChange)//first found + if (u4ImpCalResult == u4CheckImpChange) { mcSHOW_DBG_MSG2(("\nOCD %s calibration OK! %s=%d\n\n", drvType, drvType, u4ImpxDrv)); break; } } - if (u4ImpxDrv == 32) // Can't find SwImp drv results + if (u4ImpxDrv == 32) { u4ImpxDrv = 31; mcSHOW_DBG_MSG2(("\nOCD %s calibration FAIL! %s=%d\n\n", drvType, drvType, u4ImpxDrv)); @@ -10723,13 +10316,13 @@ static void Dramc_Sw_ImpedanceCal(DRAMC_CTX_T *p, DRAMC_IMP_T freq_region) vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), 1, MISC_IMPCAL_IMPCAL_CALI_EN); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_SHU_MISC_IMPCAL1), P_Fld(0, SHU_MISC_IMPCAL1_IMPDRVN) | P_Fld(0, SHU_MISC_IMPCAL1_IMPDRVP)); - //LP4X: ODTN/DRVN/DRVP calibration start - for (u1DrvType = DRVP; u1DrvType < IMP_DRV_MAX; u1DrvType++) // Calibration sequence for DRVP, DRVN and ODTN + + for (u1DrvType = DRVP; u1DrvType < IMP_DRV_MAX; u1DrvType++) { - if (u1DrvType == ODTP) // no use, skip ODTP + if (u1DrvType == ODTP) continue; - /* Set IMP_VREF_SEL value for DRVP/DRVN and ODTN */ + vImpCalVrefSel(p, freq_region, u1DrvType); switch (u1DrvType) @@ -10745,7 +10338,7 @@ static void Dramc_Sw_ImpedanceCal(DRAMC_CTX_T *p, DRAMC_IMP_T freq_region) case ODTN: drvStr = (u1DrvType == DRVN)? "DRVN" : "ODTN"; u1CALI_ENP = 0x0; - u1CALI_ENN = (u1DrvType == DRVN)? 0x0: 0x1; // 0x1 change to ODTN path + u1CALI_ENN = (u1DrvType == DRVN)? 0x0: 0x1; u4DrvFld = SHU_MISC_IMPCAL1_IMPDRVN; break; default: @@ -10753,18 +10346,16 @@ static void Dramc_Sw_ImpedanceCal(DRAMC_CTX_T *p, DRAMC_IMP_T freq_region) break; } - // @A60868 for DRVn/p and ODTn select - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), u1CALI_ENP, MISC_IMPCAL_IMPCAL_CALI_ENP); //MISC_IMP_CTRL1_RG_IMP_OCD_PUCMP_EN move to CALI_ENP - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), u1CALI_ENN, MISC_IMPCAL_IMPCAL_CALI_ENN); //MISC_IMP_CTRL1_RG_RIMP_ODT_EN move to CALI_ENN + + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), u1CALI_ENP, MISC_IMPCAL_IMPCAL_CALI_ENP); + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), u1CALI_ENN, MISC_IMPCAL_IMPCAL_CALI_ENN); mcSHOW_DBG_MSG2(("\n\n\tK %s\n", drvStr)); - //DRVP=DRVP_FINAL - vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_MISC_IMPCAL1), u4DRVP_Result, SHU_MISC_IMPCAL1_IMPDRVP); //PUCMP_EN move to CALI_ENP - //If RGS_TX_OCD_IMPCALOUTX=1 - //RG_IMPX_DRVN++; - //Else save RG_IMPX_DRVN value and assign to DRVN + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_MISC_IMPCAL1), u4DRVP_Result, SHU_MISC_IMPCAL1_IMPDRVP); + + u4SwImpCalResult = DramcSwImpCalResult(p, drvStr, u4DrvFld); switch (u1DrvType) @@ -10825,7 +10416,7 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi backup_broadcast = GetDramcBroadcast(); DramcBroadcastOnOff(DRAMC_BROADCAST_OFF); - //default set FAIL + vSetCalibrationResult(p, DRAM_CALIBRATION_SW_IMPEDANCE, DRAM_FAIL); #if VENDER_JV_LOG @@ -10836,18 +10427,17 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi mcSHOW_DBG_MSG(("[DramcImpedenceCal]\n")); - //Suspend: DA_RIMP_DMSUS=1 + vIO32WriteFldMulti_All(DDRPHY_REG_MISC_LP_CTRL, P_Fld(0x0, MISC_LP_CTRL_RG_ARDMSUS_10) | \ P_Fld(0x0, MISC_LP_CTRL_RG_ARDMSUS_10_LP_SEL) | \ P_Fld(0x0, MISC_LP_CTRL_RG_RIMP_DMSUS_10) | \ P_Fld(0x0, MISC_LP_CTRL_RG_RIMP_DMSUS_10_LP_SEL)); - //Disable IMP HW Tracking - //Hw Imp tracking disable for all channels Because SwImpCal will be K again when resume from DDR reserved mode + vIO32WriteFldAlign_All(DDRPHY_REG_MISC_IMPCAL, 0, MISC_IMPCAL_IMPCAL_HW); backup_channel = p->channel; vSetPHY2ChannelMapping(p, CHANNEL_A); - //Register backup + //u4BaklReg_DDRPHY_MISC_IMP_CTRL0 = u4IO32Read4B((DDRPHY_MISC_IMP_CTRL0)); //u4BaklReg_DDRPHY_MISC_IMP_CTRL1 = u4IO32Read4B((DDRPHY_MISC_IMP_CTRL1)); //u4BaklReg_DRAMC_REG_IMPCAL = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL)); @@ -10859,11 +10449,10 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi | P_Fld(1, DRAMC_PD_CTRL_DCMEN)); #endif - //RG_IMPCAL_VREF_SEL (now set in vImpCalVrefSel()) - //RG_IMPCAL_LP3_EN=0, RG_IMPCAL_LP4_EN=1 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMP_CTRL1), 0, MISC_IMP_CTRL1_RG_RIMP_PRE_EN); vIO32WriteFldMulti(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), P_Fld(0, MISC_IMPCAL_IMPCAL_CALI_ENN) | P_Fld(1, MISC_IMPCAL_IMPCAL_IMPPDP) | \ - P_Fld(1, MISC_IMPCAL_IMPCAL_IMPPDN)); //RG_RIMP_BIAS_EN and RG_RIMP_VREF_EN move to IMPPDP and IMPPDN + P_Fld(1, MISC_IMPCAL_IMPCAL_IMPPDN)); u1DDR4 = 1; @@ -10873,7 +10462,7 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi P_Fld(u1DDR4, MISC_IMP_CTRL1_RG_RIMP_DDR4_SEL)); mcDELAY_US(1); - //RIMP_DRV05 for LP4/5 + vIO32WriteFldAlign(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD12), u1Drv05, SHU_CA_CMD12_RG_RIMP_DRV05); #if IMPEDANCE_HW_CALIBRATION @@ -10881,21 +10470,15 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi #else Dramc_Sw_ImpedanceCal(p, freq_region); #endif - //Register Restore + DramcRestoreRegisters(p, u4RegBackupAddress, sizeof(u4RegBackupAddress) / sizeof(U32)); //vIO32Write4B(DRAMC_REG_ADDR(DDRPHY_REG_MISC_IMPCAL), u4BaklReg_DRAMC_REG_IMPCAL); //vIO32Write4B((DDRPHY_MISC_IMP_CTRL0), u4BaklReg_DDRPHY_MISC_IMP_CTRL0); //vIO32Write4B((DDRPHY_MISC_IMP_CTRL1), u4BaklReg_DDRPHY_MISC_IMP_CTRL1); -/*** default value if K fail - LP3: DRVP=8, DRVN=9 - LP4: DRVP=6, DRVN=9, ODTN=14 - LP4X(UT): DRVP=12, DRVN=9 - LP4X(T): DRVP=5, DRVN=9, ODTN=14 - LP4P: DRVP=8, DRVN=10 -***/ - #if 0//HYNIX_IMPX_ADJUST + + #if 0 if (u1Para) { u4ODTN_Result = ImpedanceAdjustment_Hynix(u4ODTN_Result, u1Para); @@ -10937,17 +10520,13 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi #endif #if 0 - //YingYu: only check for freq_region = 0 (un-term, DQ) + if (gDramcSwImpedanceResult[freq_region][DRVP] >= 31 && (freq_region == 0) ) { mcSHOW_DBG_MSG(("SLT_BIN2\n")); while (1); } #else - // Alucary @ 2019/8/21 - // freq_region == 0 - // DRVP 0x1~0x16 - // DRVN 10~23 - // ODTN 0x3~0x13 + if (freq_region==0) { if (!(gDramcImpedanceResult[freq_region][DRVP] >= 1 && gDramcImpedanceResult[freq_region][DRVP] <= 0x16) || @@ -10967,14 +10546,8 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi } } else - { // freq_region == 1 - // DRVP 1~24 @ 2020/4/7 - // 4266 VOH is K 395mV - // SS 130 LV DRVP 395mV will got 22 - // need add 2 for margin - // so spec change to 24 - // DRVN 10~30 - // ODTN 3~12 + { + if (!(gDramcImpedanceResult[freq_region][DRVP] >= 1 && gDramcImpedanceResult[freq_region][DRVP] <= 24) || !(gDramcImpedanceResult[freq_region][DRVN] >= 10 && gDramcImpedanceResult[freq_region][DRVN] <= 30) || !(gDramcImpedanceResult[freq_region][ODTN] >= 3 && gDramcImpedanceResult[freq_region][ODTN] <= 12)) { @@ -11018,7 +10591,7 @@ DRAM_STATUS_T DramcImpedanceCal(DRAMC_CTX_T *p, U8 u1Para, DRAMC_IMP_T freq_regi return DRAM_OK; } -#endif //SIMULATION_SW_IMPED +#endif #if ENABLE_WRITE_DBI || TX_K_DQM_WITH_WDBI void DramcWriteShiftMCKForWriteDBI(DRAMC_CTX_T *p, S8 iShiftMCK) @@ -11049,14 +10622,11 @@ void DramcWriteShiftMCKForWriteDBI(DRAMC_CTX_T *p, S8 iShiftMCK) #define CLOCK_PI_STEP 2 #endif -#define ClockDutyFailLowerBound 4500 // 45% -#define ClockDutyFailUpperBound 5500 // 55% -#define ClockDutyMiddleBound 5000 // 50% +#define ClockDutyFailLowerBound 4500 +#define ClockDutyFailUpperBound 5500 +#define ClockDutyMiddleBound 5000 + -/* -* duty form smallest to biggest -* 011111->011110->...->000001-->000000=100000->100001-->...->111111 -*/ static U8 DramcDutyDelayRGSettingConvert(DRAMC_CTX_T *p, S8 scDutyDelay, U8 *tDly) { @@ -11216,7 +10786,7 @@ void DramcNewDutyCalibration(DRAMC_CTX_T *p) U32 backup_DDRPHY_REG_SHU_B0_DQ13=0, backup_DDRPHY_REG_SHU_B1_DQ13=0, backup_DDRPHY_REG_SHU_CA_CMD13=0; #if(DQS_DUTY_SLT_CONDITION_TEST) - U16 u2TestCnt, u2FailCnt=0, u2TestCntTotal =20; //fra 400; + U16 u2TestCnt, u2FailCnt=0, u2TestCntTotal =20; U8 u1ByteIdx, u1PI_FB; U32 u4Variance; #endif @@ -11225,7 +10795,7 @@ void DramcNewDutyCalibration(DRAMC_CTX_T *p) u1backup_rank = u1GetRank(p); vSetRank(p, RANK_0); - //backup OE releated RG , must put at begin of duty function !! + backup_DDRPHY_REG_B0_DQ2 = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ2)); if (!isLP4_DSC) backup_DDRPHY_REG_B1_DQ2 = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ2)); @@ -11237,14 +10807,14 @@ void DramcNewDutyCalibration(DRAMC_CTX_T *p) else backup_DDRPHY_REG_SHU_CA_CMD13 = u4IO32Read4B(DRAMC_REG_ADDR(DDRPHY_REG_SHU_CA_CMD13)); - //default set fail + vSetCalibrationResult(p, DRAM_CALIBRATION_DUTY_SCAN, DRAM_FAIL); #if !FT_DSIM_USED #if DUTY_SCAN_V2_ONLY_K_HIGHEST_FREQ if (p->frequency == u2DFSGetHighestFreq(p)) #else - //TODO if(Get_PRE_MIOCK_JMETER_HQA_USED_flag()==0) + #endif #endif { @@ -11273,7 +10843,7 @@ void DramcNewDutyCalibration(DRAMC_CTX_T *p) } OECKCKE_Control(p, ENABLE); - //restore OE releated RG , must put at end of duty function !! + vIO32Write4B(DRAMC_REG_ADDR(DDRPHY_REG_B0_DQ2), backup_DDRPHY_REG_B0_DQ2); if (!isLP4_DSC) vIO32Write4B(DRAMC_REG_ADDR(DDRPHY_REG_B1_DQ2), backup_DDRPHY_REG_B1_DQ2); |