summaryrefslogtreecommitdiffstats
path: root/src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c
diff options
context:
space:
mode:
authorRyan Chuang <ryan.chuang@mediatek.corp-partner.google.com>2021-10-26 20:01:01 +0800
committerPatrick Georgi <pgeorgi@google.com>2021-11-01 15:57:11 +0000
commit39277554a43df5614cbadb9e2bd8f918d3554e1e (patch)
treea628583c38137bd540ab1cd154ec0e37421e1ad7 /src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c
parent19b3102910f813e71efaa61c86e683afd48899a1 (diff)
downloadcoreboot-39277554a43df5614cbadb9e2bd8f918d3554e1e.tar.gz
coreboot-39277554a43df5614cbadb9e2bd8f918d3554e1e.tar.bz2
coreboot-39277554a43df5614cbadb9e2bd8f918d3554e1e.zip
vc/mediatek/mt8195: Remove unused code and comments
Remove unused code and comment to align with the latest MTK memory reference code which is from MTK internal dram driver code without upstream. version: Ib59134533ced8de09d23dd9f347c934d315166e2 TEST=boot to kernel Signed-off-by: Ryan Chuang <ryan.chuang@mediatek.corp-partner.google.com> Change-Id: I95ab3cf8809ad22a341ceb7fd53a68e13fb0420d Reviewed-on: https://review.coreboot.org/c/coreboot/+/58635 Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.corp-partner.google.com> Reviewed-by: Yu-Ping Wu <yupingso@google.com> Reviewed-by: Hung-Te Lin <hungte@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c')
-rw-r--r--src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c563
1 files changed, 233 insertions, 330 deletions
diff --git a/src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c b/src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c
index 63384cf4f8d1..9f57ce4713fa 100644
--- a/src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c
+++ b/src/vendorcode/mediatek/mt8195/dramc/dramc_utility.c
@@ -68,14 +68,14 @@ void DramcBroadcastOnOff(U32 bOnOff)
#if (FOR_DV_SIMULATION_USED==0 && SW_CHANGE_FOR_SIMULATION==0)
#if (fcFOR_CHIP_ID == fcA60868)
- return; //disable broadcast in A60868
+ return;
#endif
#if __Petrus_TO_BE_PORTING__
U8 u1BroadcastStatus = 0;
- // INFRA_RSVD3[9:8] = protect_set_clr_mask
+
u1BroadcastStatus = (*((volatile unsigned int *)(INFRA_RSVD3)) >> 8) & 0x3;
- if (u1BroadcastStatus & 0x1) // Enable new infra access by Preloader
+ if (u1BroadcastStatus & 0x1)
{
if (bOnOff == DRAMC_BROADCAST_ON)
*((volatile unsigned int *)(DRAMC_WBR_SET)) = DRAMC_BROADCAST_SET;
@@ -170,7 +170,7 @@ void CheckDramcWBR(U32 u4address)
if (channel_num_auxadc > 2) {
channel_and_value = 0x3;
}
- #else //for channel number = 1 or 2
+ #else
channel_and_value = 0x1;
#endif
if ((((u4address - Channel_A_DRAMC_NAO_BASE_VIRTUAL) >> POS_BANK_NUM) & channel_and_value) != CHANNEL_A)
@@ -209,7 +209,7 @@ static U8 GetChannelInfoToConf(DRAMC_CTX_T *p)
emi_set = &g_default_emi_setting;
- u4value = (emi_set->EMI_CONA_VAL >> 8) & 0x3;//CONA 8,9th 0:1ch, 1:2ch, 2:4ch
+ u4value = (emi_set->EMI_CONA_VAL >> 8) & 0x3;
if (u4value == 0)
u1ch_num = CHANNEL_SINGLE;
@@ -267,48 +267,45 @@ void vSetFSPNumber(DRAMC_CTX_T *p)
static void setFreqGroup(DRAMC_CTX_T *p)
{
- /* Below listed conditions represent freqs that exist in ACTimingTable
- * -> Should cover freqGroup settings for all real freq values
- */
{
- if (p->frequency <= 200) // DDR400
+ if (p->frequency <= 200)
{
p->freqGroup = 200;
}
- else if (p->frequency <= 400) // DDR800
+ else if (p->frequency <= 400)
{
p->freqGroup = 400;
}
- else if (p->frequency <= 600) // DDR1200
+ else if (p->frequency <= 600)
{
p->freqGroup = 600;
}
- else if (p->frequency <= 800) // DDR1600
+ else if (p->frequency <= 800)
{
p->freqGroup = 800;
}
- else if (p->frequency <= 933) //DDR1866
+ else if (p->frequency <= 933)
{
p->freqGroup = 933;
}
- else if (p->frequency <= 1200) //DDR2400, DDR2280
+ else if (p->frequency <= 1200)
{
p->freqGroup = 1200;
}
- else if (p->frequency <= 1333) // DDR2667
+ else if (p->frequency <= 1333)
{
p->freqGroup = 1333;
}
- else if (p->frequency <= 1600) // DDR3200
+ else if (p->frequency <= 1600)
{
p->freqGroup = 1600;
}
- else if (p->frequency <= 1866) // DDR3733
+ else if (p->frequency <= 1866)
{
p->freqGroup = 1866;
}
- else // DDR4266
+ else
{
p->freqGroup = 2133;
}
@@ -328,7 +325,7 @@ U16 DDRPhyGetRealFreq(DRAMC_CTX_T *p)
{
U8 u1SRAMShuLevel = vGet_Current_SRAMIdx(p);
- /* The result may be used as divisor, so need to avoid 0 returned */
+
if(gddrphyfmeter_value[u1SRAMShuLevel])
{
return gddrphyfmeter_value[u1SRAMShuLevel];
@@ -341,28 +338,27 @@ U16 DDRPhyGetRealFreq(DRAMC_CTX_T *p)
#if __ETT__ || defined(SLT)
void GetPhyPllFrequency(DRAMC_CTX_T *p)
{
- //U8 u1ShuLevel = u4IO32ReadFldAlign(DRAMC_REG_SHUSTATUS, SHUSTATUS_SHUFFLE_LEVEL);
+
U8 u1ShuLevel = u4IO32ReadFldAlign(DDRPHY_REG_DVFS_STATUS, DVFS_STATUS_OTHER_SHU_GP);
U32 u4PLL5_ADDR = DDRPHY_REG_SHU_PHYPLL1 + SHU_GRP_DDRPHY_OFFSET * u1ShuLevel;
U32 u4PLL8_ADDR = DDRPHY_REG_SHU_PHYPLL2 + SHU_GRP_DDRPHY_OFFSET * u1ShuLevel;
U32 u4B0_DQ = DDRPHY_REG_SHU_B0_DQ1 + SHU_GRP_DDRPHY_OFFSET * u1ShuLevel;
U32 u4PLL3_ADDR = DDRPHY_REG_SHU_PHYPLL3 + SHU_GRP_DDRPHY_OFFSET * u1ShuLevel;
- //Darren-U32 u4PLL4 = DDRPHY_SHU_PLL4 + SHU_GRP_DDRPHY_OFFSET * u1ShuLevel; // for DDR4266
+
U32 u4B0_DQ6 = DDRPHY_REG_SHU_B0_DQ6 + SHU_GRP_DDRPHY_OFFSET * u1ShuLevel;
- /* VCOFreq = FREQ_XTAL x ((RG_RCLRPLL_SDM_PCW) / 2^(RG_*_RCLRPLL_PREDIV)) / 2^(RG_*_RCLRPLL_POSDIV) */
U32 u4SDM_PCW = u4IO32ReadFldAlign(u4PLL5_ADDR, SHU_PHYPLL1_RG_RPHYPLL_SDM_PCW);
U32 u4PREDIV = u4IO32ReadFldAlign(u4PLL8_ADDR, SHU_PHYPLL2_RG_RPHYPLL_PREDIV);
U32 u4POSDIV = u4IO32ReadFldAlign(u4PLL8_ADDR, SHU_PHYPLL2_RG_RPHYPLL_POSDIV);
U32 u4CKDIV4 = u4IO32ReadFldAlign(u4B0_DQ, SHU_B0_DQ1_RG_ARPI_MIDPI_CKDIV4_EN_B0);
U8 u1FBKSEL = u4IO32ReadFldAlign(u4PLL3_ADDR, SHU_PHYPLL3_RG_RPHYPLL_FBKSEL);
- //Darren-U16 u2CKMUL2 = u4IO32ReadFldAlign(u4PLL4, SHU_PLL4_RG_RPHYPLL_RESERVED);
+
U8 u1SopenDQ = u4IO32ReadFldAlign(u4B0_DQ6, SHU_B0_DQ6_RG_ARPI_SOPEN_EN_B0);
U8 u1OpenDQ = u4IO32ReadFldAlign(u4B0_DQ6, SHU_B0_DQ6_RG_ARPI_OPEN_EN_B0);
U32 u4VCOFreq = (((52>>u4PREDIV)*(u4SDM_PCW>>8))>>u4POSDIV) << u1FBKSEL;
U32 u4DataRate = u4VCOFreq>>u4CKDIV4;
- if ((u1SopenDQ == ENABLE)||(u1OpenDQ == ENABLE)) // for 1:4 mode DDR800 (3.2G/DIV4) and DDR400 (1.6G/DIV4)
+ if ((u1SopenDQ == ENABLE)||(u1OpenDQ == ENABLE))
u4DataRate >>= 2;
//mcSHOW_DBG_MSG(("PCW=0x%X, u4PREDIV=%d, u4POSDIV=%d, CKDIV4=%d, DataRate=%d\n", u4SDM_PCW, u4PREDIV, u4POSDIV, u4CKDIV4, u4DataRate));
@@ -420,19 +416,13 @@ DUTY_CALIBRATION_T Get_Duty_Calibration_Mode(DRAMC_CTX_T *p)
VREF_CALIBRATION_ENABLE_T Get_Vref_Calibration_OnOff(DRAMC_CTX_T *p)
{
#if FOR_DV_SIMULATION_USED
- return VREF_CALI_OFF; //@ tg add for simulation speed up
+ return VREF_CALI_OFF;
#else
return p->pDFSTable->vref_calibartion_enable;
#endif
}
-/* vGet_Dram_CBT_Mode
- * Due to current HW design (both ranks share the same set of ACTiming regs), mixed
- * mode LP4 now uses byte mode ACTiming settings. This means most calibration steps
- * should use byte mode code flow.
- * Note: The below items must have per-rank settings (Don't use this function)
- * 1. CBT training 2. TX tracking
- */
+
DRAM_CBT_MODE_T vGet_Dram_CBT_Mode(DRAMC_CTX_T *p)
{
if (p->support_rank_num == RANK_DUAL)
@@ -466,7 +456,7 @@ void vPrintCalibrationBasicInfo(DRAMC_CTX_T *p)
"fsp= %d, odt_onoff= %d, Byte mode= %d, DivMode= %d\n"
"===============================================================================\n",
p->dram_type,
- p->frequency /*DDRPhyFMeter()*/,
+ p->frequency,
p->channel,
p->rank,
p->dram_fsp,
@@ -641,9 +631,8 @@ void DDRPhyFreqSel(DRAMC_CTX_T *p, DRAM_PLL_FREQ_SEL_T sel)
if (p->dram_type == TYPE_LPDDR4P)
p->odt_onoff = ODT_OFF;
- setFreqGroup(p); /* Set p->freqGroup to support freqs not in ACTimingTable */
+ setFreqGroup(p);
- ///TODO: add DBI_onoff by condition
//p->DBI_onoff = p->odt_onoff;
}
@@ -672,45 +661,45 @@ U16 u2DFSGetHighestFreq(DRAMC_CTX_T * p)
U8 GetEyeScanEnable(DRAMC_CTX_T * p, U8 get_type)
{
#if ENABLE_EYESCAN_GRAPH
-#if (fcFOR_CHIP_ID == fcA60868) //need check unterm highest freq is saved at SRAM_SHU4??
- //CBT
+#if (fcFOR_CHIP_ID == fcA60868)
+
if (get_type == EYESCAN_TYPE_CBT)
- if (ENABLE_EYESCAN_CBT==1) return ENABLE; //TO DO :Temp Force open EYESCAN
+ if (ENABLE_EYESCAN_CBT==1) return ENABLE;
+
- //RX
if (get_type == EYESCAN_TYPE_RX)
- if (ENABLE_EYESCAN_RX==1) return ENABLE; //TO DO :Temp Force open EYESCAN
+ if (ENABLE_EYESCAN_RX==1) return ENABLE;
+
- //TX
if (get_type == EYESCAN_TYPE_TX)
- if (ENABLE_EYESCAN_TX==1) return ENABLE; //TO DO :Temp Force open EYESCAN
+ if (ENABLE_EYESCAN_TX==1) return ENABLE;
#else
- //CBT
+
if (get_type == EYESCAN_TYPE_CBT)
{
if (gCBT_EYE_Scan_flag==DISABLE) return DISABLE;
- if (gCBT_EYE_Scan_only_higheset_freq_flag == DISABLE) return ENABLE; //K All freq
- if (p->frequency == u2DFSGetHighestFreq(p)) return ENABLE; // K highest freq
- if (gEye_Scan_unterm_highest_flag==ENABLE && vGet_Current_SRAMIdx(p)==SRAM_SHU2) return ENABLE; // K unterm highest freq
+ if (gCBT_EYE_Scan_only_higheset_freq_flag == DISABLE) return ENABLE;
+ if (p->frequency == u2DFSGetHighestFreq(p)) return ENABLE;
+ if (gEye_Scan_unterm_highest_flag==ENABLE && vGet_Current_SRAMIdx(p)==SRAM_SHU2) return ENABLE;
}
- //RX
+
if (get_type == EYESCAN_TYPE_RX)
{
if (gRX_EYE_Scan_flag==DISABLE) return DISABLE;
- if (gRX_EYE_Scan_only_higheset_freq_flag == DISABLE) return ENABLE; //K All freq
- if (p->frequency == u2DFSGetHighestFreq(p)) return ENABLE; // K highest freq
- if (gEye_Scan_unterm_highest_flag==ENABLE && vGet_Current_SRAMIdx(p)==SRAM_SHU2) return ENABLE; // K unterm highest freq
+ if (gRX_EYE_Scan_only_higheset_freq_flag == DISABLE) return ENABLE;
+ if (p->frequency == u2DFSGetHighestFreq(p)) return ENABLE;
+ if (gEye_Scan_unterm_highest_flag==ENABLE && vGet_Current_SRAMIdx(p)==SRAM_SHU2) return ENABLE;
}
- //TX
+
if (get_type == EYESCAN_TYPE_TX)
{
if (gTX_EYE_Scan_flag==DISABLE) return DISABLE;
- if (gTX_EYE_Scan_only_higheset_freq_flag == DISABLE) return ENABLE; //K All freq
- if (p->frequency == u2DFSGetHighestFreq(p)) return ENABLE; // K highest freq
- if (gEye_Scan_unterm_highest_flag==ENABLE && vGet_Current_SRAMIdx(p)==SRAM_SHU2) return ENABLE; // K unterm highest freq
+ if (gTX_EYE_Scan_only_higheset_freq_flag == DISABLE) return ENABLE;
+ if (p->frequency == u2DFSGetHighestFreq(p)) return ENABLE;
+ if (gEye_Scan_unterm_highest_flag==ENABLE && vGet_Current_SRAMIdx(p)==SRAM_SHU2) return ENABLE;
}
#endif
@@ -721,14 +710,14 @@ U8 GetEyeScanEnable(DRAMC_CTX_T * p, U8 get_type)
void DramcWriteDBIOnOff(DRAMC_CTX_T *p, U8 onoff)
{
- // DRAMC Write-DBI On/Off
+
vIO32WriteFldAlign_All(DRAMC_REG_SHU_TX_SET0, onoff, SHU_TX_SET0_DBIWR);
mcSHOW_DBG_MSG2(("DramC Write-DBI %s\n", ((onoff == DBI_ON) ? "on" : "off")));
}
void DramcReadDBIOnOff(DRAMC_CTX_T *p, U8 onoff)
{
- // DRAMC Read-DBI On/Off
+
vIO32WriteFldAlign_All(DDRPHY_REG_SHU_B0_DQ7, onoff, SHU_B0_DQ7_R_DMDQMDBI_SHU_B0);
vIO32WriteFldAlign_All(DDRPHY_REG_SHU_B1_DQ7, onoff, SHU_B1_DQ7_R_DMDQMDBI_SHU_B1);
mcSHOW_DBG_MSG2(("DramC Read-DBI %s\n", ((onoff == DBI_ON) ? "on" : "off")));
@@ -741,7 +730,7 @@ void SetDramModeRegForReadDBIOnOff(DRAMC_CTX_T *p, U8 u1fsp, U8 onoff)
#endif
//mcSHOW_DBG_MSG(("--Fsp%d --\n", p->dram_fsp));
- //DRAM MR3[6] read-DBI On/Off
+
u1MR03Value[u1fsp] = ((u1MR03Value[u1fsp] & 0xbf) | (onoff << 6));
DramcModeRegWriteByRank(p, p->rank, 3, u1MR03Value[u1fsp]);
}
@@ -753,7 +742,7 @@ void SetDramModeRegForWriteDBIOnOff(DRAMC_CTX_T *p, U8 u1fsp, U8 onoff)
#if MRW_CHECK_ONLY
mcSHOW_MRW_MSG(("\n==[MR Dump] %s==\n", __func__));
#endif
- //DRAM MR3[7] write-DBI On/Off
+
u1MR03Value[u1fsp] = ((u1MR03Value[u1fsp] & 0x7F) | (onoff << 7));
DramcModeRegWriteByRank(p, p->rank, 3, u1MR03Value[u1fsp]);
}
@@ -775,7 +764,7 @@ static void AutoRefreshCKEOff(DRAMC_CTX_T *p)
mcDELAY_US(1);
- //restore broadcast on/off
+
DramcBroadcastOnOff(u4backup_broadcast);
}
#endif
@@ -796,17 +785,17 @@ void CKEFixOnOff(DRAMC_CTX_T *p, U8 u1RankIdx, CKE_FIX_OPTION option, CHANNEL_RA
{
U8 u1CKEOn, u1CKEOff;
- if (option == CKE_DYNAMIC) //if CKE is dynamic, set both CKE fix On and Off as 0
- { //After CKE FIX on/off, CKE should be returned to dynamic (control by HW)
+ if (option == CKE_DYNAMIC)
+ {
u1CKEOn = u1CKEOff = 0;
}
- else //if CKE fix on is set as 1, CKE fix off should also be set as 0; vice versa
+ else
{
u1CKEOn = option;
u1CKEOff = (1 - option);
}
- if (WriteChannelNUM == TO_ALL_CHANNEL) //write register to all channel
+ if (WriteChannelNUM == TO_ALL_CHANNEL)
{
if((u1RankIdx == RANK_0)||(u1RankIdx == TO_ALL_RANK))
{
@@ -841,31 +830,23 @@ void vAutoRefreshSwitch(DRAMC_CTX_T *p, U8 option)
{
if (option == ENABLE)
{
- //enable autorefresh
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_REFCTRL0), 0, REFCTRL0_REFDIS); //REFDIS=0, enable auto refresh
+
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_REFCTRL0), 0, REFCTRL0_REFDIS);
}
- else // DISABLE
+ else
{
- //disable autorefresh
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_REFCTRL0), 1, REFCTRL0_REFDIS); //REFDIS=1, disable auto refresh
- //because HW will actually disable autorefresh after refresh_queue empty, so we need to wait quene empty.
- mcDELAY_US(u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_MISC_STATUSA), MISC_STATUSA_REFRESH_QUEUE_CNT) * 4); //wait refresh_queue_cnt * 3.9us
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_REFCTRL0), 1, REFCTRL0_REFDIS);
+
+
+ mcDELAY_US(u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_MISC_STATUSA), MISC_STATUSA_REFRESH_QUEUE_CNT) * 4);
}
}
-//-------------------------------------------------------------------------
-/** vCKERankCtrl
- * Control CKE toggle mode (toggle both ranks 1. at the same time (CKE_RANK_DEPENDENT) 2. individually (CKE_RANK_INDEPENDENT))
- * Note: Sets CKE toggle mode for all channels
- * @param p Pointer of context created by DramcCtxCreate.
- * @param CKECtrlMode Indicates
- */
-//-------------------------------------------------------------------------
void vCKERankCtrl(DRAMC_CTX_T *p, CKE_CTRL_MODE_T CKECtrlMode)
{
- /* Struct indicating all register fields mentioned in "multi rank CKE control" */
+
typedef struct
{
U8 u1CKE2Rank: Fld_wid(RKCFG_CKE2RANK);
@@ -884,7 +865,7 @@ void vCKERankCtrl(DRAMC_CTX_T *p, CKE_CTRL_MODE_T CKECtrlMode)
U8 u1ClkWiTrfc: Fld_wid(ACTIMING_CTRL_CLKWITRFC);
} CKE_CTRL_T;
- /* CKE_Rank dependent/independent mode register setting values */
+
CKE_CTRL_T CKE_Mode, CKE_Rank_Independent = { .u1CKE2Rank = 0, .u1CKE2Rank_Opt3 = 0, .u1CKE2Rank_Opt2 = 1,
.u1CKE2Rank_Opt5 = 0, .u1CKE2Rank_Opt6 = 0, .u1CKE2Rank_Opt7 = 1, .u1CKE2Rank_Opt8 = 0,
.u1CKETimer_Sel = 0, .u1FASTWake = 1, .u1FASTWake2 = 1, .u1FastWake_Sel = 1, .u1CKEWake_Sel = 0, .u1ClkWiTrfc = 0
@@ -893,10 +874,10 @@ void vCKERankCtrl(DRAMC_CTX_T *p, CKE_CTRL_MODE_T CKECtrlMode)
.u1CKE2Rank_Opt5 = 0, .u1CKE2Rank_Opt6 = 0, .u1CKE2Rank_Opt7 = 0, .u1CKE2Rank_Opt8 = 0, .u1CKETimer_Sel = 1,
.u1FASTWake = 1, .u1FASTWake2 = 0, .u1FastWake_Sel = 0, .u1CKEWake_Sel = 0, .u1ClkWiTrfc = 0
};
- //Select CKE control mode
+
CKE_Mode = (CKECtrlMode == CKE_RANK_INDEPENDENT)? CKE_Rank_Independent: CKE_Rank_Dependent;
- //Apply CKE control mode register settings
+
vIO32WriteFldAlign_All(DRAMC_REG_RKCFG, CKE_Mode.u1CKE2Rank, RKCFG_CKE2RANK);
vIO32WriteFldMulti_All(DRAMC_REG_CKECTRL, P_Fld(CKE_Mode.u1CKE2Rank_Opt3, CKECTRL_CKE2RANK_OPT3)
| P_Fld(CKE_Mode.u1CKE2Rank_Opt, CKECTRL_CKE2RANK_OPT)
@@ -915,7 +896,7 @@ void vCKERankCtrl(DRAMC_CTX_T *p, CKE_CTRL_MODE_T CKECtrlMode)
}
-#define MAX_CMP_CPT_WAIT_LOOP 100000 // max loop
+#define MAX_CMP_CPT_WAIT_LOOP 100000
static void DramcSetRWOFOEN(DRAMC_CTX_T *p, U8 u1onoff)
{
U32 u4loop_count = 0;
@@ -950,7 +931,7 @@ static void DramcSetRWOFOEN(DRAMC_CTX_T *p, U8 u1onoff)
//}
-static void DramcEngine2SetUiShift(DRAMC_CTX_T *p, U8 option)//UI shift function
+static void DramcEngine2SetUiShift(DRAMC_CTX_T *p, U8 option)
{
if(option == ENABLE)
{
@@ -974,47 +955,34 @@ static void DramcEngine2SetUiShift(DRAMC_CTX_T *p, U8 option)//UI shift function
void DramcSetRankEngine2(DRAMC_CTX_T *p, U8 u1RankSel)
{
- //LPDDR2_3_ADRDECEN_TARKMODE =0, always rank0
- /* ADRDECEN_TARKMODE: rank input selection
- * 1'b1 select CTO_AGENT1_RANK, 1'b0 rank by address decode
- */
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3), 1, TEST2_A3_ADRDECEN_TARKMODE);
- // DUMMY_TESTAGENTRKSEL =0, select rank according to CATRAIN_TESTAGENTRK
- /* TESTAGENTRKSEL: Test agent access rank mode selection
- * 2'b00: rank selection by TESTAGENTRK, 2'b01: rank selection by CTO_AGENT_1_BK_ADR[0]
- * 2'b10: rank selection by CTO_AGENT1_COL_ADR[3], 2'b11: rank selection by CTO_AGENT1_COL_ADR[4]
- */
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4), 0, TEST2_A4_TESTAGENTRKSEL);
- //CATRAIN_TESTAGENTRK = u1RankSel
- /* TESTAGENTRK: Specify test agent rank
- * 2'b00 rank 0, 2'b01 rank 1, 2'b10 rank 2
- */
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4), u1RankSel, TEST2_A4_TESTAGENTRK);
}
-void DramcEngine2SetPat(DRAMC_CTX_T *p, U8 u1TestPat, U8 u1LoopCnt, U8 u1Len1Flag, U8 u1EnableUiShift) //u1LoopCnt is related to rank
+void DramcEngine2SetPat(DRAMC_CTX_T *p, U8 u1TestPat, U8 u1LoopCnt, U8 u1Len1Flag, U8 u1EnableUiShift)
{
- if ((u1TestPat == TEST_XTALK_PATTERN) || (u1TestPat == TEST_SSOXTALK_PATTERN)) //xtalk or SSO+XTALK
+ if ((u1TestPat == TEST_XTALK_PATTERN) || (u1TestPat == TEST_SSOXTALK_PATTERN))
{
- //TEST_REQ_LEN1=1 is new feature, hope to make dq bus continously.
- //but DV simulation will got problem of compare err
- //so go back to use old way
- //TEST_REQ_LEN1=0, R_DMRWOFOEN=1
+
if (u1Len1Flag != 0)
{
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
- P_Fld(1, TEST2_A4_TEST_REQ_LEN1)); //test agent 2 with cmd length = 0, LEN1 of 256bits data
- DramcSetRWOFOEN(p, 0); //@IPM will fix for LEN1=1 issue
+ P_Fld(1, TEST2_A4_TEST_REQ_LEN1));
+ DramcSetRWOFOEN(p, 0);
}
else
{
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
- P_Fld(0, TEST2_A4_TEST_REQ_LEN1)); //test agent 2 with cmd length = 0
+ P_Fld(0, TEST2_A4_TEST_REQ_LEN1));
DramcSetRWOFOEN(p, 1);
}
@@ -1023,40 +991,40 @@ void DramcEngine2SetPat(DRAMC_CTX_T *p, U8 u1TestPat, U8 u1LoopCnt, U8 u1Len1Fla
P_Fld(0, TEST2_A3_HFIDPAT) |
P_Fld(0, TEST2_A3_TEST_AID_EN) |
P_Fld(0, TEST2_A3_TESTAUDPAT) |
- P_Fld(u1LoopCnt, TEST2_A3_TESTCNT)); //dont use audio pattern
+ P_Fld(u1LoopCnt, TEST2_A3_TESTCNT));
if (u1TestPat == TEST_SSOXTALK_PATTERN)
{
- //set addr 0x48[16] to 1, TESTXTALKPAT = 1
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
P_Fld(1, TEST2_A4_TESTXTALKPAT) |
P_Fld(0, TEST2_A4_TESTAUDMODE) |
- P_Fld(0, TEST2_A4_TESTAUDBITINV)); //use XTALK pattern, dont use audio pattern
+ P_Fld(0, TEST2_A4_TESTAUDBITINV));
+
- //R_DMTESTSSOPAT=0, R_DMTESTSSOXTALKPAT=0
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
P_Fld(1, TEST2_A4_TESTSSOPAT) |
- P_Fld(0, TEST2_A4_TESTSSOXTALKPAT)); //dont use sso, sso+xtalk pattern
+ P_Fld(0, TEST2_A4_TESTSSOXTALKPAT));
}
- else //select XTALK pattern
+ else
{
- //set addr 0x48[16] to 1, TESTXTALKPAT = 1
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
P_Fld(1, TEST2_A4_TESTXTALKPAT) |
P_Fld(0, TEST2_A4_TESTAUDMODE) |
- P_Fld(0, TEST2_A4_TESTAUDBITINV)); //use XTALK pattern, dont use audio pattern
+ P_Fld(0, TEST2_A4_TESTAUDBITINV));
+
- //R_DMTESTSSOPAT=0, R_DMTESTSSOXTALKPAT=0
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
P_Fld(0, TEST2_A4_TESTSSOPAT) |
- P_Fld(0, TEST2_A4_TESTSSOXTALKPAT)); //dont use sso, sso+xtalk pattern
+ P_Fld(0, TEST2_A4_TESTSSOXTALKPAT));
}
}
- else if (u1TestPat == TEST_AUDIO_PATTERN) //AUDIO
+ else if (u1TestPat == TEST_AUDIO_PATTERN)
{
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
- P_Fld(0, TEST2_A4_TEST_REQ_LEN1)); //test agent 2 with cmd length = 0
- // set AUDINIT=0x11 AUDINC=0x0d AUDBITINV=1 AUDMODE=1(1:read only(address fix), 0: write/read address change)
+ P_Fld(0, TEST2_A4_TEST_REQ_LEN1));
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
P_Fld(0x00000011, TEST2_A4_TESTAUDINIT) |
P_Fld(0x0000000d, TEST2_A4_TESTAUDINC) |
@@ -1064,7 +1032,7 @@ void DramcEngine2SetPat(DRAMC_CTX_T *p, U8 u1TestPat, U8 u1LoopCnt, U8 u1Len1Fla
P_Fld(0, TEST2_A4_TESTAUDMODE) |
P_Fld(1, TEST2_A4_TESTAUDBITINV));
- // set addr 0x044 [7] to 1 ,select audio pattern
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(0, TEST2_A3_AUTO_GEN_PAT) |
P_Fld(0, TEST2_A3_HFIDPAT) |
@@ -1072,7 +1040,7 @@ void DramcEngine2SetPat(DRAMC_CTX_T *p, U8 u1TestPat, U8 u1LoopCnt, U8 u1Len1Fla
P_Fld(1, TEST2_A3_TESTAUDPAT) |
P_Fld(u1LoopCnt, TEST2_A3_TESTCNT));
}
- else if (u1TestPat == TEST_WORST_SI_PATTERN) //TEST2_OFF > 'h56
+ else if (u1TestPat == TEST_WORST_SI_PATTERN)
{
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
P_Fld(u1Len1Flag, TEST2_A4_TEST_REQ_LEN1)|
@@ -1088,12 +1056,12 @@ void DramcEngine2SetPat(DRAMC_CTX_T *p, U8 u1TestPat, U8 u1LoopCnt, U8 u1Len1Fla
P_Fld(1, TEST2_A3_TEST_AID_EN) |
P_Fld(u1LoopCnt, TEST2_A3_TESTCNT)
);
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A2), 0x56, TEST2_A2_TEST2_OFF);//Set to min value to save time;
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A2), 0x56, TEST2_A2_TEST2_OFF);
}
- else //ISI
+ else
{
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
- P_Fld(0, TEST2_A4_TEST_REQ_LEN1)); //test agent 2 with cmd length = 0
+ P_Fld(0, TEST2_A4_TEST_REQ_LEN1));
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(0, TEST2_A3_AUTO_GEN_PAT) |
@@ -1104,16 +1072,16 @@ void DramcEngine2SetPat(DRAMC_CTX_T *p, U8 u1TestPat, U8 u1LoopCnt, U8 u1Len1Fla
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4), 0, TEST2_A4_TESTXTALKPAT);
}
- DramcEngine2SetUiShift(p, u1EnableUiShift); //Enalbe/Disable UI shift
+ DramcEngine2SetUiShift(p, u1EnableUiShift);
}
-#define CMP_CPT_POLLING_PERIOD 1 // timeout for TE2: (CMP_CPT_POLLING_PERIOD X MAX_CMP_CPT_WAIT_LOOP)
-#define MAX_CMP_CPT_WAIT_LOOP 100000 // max loop
+#define CMP_CPT_POLLING_PERIOD 1
+#define MAX_CMP_CPT_WAIT_LOOP 100000
static void DramcEngine2CheckComplete(DRAMC_CTX_T *p, U8 u1status)
{
U32 u4loop_count = 0;
U32 u4Ta2_loop_count = 0;
- U32 u4ShiftUiFlag = 0;//Use TEST_WORST_SI_PATTERN_UI_SHIFT
+ U32 u4ShiftUiFlag = 0;
while ((u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) & u1status) != u1status)
{
@@ -1125,7 +1093,7 @@ static void DramcEngine2CheckComplete(DRAMC_CTX_T *p, U8 u1status)
}
else if (u4loop_count > MAX_CMP_CPT_WAIT_LOOP)
{
- /*TINFO="fcWAVEFORM_MEASURE_A %d: time out\n", u4loop_count*/
+
mcSHOW_ERR_MSG(("fcWAVEFORM_MEASURE_A %d :time out, [22:20]=0x%x\n", u4loop_count, u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT), TESTRPT_TESTSTAT)));
//mcFPRINTF((fp_A60501, "fcWAVEFORM_MEASURE_A %d: time out\n", u4loop_count));
@@ -1136,7 +1104,7 @@ static void DramcEngine2CheckComplete(DRAMC_CTX_T *p, U8 u1status)
u4loop_count = 0;
u4ShiftUiFlag = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3), TEST2_A3_TEST2_PAT_SHIFT);
- if(u4ShiftUiFlag)//Use TEST_WORST_SI_PATTERN_UI_SHIFT
+ if(u4ShiftUiFlag)
{
while ((u4Ta2_loop_count = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TEST_LOOP_CNT))) != 8)
{
@@ -1154,23 +1122,23 @@ static U32 DramcEngine2Compare(DRAMC_CTX_T *p, DRAM_TE_OP_T wr)
{
U32 u4result = 0xffffffff;
U32 u4loopcount;
- U8 u1status = 1; //RK0
+ U8 u1status = 1;
U32 u4ShiftUiFlag = 0;
u4loopcount = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3), TEST2_A3_TESTCNT);
if (u4loopcount == 1)
- u1status = 3; //RK0/1
+ u1status = 3;
u4ShiftUiFlag = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3), TEST2_A3_TEST2_PAT_SHIFT);
if (wr == TE_OP_WRITE_READ_CHECK)
{
- if(!u4ShiftUiFlag)//Could not use while UI shift is open
+ if(!u4ShiftUiFlag)
{
- // read data compare ready check
+
DramcEngine2CheckComplete(p, u1status);
- // disable write
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(0, TEST2_A3_TEST2W) |
P_Fld(0, TEST2_A3_TEST2R) |
@@ -1178,7 +1146,7 @@ static U32 DramcEngine2Compare(DRAMC_CTX_T *p, DRAM_TE_OP_T wr)
mcDELAY_US(1);
- // enable read
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(0, TEST2_A3_TEST2W) |
P_Fld(1, TEST2_A3_TEST2R) |
@@ -1186,49 +1154,31 @@ static U32 DramcEngine2Compare(DRAMC_CTX_T *p, DRAM_TE_OP_T wr)
}
}
- // 5
- // read data compare ready check
+
DramcEngine2CheckComplete(p, u1status);
- // delay 10ns after ready check from DE suggestion (1ms here)
//mcDELAY_US(1);
- u4result = (u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) >> 4) & u1status; //CMP_ERR_RK0/1
+ u4result = (u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) >> 4) & u1status;
return u4result;
}
-//-------------------------------------------------------------------------
-/** DramcEngine2
- * start the self test engine 2 inside dramc to test dram w/r.
- * @param p Pointer of context created by DramcCtxCreate.
- * @param wr (DRAM_TE_OP_T): TE operation
- * @param test2_1 (U32): 28bits,base address[27:0].
- * @param test2_2 (U32): 28bits,offset address[27:0]. (unit is 16-byte, i.e: 0x100 is 0x1000).
- * @param loopforever (S16): 0 read\write one time ,then exit
- * >0 enable eingie2, after "loopforever" second ,write log and exit
- * -1 loop forever to read\write, every "period" seconds ,check result ,only when we find error,write log and exit
- * -2 loop forever to read\write, every "period" seconds ,write log ,only when we find error,write log and exit
- * -3 just enable loop forever ,then exit
- * @param period (U8): it is valid only when loopforever <0; period should greater than 0
- * @param u1LoopCnt (U8): test loop number of test agent2 loop number =2^(u1LoopCnt) ,0 one time
- * @retval status (U32): return the value of DM_CMP_ERR ,0 is ok ,others mean error
- */
-//-------------------------------------------------------------------------
+
static U32 uiReg0D0h;
DRAM_STATUS_T DramcEngine2Init(DRAMC_CTX_T *p, U32 test2_1, U32 test2_2, U8 u1TestPat, U8 u1LoopCnt, U8 u1EnableUiShift)
{
U8 u1Len1Flag;
- // error handling
+
if (!p)
{
mcSHOW_ERR_MSG(("context is NULL\n"));
return DRAM_FAIL;
}
- // check loop number validness
-// if ((u1LoopCnt > 15) || (u1LoopCnt < 0)) // U8 >=0 always.
+
+// if ((u1LoopCnt > 15) || (u1LoopCnt < 0))
if (u1LoopCnt > 15)
{
mcSHOW_ERR_MSG(("wrong param: u1LoopCnt > 15\n"));
@@ -1247,31 +1197,21 @@ DRAM_STATUS_T DramcEngine2Init(DRAMC_CTX_T *p, U32 test2_1, U32 test2_2, U8 u1Te
P_Fld(0, DUMMY_RD_DUMMY_RD_EN) |
P_Fld(0, DUMMY_RD_SREF_DMYRD_EN) |
P_Fld(0, DUMMY_RD_DMY_RD_DBG) |
- P_Fld(0, DUMMY_RD_DMY_WR_DBG)); //must close dummy read when do test agent
+ P_Fld(0, DUMMY_RD_DMY_WR_DBG));
- //fixme-zj vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TESTCHIP_DMA1), 0, TESTCHIP_DMA1_DMA_LP4MATAB_OPT);
- // disable self test engine1 and self test engine2
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(0, TEST2_A3_TEST2W) |
P_Fld(0, TEST2_A3_TEST2R) |
P_Fld(0, TEST2_A3_TEST1));
- // 1.set pattern ,base address ,offset address
- // 2.select ISI pattern or audio pattern or xtalk pattern
- // 3.set loop number
- // 4.enable read or write
- // 5.loop to check DM_CMP_CPT
- // 6.return CMP_ERR
- // currently only implement ucengine_status = 1, others are left for future extension
- // 1
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A0),
P_Fld(test2_1 >> 24, TEST2_A0_TEST2_PAT0) |
P_Fld(test2_2 >> 24, TEST2_A0_TEST2_PAT1));
{
- // LP4 TA2 base: 0x10000. It's only TBA constrain, but not HW.
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1),
(test2_1 + 0x10000) & 0x00ffffff, RK_TEST2_A1_TEST2_BASE);
}
@@ -1279,8 +1219,7 @@ DRAM_STATUS_T DramcEngine2Init(DRAMC_CTX_T *p, U32 test2_1, U32 test2_2, U8 u1Te
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A2),
test2_2 & 0x00ffffff, TEST2_A2_TEST2_OFF);
- // 2 & 3
- // (TESTXTALKPAT, TESTAUDPAT) = 00 (ISI), 01 (AUD), 10 (XTALK), 11 (UNKNOWN)
+
DramcEngine2SetPat(p, u1TestPat, u1LoopCnt, u1Len1Flag, u1EnableUiShift);
return DRAM_OK;
@@ -1291,16 +1230,16 @@ U32 DramcEngine2Run(DRAMC_CTX_T *p, DRAM_TE_OP_T wr, U8 u1TestPat)
{
U32 u4result = 0xffffffff;
- // 4
+
if (wr == TE_OP_READ_CHECK)
{
if ((u1TestPat == 1) || (u1TestPat == 2))
{
- //if audio pattern, enable read only (disable write after read), AUDMODE=0x48[15]=0
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4), 0, TEST2_A4_TESTAUDMODE);
}
- // enable read, 0x008[31:29]
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(0, TEST2_A3_TEST2W) |
P_Fld(1, TEST2_A3_TEST2R) |
@@ -1308,7 +1247,7 @@ U32 DramcEngine2Run(DRAMC_CTX_T *p, DRAM_TE_OP_T wr, U8 u1TestPat)
}
else if (wr == TE_OP_WRITE_READ_CHECK)
{
- // enable write
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(1, TEST2_A3_TEST2W) |
P_Fld(0, TEST2_A3_TEST2R) |
@@ -1316,16 +1255,13 @@ U32 DramcEngine2Run(DRAMC_CTX_T *p, DRAM_TE_OP_T wr, U8 u1TestPat)
}
DramcEngine2Compare(p, wr);
- // delay 10ns after ready check from DE suggestion (1ms here)
+
mcDELAY_US(1);
- // 6
- // return CMP_ERR, 0 is ok ,others are fail,diable test2w or test2r
- // get result
- // or all result
+
u4result = (u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_CMP_ERR)));
- // disable read
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3),
P_Fld(0, TEST2_A3_TEST2W) |
P_Fld(0, TEST2_A3_TEST2R) |
@@ -1337,13 +1273,12 @@ U32 DramcEngine2Run(DRAMC_CTX_T *p, DRAM_TE_OP_T wr, U8 u1TestPat)
void DramcEngine2End(DRAMC_CTX_T *p)
{
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4),
- P_Fld(0, TEST2_A4_TEST_REQ_LEN1)); //test agent 2 with cmd length = 0
+ P_Fld(0, TEST2_A4_TEST_REQ_LEN1));
DramcSetRWOFOEN(p, 1);
vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_DUMMY_RD), uiReg0D0h);
}
#if 0
-// Full set of usage test engine 2, including of DramcEngine2Init->DramcEngine2Run->DramcEngine2End
-// if you don't care the performance, and just for convinent, you may use this API (TestEngineCompare)
+
static U32 TestEngineCompare(DRAMC_CTX_T *p)
{
U8 jj;
@@ -1378,13 +1313,12 @@ static U32 TestEngineCompare(DRAMC_CTX_T *p)
#if (fcFOR_CHIP_ID == fcA60868)
#define EMI_APB_BASE 0x10219000
#elif (fcFOR_CHIP_ID == fc8195)
- #define EMI_APB_BASE 0x10219000///TODO:Darren confirm
+ #define EMI_APB_BASE 0x10219000
//#define SUB_EMI_APB_BASE 0x1021D000
- // 0x10219000 for CH0/1
- // 0x1021D000 for CH2/3
+
#endif
-U8 u1MaType = 0x2; // for DV sim
+U8 u1MaType = 0x2;
void TA2_Test_Run_Time_HW_Set_Column_Num(DRAMC_CTX_T * p)
{
U8 u1ChannelIdx = 0;
@@ -1404,15 +1338,15 @@ void TA2_Test_Run_Time_HW_Set_Column_Num(DRAMC_CTX_T * p)
if (channel_num_auxadc > 2) {
if (u1ChannelIdx >= CHANNEL_C)
{
- u4EmiOffset = 0x4000; // 0x1021D000 for CH2/3
+ u4EmiOffset = 0x4000;
u1EmiChIdx = u1ChannelIdx-2;
}
}
#endif
u4matype = u4IO32Read4B(EMI_APB_BASE + u4EmiOffset);
- u4matypeR0 = ((u4matype >> (4 + u1EmiChIdx * 16)) & 0x3) + 1; //refer to init_ta2_single_channel()
- u4matypeR1 = ((u4matype >> (6 + u1EmiChIdx * 16)) & 0x3) + 1; //refer to init_ta2_single_channel()
+ u4matypeR0 = ((u4matype >> (4 + u1EmiChIdx * 16)) & 0x3) + 1;
+ u4matypeR1 = ((u4matype >> (6 + u1EmiChIdx * 16)) & 0x3) + 1;
if(p->support_rank_num==RANK_SINGLE)
{
@@ -1420,7 +1354,7 @@ void TA2_Test_Run_Time_HW_Set_Column_Num(DRAMC_CTX_T * p)
}
else
{
- u4matype = (u4matypeR0 > u4matypeR1) ? u4matypeR1 : u4matypeR0; //get min value
+ u4matype = (u4matypeR0 > u4matypeR1) ? u4matypeR1 : u4matypeR0;
}
//vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_MATYPE), u4matype, MATYPE_MATYPE);
}
@@ -1430,30 +1364,17 @@ void TA2_Test_Run_Time_HW_Set_Column_Num(DRAMC_CTX_T * p)
return;
}
-/* ----------------------------------------------------------------------
- * LP4 RG Address
- * bit: 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0
- * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
- * ---------------------------------------------------------------
- * RG: - - R R R R R R R R R R R R R R R R R R|B B B|C C C C C C - - -
- * 2_BASE 1 1 1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0|A A A|9 8 7 6 5 4
- * 7 6 5 4 3 2 1 0 |2 1 0|
- * AXI ---------------------------------------------------------------
- * Addr: R R R R R R R R R R R R R R R R|B B B|C C C|C|C C C C C C C -
- * 1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0|A A A|9 8 7|H|6 5 4 3 2 1 0
- * 5 4 3 2 1 0 |2 1 0| | |
- * ----------------------------------------------------------------------
- */
+
#define TA2_RANK0_ADDRESS (0x40200000)
-#define AXI_CHAN_BIT_WIDTH 1 //2: 4_channel 1: 2_channel
+#define AXI_CHAN_BIT_WIDTH 1
#define OFFSET_OF_RG_BASE_AND_AXI 2
#define LEN1_INTRINSIC_OFFSET 2
#if FOR_DV_SIMULATION_USED
-#define TRANSFER_DRAM_ADDR_BY_EMI_API 0 // @ tg add to fix simulation compile error
+#define TRANSFER_DRAM_ADDR_BY_EMI_API 0
#else
-#define TRANSFER_DRAM_ADDR_BY_EMI_API 1 //1: by emi API 0: by above table
+#define TRANSFER_DRAM_ADDR_BY_EMI_API 1
#endif
-void TA2_Test_Run_Time_HW_Presetting(DRAMC_CTX_T * p, U32 len, TA2_RKSEL_TYPE_T rksel_mode)/* Should call after TA2_Test_Run_Time_Pat_Setting() */
+void TA2_Test_Run_Time_HW_Presetting(DRAMC_CTX_T * p, U32 len, TA2_RKSEL_TYPE_T rksel_mode)
{
DRAM_CHANNEL_T eOriChannel = p->channel;
DRAM_RANK_T eOriRank = p->rank;
@@ -1470,40 +1391,40 @@ void TA2_Test_Run_Time_HW_Presetting(DRAMC_CTX_T * p, U32 len, TA2_RKSEL_TYPE_T
unsigned long long ull_axi_addr = TA2_RANK0_ADDRESS;
memset(&dram_addr, 0, sizeof(dram_addr));
- phy_addr_to_dram_addr(&dram_addr, ull_axi_addr); //Make sure row. bank. column are correct
- u4BaseR0 = ((dram_addr.row << 12) | (dram_addr.bk << 9) | (dram_addr.col >> 1)) >> 3;// >>1: RG C4 @3th bit >>3: RG start with bit 3
+ phy_addr_to_dram_addr(&dram_addr, ull_axi_addr);
+ u4BaseR0 = ((dram_addr.row << 12) | (dram_addr.bk << 9) | (dram_addr.col >> 1)) >> 3;
}
#else
- // >>AXI_CHAN_BIT_WIDTH: drop bit8; >>OFFSET_OF_RG_BASE_AND_AXI: align with RG row; >>3: RG start with bit 3
+
u4BaseR0 = (((u4Addr & ~0x1ff) >> AXI_CHAN_BIT_WIDTH) | (u4Addr & 0xff)) >> (OFFSET_OF_RG_BASE_AND_AXI + 3);
#endif
//mcSHOW_DBG_MSG(("===u4BaseR0 = 0x%x\n", u4BaseR0));
- u4Offset = len >> (AXI_CHAN_BIT_WIDTH + 5);//5:0x20 bytes(256 bits) address coverage per pattern(128 bits data + 128 bits bubble); offset should bigger than 0xFF
+ u4Offset = len >> (AXI_CHAN_BIT_WIDTH + 5);
}
else
{
u4BaseR0 = u4Addr >> 4;
if (rksel_mode == TA2_RKSEL_XRT)
{
- u4Offset = len >> 4;//16B per pattern
+ u4Offset = len >> 4;
}
else
{
- u4Offset = (len >> 4) >> 1;//16B per pattern //len should be >>2 or test engine will time out
+ u4Offset = (len >> 4) >> 1;
}
}
u4BaseR1 = u4BaseR0;
u4matypeR0 = ((u4IO32Read4B(EMI_APB_BASE) >> 4) & 0x3) + 1;
u4matypeR1 = ((u4IO32Read4B(EMI_APB_BASE) >> 6) & 0x3) + 1;
- if (u4matypeR0 != u4matypeR1)//R0 R1 mix mode
+ if (u4matypeR0 != u4matypeR1)
{
- (u4matypeR0 > u4matypeR1)? (u4BaseR0 >>= 1): (u4BaseR1 >>= 1);//set the correct start address, refer to mapping table
- u4Offset >>= 1;//set min value
+ (u4matypeR0 > u4matypeR1)? (u4BaseR0 >>= 1): (u4BaseR1 >>= 1);
+ u4Offset >>= 1;
}
- u4Offset = (u4Offset == 0) ? 1 : u4Offset; //halt if u4Offset = 0
+ u4Offset = (u4Offset == 0) ? 1 : u4Offset;
u4LEN1 = u4IO32ReadFldAlign(DRAMC_REG_TEST2_A4, TEST2_A4_TEST_REQ_LEN1);
if(u4LEN1)
@@ -1517,13 +1438,13 @@ void TA2_Test_Run_Time_HW_Presetting(DRAMC_CTX_T * p, U32 len, TA2_RKSEL_TYPE_T
u4matypeR0 = 2;
u4matypeR1 = 2;
u4Offset = 3;
- //u4Offset = 6;//3; //6: for emilpbk_dq_dvs_leadlag_toggle_ringcnt
+ //u4Offset = 6;
}
#endif
if (TA2_RKSEL_XRT == rksel_mode)
{
- // In order to enhance XRT R2R/W2W probability, use TEST2_4_TESTAGENTRKSEL=3, PERFCTL0_RWOFOEN=0 mode
+
uiRWOFOEN = 0;
mcSHOW_DBG_MSG2(("=== TA2 XRT R2R/W2W\n"));
}
@@ -1544,9 +1465,9 @@ void TA2_Test_Run_Time_HW_Presetting(DRAMC_CTX_T * p, U32 len, TA2_RKSEL_TYPE_T
for(u1RkIdx = 0; u1RkIdx < p->support_rank_num; u1RkIdx++)
{
p->rank = (DRAM_RANK_T)u1RkIdx;
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1), u4BaseR0, RK_TEST2_A1_TEST2_BASE);//fill based on RG table for Rank 0
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1), u4BaseR0, RK_TEST2_A1_TEST2_BASE);
}
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A2), u4Offset, TEST2_A2_TEST2_OFF);//128 bits data length per offest
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A2), u4Offset, TEST2_A2_TEST2_OFF);
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A4), rksel_mode, TEST2_A4_TESTAGENTRKSEL);
DramcSetRWOFOEN(p, uiRWOFOEN);
}
@@ -1581,7 +1502,7 @@ void TA2_Test_Run_Time_Pat_Setting(DRAMC_CTX_T *p, U8 PatSwitch)
#if !ETT_MINI_STRESS_USE_TA2_LOOP_MODE
{
U32 u4Value = 0;
- u4Value = (u1Pat == TEST_WORST_SI_PATTERN) ? 1 : 0; //Worst SI pattern + loop mode + LEN1
+ u4Value = (u1Pat == TEST_WORST_SI_PATTERN) ? 1 : 0;
vIO32WriteFldAlign_All(DRAMC_REG_TEST2_A0, u4Value, TEST2_A0_TA2_LOOP_EN);
vIO32WriteFldAlign_All(DRAMC_REG_TEST2_A0, u4Value, TEST2_A0_LOOP_NV_END);
vIO32WriteFldAlign_All(DRAMC_REG_TEST2_A0, u4Value, TEST2_A0_ERR_BREAK_EN);
@@ -1658,7 +1579,7 @@ static void TA2_Show_Cnt(DRAMC_CTX_T * p, U32 u4ErrorValue)
static void TA2_Test_Run_Time_Stop_Loop_Mode(DRAMC_CTX_T * p)
{
U8 u1ChannelIdx = 0;
- U8 u1status = (p->support_rank_num == 2) ? 3 : 1; //3: 2 ranks; 1: 1 rank
+ U8 u1status = (p->support_rank_num == 2) ? 3 : 1;
U32 u4loop_count = 0;
DRAM_CHANNEL_T eOriChannel = p->channel;
@@ -1666,10 +1587,10 @@ static void TA2_Test_Run_Time_Stop_Loop_Mode(DRAMC_CTX_T * p)
{
vSetPHY2ChannelMapping(p, u1ChannelIdx);
- //Step 1: set LOOP_NV_END=0
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A0), 0, TEST2_A0_LOOP_NV_END);
- //Step 2: check TA2 status
+
while (((u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) & u1status) != u1status) || (u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT), TESTRPT_TESTSTAT)))
{
mcDELAY_US(CMP_CPT_POLLING_PERIOD);
@@ -1685,7 +1606,7 @@ static void TA2_Test_Run_Time_Stop_Loop_Mode(DRAMC_CTX_T * p)
}
}
- //Step 3: set TEST2W/TEST2R=0 and RG_TA2_LOOP_EN=0
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3), P_Fld(0, TEST2_A3_TEST2W) | P_Fld(0, TEST2_A3_TEST2R) | P_Fld(0, TEST2_A3_TEST1));
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A0), 0, TEST2_A0_TA2_LOOP_EN);
}
@@ -1713,12 +1634,12 @@ static U32 TA2_Test_Run_Time_Err_Status(DRAMC_CTX_T *p)
for(u1ChannelIdx=CHANNEL_A; u1ChannelIdx<(p->support_channel_num); u1ChannelIdx++)
{
vSetPHY2ChannelMapping(p, u1ChannelIdx);
- u4ErrorValue = (u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) >> 4) & 0x3; //CMP_ERR_RK0/1
+ u4ErrorValue = (u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) >> 4) & 0x3;
//mcSHOW_DBG_MSG(("CMP_ERR_RK0/1:0x%x ", u4ErrorValue));
TA2_Show_Cnt(p, u4ErrorValue);
u4AllErrorValue |= u4ErrorValue;
- u4Value = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TEST_LOOP_CNT)); //loop counter
+ u4Value = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TEST_LOOP_CNT));
mcSHOW_DBG_MSG2(("CH[%d] LOOP_CNT:0x%x \n", u1ChannelIdx, u4Value));
}
vSetPHY2ChannelMapping(p, bkchannel);
@@ -1737,7 +1658,7 @@ U32 TA2_Test_Run_Time_HW_Status(DRAMC_CTX_T * p)
vSetPHY2ChannelMapping(p, u1ChannelIdx);
u4ErrorValue = DramcEngine2Compare(p, TE_OP_WRITE_READ_CHECK);
- if (u4ErrorValue & 0x3) //RK0 or RK1 test fail
+ if (u4ErrorValue & 0x3)
{
mcSHOW_DBG_MSG2(("=== HW channel(%d) u4ErrorValue: 0x%x, bit error: 0x%x\n", u1ChannelIdx, u4ErrorValue, u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_CMP_ERR))));
#if defined(SLT)
@@ -1777,17 +1698,17 @@ U32 TA2_Test_Run_Time_HW_Status(DRAMC_CTX_T * p)
{
u4loopcount = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3), TEST2_A3_TESTCNT);
if (u4loopcount == 1)
- u1status = 3; //RK0/1
+ u1status = 3;
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A0), 0, TEST2_A0_LOOP_NV_END);//cancel NV_END
- DramcEngine2CheckComplete(p, u1status);//Wait for complete
- //mcSHOW_DBG_MSG(("TESTRPT_TESTSTAT:%x\n", u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT), TESTRPT_TESTSTAT)));//check TESTRPT_TESTSTAT
- u4ErrorValue = (u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) >> 4) & 0x3; //CMP_ERR_RK0/1
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A0), 0, TEST2_A0_LOOP_NV_END);
+ DramcEngine2CheckComplete(p, u1status);
+ //mcSHOW_DBG_MSG(("TESTRPT_TESTSTAT:%x\n", u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT), TESTRPT_TESTSTAT)));
+ u4ErrorValue = (u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_TESTRPT)) >> 4) & 0x3;
}
else
u4ErrorValue = DramcEngine2Compare(p, TE_OP_WRITE_READ_CHECK);
- if (u4ErrorValue & 0x3) //RK0 or RK1 test fail
+ if (u4ErrorValue & 0x3)
{
mcSHOW_DBG_MSG2(("=== HW channel(%d) u4ErrorValue: 0x%x, bit error: 0x%x\n", u1ChannelIdx, u4ErrorValue, u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_CMP_ERR))));
#if defined(SLT)
@@ -1816,7 +1737,7 @@ void TA2_Test_Run_Time_HW(DRAMC_CTX_T * p)
DRAM_CHANNEL_T channel_bak = p->channel;
DRAM_RANK_T rank_bak = p->rank;
- TA2_Test_Run_Time_HW_Presetting(p, 0x10000, TA2_RKSEL_HW); //TEST2_2_TEST2_OFF = 0x400
+ TA2_Test_Run_Time_HW_Presetting(p, 0x10000, TA2_RKSEL_HW);
TA2_Test_Run_Time_Pat_Setting(p, TA2_PAT_SWITCH_OFF);
TA2_Test_Run_Time_HW_Write(p, ENABLE);
//mcDELAY_MS(1);
@@ -1835,7 +1756,7 @@ void Temp_TA2_Test_After_K(DRAMC_CTX_T * p)
do {
TA2_Test_Run_Time_Pat_Setting(p, TA2_PAT_SWITCH_ON);
TA2_Test_Run_Time_HW_Presetting(p, 0x200000, TA2_RKSEL_HW);
- TA2_Test_Run_Time_HW_Write(p, ENABLE);//TA2 trigger W
+ TA2_Test_Run_Time_HW_Write(p, ENABLE);
TA2_Test_Run_Time_HW_Status(p);
}while(1);
@@ -1890,7 +1811,7 @@ U8 DramcMRWriteBackup(DRAMC_CTX_T *p, U8 u1MRIdx, U8 u1Rank)
}
}
- if (u1Fsp == FSP_0) /* All MR */
+ if (u1Fsp == FSP_0)
{
switch (u1MRIdx)
{
@@ -2048,7 +1969,7 @@ U8 DramcMRWriteBackup(DRAMC_CTX_T *p, U8 u1MRIdx, U8 u1Rank)
break;
}
}
- else if (u1MRIdx == 21 || u1MRIdx == 22) /* MR only in FSP0/FSP1 */
+ else if (u1MRIdx == 21 || u1MRIdx == 22)
{
if (u1MRIdx == 21)
{
@@ -2061,7 +1982,7 @@ U8 DramcMRWriteBackup(DRAMC_CTX_T *p, U8 u1MRIdx, U8 u1Rank)
TransferReg.u4Fld = MR_BACKUP_03_RK0_FSP1_MRWBK_RK0_FSP1_MR22;
}
}
- else /* MR in FSP0/FSP1/FSP2 */
+ else
{
if (u1MRIdx <= 20)
{
@@ -2155,28 +2076,27 @@ void DramcModeRegRead(DRAMC_CTX_T *p, U8 u1MRIdx, U16 *u2pValue)
//vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), p->rank, SWCMD_CTRL0_MRRRK);
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1MRIdx, SWCMD_CTRL0_MRSMA);
- // MRR command will be fired when MRREN 0->1
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_MRREN);
- // wait MRR command fired.
+
while (u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP), SPCMDRESP_MRR_RESPONSE) == 0)
{
mcDELAY_US(1);
}
- // Since LP3 does not support CG condition, LP3 can not use MRR_STATUS_MRR_SW_REG to do sw mrr.
- // After fix HW CG condition, LP3 will use MRR_STATUS_MRR_SW_REG to do sw mrr.
+
U32 u4MRRReg;
if (u1IsLP4Family(p->dram_type))
u4MRRReg = MRR_STATUS_MRR_SW_REG;
else
u4MRRReg = MRR_STATUS_MRR_REG;
- // Read out mode register value
+
u4MRValue = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_MRR_STATUS), u4MRRReg);
*u2pValue = (U16)u4MRValue;
- // Set MRREN =0 for next time MRR.
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_MRREN);
#ifdef DUMP_INIT_RG_LOG_TO_DE
@@ -2192,21 +2112,15 @@ void DramcModeRegReadByRank(DRAMC_CTX_T *p, U8 u1Rank, U8 u1MRIdx, U16 *u2pValue
U16 u2Value = 0;
U8 u1RankBak;
- /* Since, TMRRI design changed (2 kinds of modes depending on value of R_DMRK_SCINPUT_OPT)
- * DE: Jouling, Berson
- * To specify SW_MRR rank -> new mode(scinput_opt == 0): MRSRK
- * old mode(scinput_opt == 1): MRRRK
- * Note: MPCRK is not used by SW to control rank anymore
- */
- //Backup & set rank
- u1RankBak = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), SWCMD_CTRL0_MRSRK); //backup rank
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1Rank, SWCMD_CTRL0_MRSRK); //set rank
-
- //Mode reg read
+
+ u1RankBak = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), SWCMD_CTRL0_MRSRK);
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1Rank, SWCMD_CTRL0_MRSRK);
+
+
DramcModeRegRead(p, u1MRIdx, &u2Value);
*u2pValue = u2Value;
- //Restore rank
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1RankBak, SWCMD_CTRL0_MRSRK);
}
@@ -2266,7 +2180,7 @@ void DramcModeRegWriteByRank_RTMRW(DRAMC_CTX_T *p, U8 *u1Rank, U8 *u1MRIdx, U8 *
mcDELAY_US(5);
} while ((u4Response == 0) && (u4TimeCnt > 0));
- if (u4TimeCnt == 0)//time out
+ if (u4TimeCnt == 0)
{
mcSHOW_ERR_MSG(("[LP5 RT MRW ] Resp fail (time out) Rank=%d, MR%d=0x%x\n", u1Rank[0], u1MRIdx[0], u1Value[0]));
}
@@ -2281,25 +2195,25 @@ static void DramcModeRegWriteByRank_SCSM(DRAMC_CTX_T *p, U8 u1Rank, U8 u1MRIdx,
U32 u4RabnkBackup;
U32 u4register_024;
- // backup rank
+
u4RabnkBackup = u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), SWCMD_CTRL0_MRSRK);
- //backup register of CKE fix on/off
+
u4register_024 = u4IO32Read4B(DRAMC_REG_ADDR(DRAMC_REG_CKECTRL));
- // set rank
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1Rank, SWCMD_CTRL0_MRSRK);
- //CKE must be fix on when doing MRW
+
CKEFixOnOff(p, u1Rank, CKE_FIXON, TO_ONE_CHANNEL);
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1MRIdx, SWCMD_CTRL0_MRSMA);
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u1Value, SWCMD_CTRL0_MRSOP);
- // MRW command will be fired when MRWEN 0->1
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 1, SWCMD_EN_MRWEN);
- // wait MRW command fired.
+
while (u4IO32ReadFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SPCMDRESP), SPCMDRESP_MRW_RESPONSE) == 0)
{
counter++;
@@ -2307,13 +2221,13 @@ static void DramcModeRegWriteByRank_SCSM(DRAMC_CTX_T *p, U8 u1Rank, U8 u1MRIdx,
mcDELAY_US(1);
}
- // Set MRWEN =0 for next time MRW.
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_EN), 0, SWCMD_EN_MRWEN);
- // restore CKEFIXON value
+
vIO32Write4B(DRAMC_REG_ADDR(DRAMC_REG_CKECTRL), u4register_024);
- // restore rank
+
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_SWCMD_CTRL0), u4RabnkBackup, SWCMD_CTRL0_MRSRK);
}
@@ -2322,7 +2236,7 @@ void DramcModeRegWriteByRank(DRAMC_CTX_T *p, U8 u1Rank, U8 u1MRIdx, U8 u1Value)
mcSHOW_DBG_MSG2(("MRW RK%d MR#%d = 0x%x\n", u1Rank,u1MRIdx, u1Value));
#if (fcFOR_CHIP_ID == fcA60868)
- // RTMRW & RTSWCMD-MRW can not be used in runtime
+
if (u1EnterRuntime)
{
@@ -2466,20 +2380,20 @@ void DramcConfInfraReset(DRAMC_CTX_T *p)
vIO32WriteFldMulti_All(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CG_CTRL0), P_Fld(0, MISC_CG_CTRL0_CLK_MEM_SEL)
| P_Fld(1, MISC_CG_CTRL0_W_CHG_MEM));
- mcDELAY_XNS(100);//reserve 100ns period for clock mute and latch the rising edge sync condition for BCLK
+ mcDELAY_XNS(100);
vIO32WriteFldAlign_All(DRAMC_REG_ADDR(DDRPHY_REG_MISC_CG_CTRL0), 0, MISC_CG_CTRL0_W_CHG_MEM);
#if (fcFOR_CHIP_ID == fcLafite)
- // 26M
- vIO32WriteFldMulti_All(DDRPHY_CKMUX_SEL, P_Fld(0x1, CKMUX_SEL_R_PHYCTRLMUX) //move CKMUX_SEL_R_PHYCTRLMUX to here (it was originally between MISC_CG_CTRL0_CLK_MEM_SEL and MISC_CTRL0_R_DMRDSEL_DIV2_OPT)
- | P_Fld(0x1, CKMUX_SEL_R_PHYCTRLDCM)); // PHYCTRLDCM 1: follow DDRPHY_conf DCM settings, 0: follow infra DCM settings
+
+ vIO32WriteFldMulti_All(DDRPHY_CKMUX_SEL, P_Fld(0x1, CKMUX_SEL_R_PHYCTRLMUX)
+ | P_Fld(0x1, CKMUX_SEL_R_PHYCTRLDCM));
vIO32WriteFldMulti_All(DDRPHY_MISC_CG_CTRL0, P_Fld(0, MISC_CG_CTRL0_W_CHG_MEM)
- | P_Fld(0, MISC_CG_CTRL0_CLK_MEM_SEL));//[5:4] mem_ck mux: 2'b00: 26MHz, [0]: change memory clock
- vIO32WriteFldAlign_All(DDRPHY_MISC_CG_CTRL0, 1, MISC_CG_CTRL0_W_CHG_MEM);//change clock freq
+ | P_Fld(0, MISC_CG_CTRL0_CLK_MEM_SEL));
+ vIO32WriteFldAlign_All(DDRPHY_MISC_CG_CTRL0, 1, MISC_CG_CTRL0_W_CHG_MEM);
mcDELAY_US(1);
- vIO32WriteFldAlign_All(DDRPHY_MISC_CG_CTRL0, 0, MISC_CG_CTRL0_W_CHG_MEM);//disable memory clock change
+ vIO32WriteFldAlign_All(DDRPHY_MISC_CG_CTRL0, 0, MISC_CG_CTRL0_W_CHG_MEM);
+
- // dramc conf reset
//mcSHOW_TIME_MSG(("Before infra reset, 0x10001148:%x\n", *(volatile unsigned *)(0x10001148)));
*(volatile unsigned *)(0x10001140) = (0x1 << 15);
//mcSHOW_TIME_MSG(("After infra reset, 0x10001148:%x\n", *(volatile unsigned *)(0x10001148)));
@@ -2497,14 +2411,14 @@ void DramcConfInfraReset(DRAMC_CTX_T *p)
mcDELAY_US(200);
#endif
- //DDRPHY Reset
+
vIO32WriteFldAlign_All(DDRPHY_B0_DQ3, 0x0, B0_DQ3_RG_ARDQ_RESETB_B0);
vIO32WriteFldAlign_All(DDRPHY_B0_DLL_ARPI0, 0x0, B0_DLL_ARPI0_RG_ARPI_RESETB_B0);
vIO32WriteFldAlign_All(DDRPHY_B1_DQ3, 0x0, B1_DQ3_RG_ARDQ_RESETB_B1);
vIO32WriteFldAlign_All(DDRPHY_B1_DLL_ARPI0, 0x0, B1_DLL_ARPI0_RG_ARPI_RESETB_B1);
vIO32WriteFldAlign_All(DDRPHY_CA_CMD3, 0x0, CA_CMD3_RG_ARCMD_RESETB);
vIO32WriteFldAlign_All(DDRPHY_CA_DLL_ARPI0, 0x0, CA_DLL_ARPI0_RG_ARPI_RESETB_CA);
- vIO32WriteFldAlign(DDRPHY_PLL4, 0x0, PLL4_RG_RPHYPLL_RESETB);//Since there is only 1 PLL, only control CHA
+ vIO32WriteFldAlign(DDRPHY_PLL4, 0x0, PLL4_RG_RPHYPLL_RESETB);
mcDELAY_US(200);
vIO32WriteFldAlign_All(DDRPHY_B0_DQ3, 0x1, B0_DQ3_RG_ARDQ_RESETB_B0);
vIO32WriteFldAlign_All(DDRPHY_B0_DLL_ARPI0, 0x1, B0_DLL_ARPI0_RG_ARPI_RESETB_B0);
@@ -2512,12 +2426,12 @@ void DramcConfInfraReset(DRAMC_CTX_T *p)
vIO32WriteFldAlign_All(DDRPHY_B1_DLL_ARPI0, 0x1, B1_DLL_ARPI0_RG_ARPI_RESETB_B1);
vIO32WriteFldAlign_All(DDRPHY_CA_CMD3, 0x1, CA_CMD3_RG_ARCMD_RESETB);
vIO32WriteFldAlign_All(DDRPHY_CA_DLL_ARPI0, 0x1, CA_DLL_ARPI0_RG_ARPI_RESETB_CA);
- vIO32WriteFldAlign(DDRPHY_PLL4, 0x1, PLL4_RG_RPHYPLL_RESETB);//Since there is only 1 PLL, only control CHA
+ vIO32WriteFldAlign(DDRPHY_PLL4, 0x1, PLL4_RG_RPHYPLL_RESETB);
+
- //Disable SPM control
vIO32WriteFldMulti(SPM_POWERON_CONFIG_EN, P_Fld(0xB16, POWERON_CONFIG_EN_PROJECT_CODE) | P_Fld(0, POWERON_CONFIG_EN_BCLK_CG_EN));
- //For FMeter after dcm enable
+
vIO32WriteFldAlign_All(DDRPHY_MISC_CG_CTRL2, 0x0, MISC_CG_CTRL2_RG_MEM_DCM_DCM_EN);
vIO32WriteFldAlign_All(DDRPHY_MISC_CG_CTRL2, 0x1, MISC_CG_CTRL2_RG_MEM_DCM_FORCE_ON);
#endif
@@ -2541,7 +2455,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
size = len >> 2;
- /* === Verify the tied bits (tied high) === */
+
for (i = 0; i < size; i++)
{
MEM32_BASE[i] = 0;
@@ -2559,7 +2473,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Verify the tied bits (tied low) === */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0xffffffff)
@@ -2570,7 +2484,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
MEM32_BASE[i] = 0x00;
}
- /* === Verify pattern 1 (0x00~0xff) === */
+
pattern8 = 0x00;
for (i = 0; i < len; i++)
MEM8_BASE[i] = pattern8++;
@@ -2583,7 +2497,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Verify pattern 2 (0x00~0xff) === */
+
pattern8 = 0x00;
for (i = j = 0; i < len; i += 2, j++)
{
@@ -2596,7 +2510,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
pattern8 += 2;
}
- /* === Verify pattern 3 (0x00~0xffff) === */
+
pattern16 = 0x00;
for (i = 0; i < (len >> 1); i++)
MEM16_BASE[i] = pattern16++;
@@ -2609,7 +2523,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Verify pattern 4 (0x00~0xffffffff) === */
+
pattern32 = 0x00;
for (i = 0; i < (len >> 2); i++)
MEM32_BASE[i] = pattern32++;
@@ -2622,11 +2536,11 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Pattern 5: Filling memory range with 0x44332211 === */
+
for (i = 0; i < size; i++)
MEM32_BASE[i] = 0x44332211;
- /* === Read Check then Fill Memory with a5a5a5a5 Pattern === */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0x44332211)
@@ -2639,7 +2553,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Read Check then Fill Memory with 00 Byte Pattern at offset 0h === */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0xa5a5a5a5)
@@ -2652,7 +2566,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Read Check then Fill Memory with 00 Byte Pattern at offset 2h === */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0xa5a5a500)
@@ -2665,7 +2579,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Read Check then Fill Memory with 00 Byte Pattern at offset 1h === */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0xa500a500)
@@ -2678,7 +2592,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Read Check then Fill Memory with 00 Byte Pattern at offset 3h === */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0xa5000000)
@@ -2691,7 +2605,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Read Check then Fill Memory with ffff Word Pattern at offset 1h == */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0x00000000)
@@ -2704,7 +2618,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /* === Read Check then Fill Memory with ffff Word Pattern at offset 0h == */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0xffff0000)
@@ -2717,7 +2631,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /*=== Read Check === */
+
for (i = 0; i < size; i++)
{
if (MEM32_BASE[i] != 0xffffffff)
@@ -2726,17 +2640,14 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
}
- /************************************************
- * Additional verification
- ************************************************/
- /* === stage 1 => write 0 === */
+
for (i = 0; i < size; i++)
{
MEM_BASE[i] = PATTERN1;
}
- /* === stage 2 => read 0, write 0xF === */
+
for (i = 0; i < size; i++)
{
value = MEM_BASE[i];
@@ -2748,7 +2659,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
MEM_BASE[i] = PATTERN2;
}
- /* === stage 3 => read 0xF, write 0 === */
+
for (i = 0; i < size; i++)
{
value = MEM_BASE[i];
@@ -2760,7 +2671,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
- /* === stage 4 => read 0, write 0xF === */
+
for (i = 0; i < size; i++)
{
value = MEM_BASE[i];
@@ -2771,7 +2682,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
MEM_BASE[i] = PATTERN2;
}
- /* === stage 5 => read 0xF, write 0 === */
+
for (i = 0; i < size; i++)
{
value = MEM_BASE[i];
@@ -2782,7 +2693,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
MEM_BASE[i] = PATTERN1;
}
- /* === stage 6 => read 0 === */
+
for (i = 0; i < size; i++)
{
value = MEM_BASE[i];
@@ -2793,7 +2704,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
#if 1
- /* === 1/2/4-byte combination test === */
+
i = (unsigned int) MEM_BASE;
while (i < (unsigned int) MEM_BASE + (size << 2))
@@ -2841,7 +2752,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
}
#endif
- /* === Verify pattern 1 (0x00~0xff) === */
+
pattern8 = 0x00;
MEM8_BASE[0] = pattern8;
for (i = 0; i < size * 4; i++)
@@ -2858,7 +2769,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
pattern8++;
}
- /* === Verify pattern 2 (0x00~0xffff) === */
+
pattern16 = 0x00;
MEM16_BASE[0] = pattern16;
for (i = 0; i < size * 2; i++)
@@ -2872,7 +2783,7 @@ int dramc_complex_mem_test (unsigned int start, unsigned int len)
pattern16++;
}
- /* === Verify pattern 3 (0x00~0xffffffff) === */
+
pattern32 = 0x00;
MEM32_BASE[0] = pattern32;
for (i = 0; i < size; i++)
@@ -2916,7 +2827,7 @@ U32 TimeProfileDiffUS(PROFILING_TIME_T *base)
u4Acc = 0;
TimeProfileGetTick(&end);
- /* temporary patch for overflow */
+
u4Diff = end.u4TickLow - base->u4TickLow;
if (end.u4TickLow > base->u4TickLow)
{
@@ -2965,29 +2876,21 @@ void TA2_Test_Run_Time_SW_Presetting(DRAMC_CTX_T *p, U32 test2_1, U32 test2_2, U
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_DUMMY_RD), P_Fld(0, DUMMY_RD_DQSG_DMYRD_EN) | P_Fld(0, DUMMY_RD_DQSG_DMYWR_EN) | P_Fld(0, DUMMY_RD_DUMMY_RD_EN) | P_Fld(0, DUMMY_RD_SREF_DMYRD_EN) | P_Fld(0, DUMMY_RD_DMY_RD_DBG) | P_Fld(0, DUMMY_RD_DMY_WR_DBG)); //must close dummy read when do test agent
//vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TESTCHIP_DMA1), 0, TESTCHIP_DMA1_DMA_LP4MATAB_OPT);//Eddie
- // disable self test engine1 and self test engine2
+
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A3), P_Fld(0, TEST2_A3_TEST2W) | P_Fld(0, TEST2_A3_TEST2R) | P_Fld(0, TEST2_A3_TEST1));
- // 1.set pattern ,base address ,offset address
- // 2.select ISI pattern or audio pattern or xtalk pattern
- // 3.set loop number
- // 4.enable read or write
- // 5.loop to check DM_CMP_CPT
- // 6.return CMP_ERR
- // currently only implement ucengine_status = 1, others are left for future extension
- // 1
vIO32WriteFldMulti(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A0), P_Fld(test2_1>>24,TEST2_A0_TEST2_PAT0)|P_Fld(test2_2>>24,TEST2_A0_TEST2_PAT1));
#if (FOR_DV_SIMULATION_USED==1 || SW_CHANGE_FOR_SIMULATION==1)
- //DV sim memory 0~0x100 has values, can't used
+
//vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A1), (test2_1+0x100) & 0x00ffffff, TEST2_A1_TEST2_BASE);
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1), 0x10000, RK_TEST2_A1_TEST2_BASE); //LPDDR4 Setting
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1), 0x0, RK_TEST2_A1_TEST2_BASE); //Eddie Change to 0 for LP5
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1), 0x10000, RK_TEST2_A1_TEST2_BASE);
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1), 0x0, RK_TEST2_A1_TEST2_BASE);
#else
vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_RK_TEST2_A1), 0, RK_TEST2_A1_TEST2_BASE);
#endif
- vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A2), 0x2, TEST2_A2_TEST2_OFF);//Eddie
+ vIO32WriteFldAlign(DRAMC_REG_ADDR(DRAMC_REG_TEST2_A2), 0x2, TEST2_A2_TEST2_OFF);
return;
}