summaryrefslogtreecommitdiffstats
path: root/src/vendorcode/mediatek/mt8192/dramc/DRAM_config_collctioin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vendorcode/mediatek/mt8192/dramc/DRAM_config_collctioin.c')
-rw-r--r--src/vendorcode/mediatek/mt8192/dramc/DRAM_config_collctioin.c250
1 files changed, 250 insertions, 0 deletions
diff --git a/src/vendorcode/mediatek/mt8192/dramc/DRAM_config_collctioin.c b/src/vendorcode/mediatek/mt8192/dramc/DRAM_config_collctioin.c
new file mode 100644
index 000000000000..01a0569bb0cb
--- /dev/null
+++ b/src/vendorcode/mediatek/mt8192/dramc/DRAM_config_collctioin.c
@@ -0,0 +1,250 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#include "dramc_dv_init.h"
+
+//DRAM LP4 initial configuration
+void LP4_DRAM_config(U32 data_rate, LP4_DRAM_CONFIG_T *tr)
+{
+ tr->BYTE_MODE[0] = 0;//TODO
+ tr->BYTE_MODE[1] = 0;//TODO
+#if 0 // @Darren, remove it
+ #if SA_CONFIG_EN
+ tr->EX_ROW_EN[0] = 0;//TODO
+ tr->EX_ROW_EN[1] = 0;//TODO
+ #else
+ tr->EX_ROW_EN[0] = 1;//TODO
+ tr->EX_ROW_EN[1] = 0;//TODO
+ #endif
+#endif
+ tr->MR_WL = LP4_DRAM_INIT_RLWL_MRfield_config(data_rate);
+ tr->MR_RL = tr->MR_WL;
+ tr->BL = 2;
+ tr->RPST = 0;
+ tr->RD_PRE = 0;
+ tr->WR_PRE = 1;
+ tr->WR_PST = (data_rate>=2667)?1:0; //TODO
+ #if SA_CONFIG_EN
+ tr->DBI_WR = 0;
+ tr->DBI_RD = 0;
+ #else
+ tr->DBI_WR = (data_rate>=2667)?1:0;
+ tr->DBI_RD = (data_rate>=2667)?1:0;
+ #endif
+ // tr->DMI = 1;
+ tr->OTF = 1;
+ #if ENABLE_LP4Y_DFS
+ tr->LP4Y_EN = (data_rate>=1866)?0:1; //TODO, @Darren for LP4Y
+ #else
+ tr->LP4Y_EN = 0;
+ #endif
+ tr->WORK_FSP = (data_rate>=2667)?1:0;
+
+ mcSHOW_DBG_MSG(("=================================== \n"));
+ mcSHOW_DBG_MSG(("LPDDR4 DRAM CONFIGURATION\n" ));
+ mcSHOW_DBG_MSG(("=================================== \n"));
+// mcSHOW_DBG_MSG(("BYTE_MODE = B%1b\n",tr->BYTE_MODE));
+ mcSHOW_DBG_MSG(("EX_ROW_EN[0] = 0x%1x\n",tr->EX_ROW_EN[0]));
+ mcSHOW_DBG_MSG(("EX_ROW_EN[1] = 0x%1x\n",tr->EX_ROW_EN[1]));
+ mcSHOW_DBG_MSG(("LP4Y_EN = 0x%1x\n",tr->LP4Y_EN ));
+ mcSHOW_DBG_MSG(("WORK_FSP = 0x%1x\n",tr->WORK_FSP ));
+ mcSHOW_DBG_MSG(("WL = 0x%1x\n",tr->MR_WL ));
+ mcSHOW_DBG_MSG(("RL = 0x%1x\n",tr->MR_RL ));
+ mcSHOW_DBG_MSG(("BL = 0x%1x\n",tr->BL ));
+ mcSHOW_DBG_MSG(("RPST = 0x%1x\n",tr->RPST ));
+ mcSHOW_DBG_MSG(("RD_PRE = 0x%1x\n",tr->RD_PRE ));
+ mcSHOW_DBG_MSG(("WR_PRE = 0x%1x\n",tr->WR_PRE ));
+ mcSHOW_DBG_MSG(("WR_PST = 0x%1x\n",tr->WR_PST ));
+ mcSHOW_DBG_MSG(("DBI_WR = 0x%1x\n",tr->DBI_WR ));
+ mcSHOW_DBG_MSG(("DBI_RD = 0x%1x\n",tr->DBI_RD ));
+// mcSHOW_DBG_MSG(("DMI = 0x%1x\n",tr->DMI ));
+ mcSHOW_DBG_MSG(("OTF = 0x%1x\n",tr->OTF ));
+ mcSHOW_DBG_MSG(("=================================== \n"));
+}
+//LP4 dram initial ModeRegister setting
+U8 LP4_DRAM_INIT_RLWL_MRfield_config(U32 data_rate)
+{
+ U8 MR2_RLWL;
+
+ if ((data_rate<=4266) && (data_rate > 3733)) {MR2_RLWL = 7 ;}
+ else if ((data_rate<=3733) && (data_rate > 3200)) {MR2_RLWL = 6 ;}
+ else if ((data_rate<=3200) && (data_rate > 2667)) {MR2_RLWL = 5 ;}
+ else if ((data_rate<=2667) && (data_rate > 2400)) {MR2_RLWL = 4 ;}
+ else if ((data_rate<=2400) && (data_rate > 1866)) {MR2_RLWL = 4 ;}
+ else if ((data_rate<=1866) && (data_rate > 1600)) {MR2_RLWL = 3 ;}
+ else if ((data_rate<=1600) && (data_rate > 1200)) {MR2_RLWL = 2 ;}
+ else if ((data_rate<=1200) && (data_rate > 800 )) {MR2_RLWL = 2 ;}
+ else if ((data_rate<=800 ) && (data_rate > 400 )) {MR2_RLWL = 2 ;}
+ else if (data_rate<=400 ) {MR2_RLWL = 0 ;}
+ else {mcSHOW_DBG_MSG(("ERROR: Unexpected data_rate:%4d under LPDDR4 \n",data_rate));return -1;}
+
+ mcSHOW_DBG_MSG(("[ModeRegister RLWL Config] data_rate:%4d-MR2_RLWL:%1x\n",data_rate,MR2_RLWL));
+
+ return MR2_RLWL;
+}
+
+U32 Get_RL_by_MR_LP4(U8 BYTE_MODE_EN,U8 DBI_EN, U8 MR_RL_field_value)
+{
+ U32 RL=0;
+
+ switch(MR_RL_field_value)
+ {
+ case 0: {RL = 6; break;}
+ case 1: {RL = (BYTE_MODE_EN == 1) ? ( 12 ) : ((DBI_EN == 1) ? 12 : 10); break;}
+ case 2: {RL = (BYTE_MODE_EN == 1) ? ((DBI_EN == 1) ? 18 : 16 ) : ((DBI_EN == 1) ? 16 : 14); break;}
+ case 3: {RL = (BYTE_MODE_EN == 1) ? ((DBI_EN == 1) ? 24 : 22 ) : ((DBI_EN == 1) ? 22 : 20); break;}
+ case 4: {RL = (BYTE_MODE_EN == 1) ? ((DBI_EN == 1) ? 30 : 28 ) : ((DBI_EN == 1) ? 28 : 24); break;}
+ case 5: {RL = (BYTE_MODE_EN == 1) ? ((DBI_EN == 1) ? 36 : 32 ) : ((DBI_EN == 1) ? 32 : 28); break;}
+ case 6: {RL = (BYTE_MODE_EN == 1) ? ((DBI_EN == 1) ? 40 : 36 ) : ((DBI_EN == 1) ? 36 : 32); break;}
+ case 7: {RL = (BYTE_MODE_EN == 1) ? ((DBI_EN == 1) ? 44 : 40 ) : ((DBI_EN == 1) ? 40 : 36); break;}
+ default:{mcSHOW_DBG_MSG(("ERROR: Unexpected MR_RL_field_value:%1x under LPDDR4 \n",MR_RL_field_value));}
+ }
+
+ mcSHOW_DBG_MSG(("[ReadLatency GET] BYTE_MODE_EN:%1d-DBI_EN:%1d-MR_RL_field_value:%1x-RL:%2d\n",BYTE_MODE_EN,DBI_EN,MR_RL_field_value,RL));
+
+ return RL;
+}
+
+U32 Get_WL_by_MR_LP4(U8 Version, U8 MR_WL_field_value)
+{
+ U32 WL=0;
+
+ switch(MR_WL_field_value)
+ {
+ case 0: {WL = 4; break;}
+ case 1: {WL = ((Version == 0) ? 6 : 8 ); break;}
+ case 2: {WL = ((Version == 0) ? 8 : 12 ); break;}
+ case 3: {WL = ((Version == 0) ? 10 : 18 ); break;}
+ case 4: {WL = ((Version == 0) ? 12 : 22 ); break;}
+ case 5: {WL = ((Version == 0) ? 14 : 26 ); break;}
+ case 6: {WL = ((Version == 0) ? 16 : 30 ); break;}
+ case 7: {WL = ((Version == 0) ? 18 : 34 ); break;}
+ default:{mcSHOW_DBG_MSG(("ERROR: Unexpected MR_WL_field_value:%1x under LPDDR4 \n",MR_WL_field_value));}
+ }
+
+ mcSHOW_DBG_MSG(("[WriteLatency GET] Version:%1d-MR_RL_field_value:%1x-WL:%2d\n",Version,MR_WL_field_value,WL));
+
+ return WL;
+}
+
+//LP5 dram initial ModeRegister setting
+static U8 LP5_DRAM_INIT_RLWL_MRfield_config(U32 data_rate)
+{
+ U8 MR2_RLWL=0;
+
+ if ((data_rate<=6400) && (data_rate > 6000)) {MR2_RLWL = 11 ;}
+ else if ((data_rate<=6400) && (data_rate > 5500)) {MR2_RLWL = 10 ;}
+ else if ((data_rate<=5500) && (data_rate > 4800)) {MR2_RLWL = 9 ;}
+ else if ((data_rate<=4800) && (data_rate > 4266)) {MR2_RLWL = 8 ;}
+ else if ((data_rate<=4266) && (data_rate > 3733)) {MR2_RLWL = 7 ;}
+ else if ((data_rate<=3700) && (data_rate > 3200)) {MR2_RLWL = 6 ;}
+ else if ((data_rate<=3200) && (data_rate > 2400)) {MR2_RLWL = 5 ;}
+ else if ((data_rate<=2400) && (data_rate > 1866)) {MR2_RLWL = 4 ;}
+ else if ((data_rate<=1866) && (data_rate > 1600)) {MR2_RLWL = 3 ;}
+ else if ((data_rate<=1600) && (data_rate >= 800)) {MR2_RLWL = 2 ;}
+ else {mcSHOW_DBG_MSG(("ERROR: Unexpected data_rate:%4d under LPDDR5 \n",data_rate));return -1;}
+
+ mcSHOW_DBG_MSG(("[ModeRegister RLWL Config] data_rate:%4d-MR2_RLWL:%1x\n",data_rate,MR2_RLWL));
+
+ return MR2_RLWL;
+}
+
+void LP5_DRAM_config(DRAMC_DVFS_GROUP_CONFIG_T *dfs_tr, LP5_DRAM_CONFIG_T *tr)
+{
+ tr->BYTE_MODE[0] = 0 ;
+ tr->BYTE_MODE[1] = 0 ;
+ tr->EX_ROW_EN[0] = 0 ;
+ tr->EX_ROW_EN[1] = 0 ;
+ tr->MR_WL = LP5_DRAM_INIT_RLWL_MRfield_config(dfs_tr->data_rate);
+ tr->MR_RL = tr->MR_WL;
+ tr->BL = 2;
+ tr->CK_Mode = (dfs_tr->data_rate>=2133)?0:1; //0:diff 1:SE
+ tr->RPST = 0;
+ tr->RD_PRE = 0;
+ tr->WR_PRE = 1;
+ tr->WR_PST = (dfs_tr->data_rate>=3200)?1:0 ;
+ #if SA_CONFIG_EN
+ tr->DBI_WR = 0;
+ #if LP5_DDR4266_RDBI_WORKAROUND
+ tr->DBI_RD = (dfs_tr->data_rate>=3733)?1:0 ;
+ #else
+ tr->DBI_RD = 0;
+ #endif
+ #else
+ tr->DBI_WR = (dfs_tr->data_rate>=3733)?1:0 ;
+ tr->DBI_RD = (dfs_tr->data_rate>=3733)?1:0 ;
+ #endif
+ tr->DMI = 1;
+ tr->OTF = 1;
+ tr->WCK_PST = (dfs_tr->data_rate>=3733)?1:0 ;
+ tr->RDQS_PST = 0;
+ tr->CA_ODT = 0;
+ tr->DQ_ODT = (dfs_tr->data_rate>=3733)?3:0 ;
+ tr->CKR = (dfs_tr->CKR==4)?0:1;
+ tr->WCK_ON = 0; //TODO
+ #if SA_CONFIG_EN
+ #if WCK_LEVELING_FM_WORKAROUND
+ tr->WCK_FM = 0;
+ #else
+ tr->WCK_FM = (dfs_tr->data_rate>=2133)?1:0;
+ #endif
+ #else
+ tr->WCK_FM = (dfs_tr->data_rate>=2133)?1:0;
+ #endif
+ tr->WCK_ODT = (dfs_tr->CKR==4)?3:0;
+ tr->DVFSQ = (dfs_tr->data_rate>=3733)?0:1;
+ tr->DVFSC = (dfs_tr->data_rate>=2133)?0:1;
+ tr->RDQSmode[0] = EN_both;//TODO --RK0 have to EN_t if SE enable
+ tr->RDQSmode[1] = EN_both;//TODO --RK1 have to EN_c if SE enable
+ tr->WCKmode[0] = (dfs_tr->data_rate>=1600)?0:1;
+ tr->WCKmode[1] = (dfs_tr->data_rate>=1600)?0:2;
+ tr->RECC = 0;//TODO
+ tr->WECC = 0;//TODO
+ tr->BankMode = (dfs_tr->data_rate>=3733)?BG4BK4:BK16;
+ tr->WORK_FSP = 0;//TODO
+
+ switch (dfs_tr->DQSIEN_MODE)
+ {
+ case 1: {tr->RDQS_PRE = 0;break;}
+ case 2: {tr->RDQS_PRE = 1;break;}
+ case 3: {tr->RDQS_PRE = 3;break;}
+ case 6: {tr->RDQS_PRE = 1;break;}
+ case 7: {tr->RDQS_PRE = 3;break;}
+ default : {mcSHOW_DBG_MSG(("ERROR: Unexpected DQSIEN_MODE :%d \n",dfs_tr->DQSIEN_MODE)); while(1);};
+ }
+
+ mcSHOW_DBG_MSG(("=================================== \n"));
+ mcSHOW_DBG_MSG(("LPDDR5 DRAM CONFIGURATION\n" ));
+ mcSHOW_DBG_MSG(("=================================== \n"));
+ mcSHOW_DBG_MSG(("MR_WL = 0x%1x\n",tr->MR_WL ));
+ mcSHOW_DBG_MSG(("MR_RL = 0x%1x\n",tr->MR_RL ));
+ mcSHOW_DBG_MSG(("BL = 0x%1x\n",tr->BL ));
+ mcSHOW_DBG_MSG(("CK_Mode = 0x%1x\n",tr->CK_Mode ));
+ mcSHOW_DBG_MSG(("RPST = 0x%1x\n",tr->RPST ));
+ mcSHOW_DBG_MSG(("RD_PRE = 0x%1x\n",tr->RD_PRE ));
+ mcSHOW_DBG_MSG(("RDQS_PRE = 0x%1x\n",tr->RDQS_PRE ));
+ mcSHOW_DBG_MSG(("WR_PRE = 0x%1x\n",tr->WR_PRE ));
+ mcSHOW_DBG_MSG(("WR_PST = 0x%1x\n",tr->WR_PST ));
+ mcSHOW_DBG_MSG(("DBI_WR = 0x%1x\n",tr->DBI_WR ));
+ mcSHOW_DBG_MSG(("DBI_RD = 0x%1x\n",tr->DBI_RD ));
+ mcSHOW_DBG_MSG(("DMI = 0x%1x\n",tr->DMI ));
+ mcSHOW_DBG_MSG(("OTF = 0x%1x\n",tr->OTF ));
+ mcSHOW_DBG_MSG(("WCK_PST = 0x%1x\n",tr->WCK_PST ));
+ mcSHOW_DBG_MSG(("RDQS_PST = 0x%1x\n",tr->RDQS_PST ));
+ mcSHOW_DBG_MSG(("CA_ODT = 0x%1x\n",tr->CA_ODT ));
+ mcSHOW_DBG_MSG(("DQ_ODT = 0x%1x\n",tr->DQ_ODT ));
+ mcSHOW_DBG_MSG(("CKR = 0x%1x\n",tr->CKR ));
+ mcSHOW_DBG_MSG(("WCK_ON = 0x%1x\n",tr->WCK_ON ));
+ mcSHOW_DBG_MSG(("WCK_FM = 0x%1x\n",tr->WCK_FM ));
+ mcSHOW_DBG_MSG(("WCK_ODT = 0x%1x\n",tr->WCK_ODT ));
+ mcSHOW_DBG_MSG(("DVFSQ = 0x%1x\n",tr->DVFSQ ));
+ mcSHOW_DBG_MSG(("DVFSC = 0x%1x\n",tr->DVFSC ));
+ mcSHOW_DBG_MSG(("RDQSmode[0] = 0x%1x\n",tr->RDQSmode[0] ));
+ mcSHOW_DBG_MSG(("RDQSmode[1] = 0x%1x\n",tr->RDQSmode[1] ));
+ mcSHOW_DBG_MSG(("WCKmode[0] = 0x%1x\n",tr->WCKmode[0] ));
+ mcSHOW_DBG_MSG(("WCKmode[1] = 0x%1x\n",tr->WCKmode[1] ));
+ mcSHOW_DBG_MSG(("RECC = 0x%1x\n",tr->RECC ));
+ mcSHOW_DBG_MSG(("WECC = 0x%1x\n",tr->WECC ));
+ mcSHOW_DBG_MSG(("BankMode = 0x%1x\n",tr->BankMode ));
+ mcSHOW_DBG_MSG(("WORK_FSP = 0x%1x\n",tr->WORK_FSP ));
+ mcSHOW_DBG_MSG(("=================================== \n"));
+}