8 #include <soc/dramc_register.h>
9 #include <soc/dramc_param.h>
10 #include <soc/dramc_pi_api.h>
30 #define WRITE_LEVELING_MOVD_DQS 1
31 #define TEST2_1_CAL 0x55000000
32 #define TEST2_2_CAL 0xaa000400
91 MISC_STATUSA_REFRESH_QUEUE_CNT) * 4);
129 write32(&
ch[chn].ao.ckectrl, ckectrl_bak);
142 dramc_dbg(
"Mode reg read rank%d MR%d = %#x\n", rank, mr_idx,
value);
150 dramc_dbg(
"Mode reg write rank%d MR%d = 0x%x\n", rank, mr_idx,
value);
160 u32 tmp_0p5t, tmp_2t;
166 sum = (tmp_2t <<
DQ_DIV_SHIFT) + tmp_0p5t + shift_coarse_tune;
183 &
ch[chn].ao.shu[0].selph_dqs0,
byte * 4, shift_coarse_tune);
187 s8 shift_coarse_tune)
190 &
ch[chn].ao.shu[0].selph_dqs0,
byte * 4 +
OEN_SHIFT, shift_coarse_tune);
197 &
ch[chn].ao.shu[0].rk[rank].selph_dq[1],
byte * 4, shift_coarse_tune);
201 &
ch[chn].ao.shu[0].rk[rank].selph_dq[0],
byte * 4, shift_coarse_tune);
205 u8 byte,
s8 shift_coarse_tune)
209 &
ch[chn].ao.shu[0].rk[rank].selph_dq[1],
210 byte * 4 +
OEN_SHIFT, shift_coarse_tune);
214 &
ch[chn].ao.shu[0].rk[rank].selph_dq[0],
215 byte * 4 +
OEN_SHIFT, shift_coarse_tune);
240 SHU1_R0_CA_CMD9_RG_RK0_ARPI_CLK, 0);
242 for (
size_t byte = 0;
byte <
DQS_NUMBER;
byte++) {
243 u32 wrlevel_dq_delay = wr_level[chn][rank][byte] + 0x10;
245 FINE_TUNE_PBYTE, wr_level[chn][rank][
byte]);
246 if (wrlevel_dq_delay >= 0x40) {
247 wrlevel_dq_delay -= 0x40;
252 FINE_TUNE_DQM, wrlevel_dq_delay,
253 FINE_TUNE_DQ, wrlevel_dq_delay);
260 SHU1_R0_CA_CMD0_RK0_TX_ARCA0_DLY, 0,
261 SHU1_R0_CA_CMD0_RK0_TX_ARCA1_DLY, 0,
262 SHU1_R0_CA_CMD0_RK0_TX_ARCA2_DLY, 0,
263 SHU1_R0_CA_CMD0_RK0_TX_ARCA3_DLY, 0,
264 SHU1_R0_CA_CMD0_RK0_TX_ARCA4_DLY, 0,
265 SHU1_R0_CA_CMD0_RK0_TX_ARCA5_DLY, 0);
299 MR13Value &= ~(
BIT(6));
312 u8 fix_dqien = (cbt_on == 1) ? 3 : 0;
317 B0_DQ5_RG_RX_ARDQ_EYE_VREF_EN_B0, cbt_on);
319 B1_DQ5_RG_RX_ARDQ_EYE_VREF_EN_B1, cbt_on);
321 B0_DQ3_RG_RX_ARDQ_SMT_EN_B0, cbt_on);
323 B1_DQ3_RG_RX_ARDQ_SMT_EN_B1, cbt_on);
331 DRAMC_PD_CTRL_PHYCLKDYNGEN, 0,
332 DRAMC_PD_CTRL_DCMEN, 0);
361 if (cbt_mode == 0 && !is_final) {
380 const u8 *perbit_dly;
381 u8 clk_dly =
params->cbt_clk_dly[chn][rank];
382 u8 cmd_dly =
params->cbt_cmd_dly[chn][rank];
385 for (
u8 rk = 0; rk < rank + 1; rk++) {
388 SHU1_R0_CA_CMD9_RG_RK0_ARPI_CMD, cmd_dly,
389 SHU1_R0_CA_CMD9_RG_RK0_ARPI_CLK, clk_dly);
392 perbit_dly =
params->cbt_ca_perbit_delay[chn][rk];
396 SHU1_R0_CA_CMD0_RK0_TX_ARCA0_DLY, perbit_dly[ca_mapping[0]],
397 SHU1_R0_CA_CMD0_RK0_TX_ARCA1_DLY, perbit_dly[ca_mapping[1]],
398 SHU1_R0_CA_CMD0_RK0_TX_ARCA2_DLY, perbit_dly[ca_mapping[2]],
399 SHU1_R0_CA_CMD0_RK0_TX_ARCA3_DLY, perbit_dly[ca_mapping[3]],
400 SHU1_R0_CA_CMD0_RK0_TX_ARCA4_DLY, perbit_dly[ca_mapping[4]],
401 SHU1_R0_CA_CMD0_RK0_TX_ARCA5_DLY, perbit_dly[ca_mapping[5]]);
407 u8 vref_bit, vref_new, vref_org;
410 vref_org =
BIT(6) | (vref_level & 0x3f);
413 dramc_dbg(
"vref_org: %#x for byte mode\n", vref_org);
417 for (vref_bit = 0; vref_bit < 8; vref_bit++) {
418 if (vref_org & (1 << vref_bit))
422 dramc_dbg(
"vref_new: %#x --> %#x\n", vref_org, vref_new);
430 static bool phy_pll_en =
true;
436 shu_ack |= (0x1 << chn);
441 dramc_dbg(
"DFS jump to CLRPLL, shu lev=%d, ACK=%x\n",
446 dramc_dbg(
"DFS jump to PHYPLL, shu lev=%d, ACK=%x\n",
451 SPM_POWER_ON_VAL0_SC_PHYPLL1_SHU_EN_PCM, 0);
453 SPM_POWER_ON_VAL0_SC_PHYPLL2_SHU_EN_PCM, 0);
455 SPM_POWER_ON_VAL0_SC_DR_SHU_LEVEL_PCM, 0);
457 SPM_POWER_ON_VAL0_SC_DR_SHU_LEVEL_PCM, shu_level);
461 SPM_POWER_ON_VAL0_SC_PHYPLL2_SHU_EN_PCM, 1);
467 SPM_POWER_ON_VAL0_SC_PHYPLL1_SHU_EN_PCM, 1);
474 SPM_POWER_ON_VAL0_SC_TX_TRACKING_DIS, 3);
478 SPM_POWER_ON_VAL0_SC_DDRPHY_FB_CK_EN_PCM, 1);
480 SPM_POWER_ON_VAL0_SC_DPHY_RXDLY_TRACK_EN, 0);
482 SPM_POWER_ON_VAL0_SC_DR_SHU_EN_PCM, 1);
485 DRAMC_DPY_CLK_SW_CON_SC_DMDRAMCSHU_ACK) & shu_ack)
490 SPM_POWER_ON_VAL0_SC_DR_SHU_EN_PCM, 0);
494 SPM_POWER_ON_VAL0_SC_DPHY_RXDLY_TRACK_EN, 3);
497 SPM_POWER_ON_VAL0_SC_TX_TRACKING_DIS, 0);
499 SPM_POWER_ON_VAL0_SC_DDRPHY_FB_CK_EN_PCM, 0);
507 phy_pll_en = !phy_pll_en;
522 u8 final_vref, cs_dly;
526 cs_dly =
params->cbt_cs_dly[chn][rank];
527 final_vref =
params->cbt_final_vref[chn][rank];
530 {&
ch[chn].ao.dramc_pd_ctrl},
531 {&
ch[chn].ao.stbcal},
532 {&
ch[chn].ao.ckectrl},
533 {&
ch[chn].ao.write_lev},
534 {&
ch[chn].ao.refctrl0},
535 {&
ch[chn].ao.spcmdctrl},
538 for (
int i = 0; i <
ARRAY_SIZE(regs_bak); i++)
582 for (
u8 rk = 0; rk < rank + 1; rk++) {
585 SHU1_R0_CA_CMD9_RG_RK0_ARPI_CS, cs_dly);
590 cbt_exit(chn, rank, fsp, mr, cbt_mode);
609 for (
int i = 0; i <
ARRAY_SIZE(regs_bak); i++)
615 for (
size_t b = 0; b < 2; b++)
617 SHU1_B0_DQ7_R_DMDQMDBI_SHU_B0, on);
627 clrsetbits32(&
ch[chn].phy.misc_cg_ctrl0, (0x3 << 19) | (0x3ff << 8),
628 ((en ? 0 : 0x1) << 19) | ((en ? 0 : 0x1ff) << 9) | (1 << 8));
631 struct ddrphy_ao_shu *shu = &
ch[chn].phy.shu[i];
632 for (
size_t b = 0; b < 2; b++)
634 ((en ? 0 : 0x7ff) << 22) | (0x1 << 21) |
635 ((en ? 0 : 0x3) << 19));
636 clrbits32(&shu->ca_cmd[8], 0x1fff << 19);
638 clrsetbits32(&
ch[chn].phy.misc_cg_ctrl5, (0x7 << 16) | (0x7 << 20),
639 ((en ? 0x7 : 0) << 16) | ((en ? 0x7 : 0) << 20));
644 clrbits32(&
ch[chn].phy.b[0].dll_fine_tune[1], 0x1 << 20);
645 clrbits32(&
ch[chn].phy.b[1].dll_fine_tune[1], 0x1 << 20);
646 clrbits32(&
ch[chn].phy.ca_dll_fine_tune[1], 0x1 << 20);
649 struct ddrphy_ao_shu *shu = &
ch[chn].phy.shu[i];
656 (0x1 << 0) | (0x1 << 1) | (0x1 << 2) |
657 (0x1 << 5) | (0x1 << 26) | (0x1 << 30) | (0x1 << 31),
658 ((en ? 0x1 : 0) << 0) | ((en ? 0x1 : 0) << 1) |
659 ((en ? 0x1 : 0) << 2) | ((en ? 0 : 0x1) << 5) |
660 ((en ? 0 : 0x1) << 26) | ((en ? 0x1 : 0) << 30) |
661 ((en ? 0x1 : 0) << 31));
665 0x8060033e | (0x40 << (en ? 0x1 : 0)));
667 0x8060033f | (0x40 << (en ? 0x1 : 0)));
669 0x8060033e | (0x40 << (en ? 0x1 : 0)));
672 (en ? 0 : 0x3) << 26);
676 struct ddrphy_ao_shu *shu = &
ch[chn].phy.shu[i];
688 for (
size_t rank = 0; rank <
RANK_MAX; rank++) {
690 &
ch[chn].phy.shu[0].rk[rank];
702 (on ? 0x3 : 0) << 14);
703 clrsetbits32(&
ch[chn].ao.stbcal2, 0x1 << 28, (on ? 0x1 : 0) << 28);
704 clrsetbits32(&
ch[chn].ao.stbcal, 0x1 << 24, (on ? 0x1 : 0) << 24);
705 clrsetbits32(&
ch[chn].ao.stbcal, 0x1 << 22, (on ? 0x1 : 0) << 22);
712 struct ddrphy_ao_shu *shu = &
ch[chn].phy.shu[0];
714 switch (freq_group) {
726 die(
"Invalid DDR frequency group %u\n", freq_group);
730 clrsetbits32(&shu->b[0].dq[5], 0x7 << 20, dvs_delay << 20);
731 clrsetbits32(&shu->b[1].dq[5], 0x7 << 20, dvs_delay << 20);
732 clrbits32(&shu->b[0].dq[7], (0x1 << 12) | (0x1 << 13));
733 clrbits32(&shu->b[1].dq[7], (0x1 << 12) | (0x1 << 13));
742 setbits32(&
ch[chn].ao.shu[0].conf[3], 0x1ff << 16);
748 setbits32(&
ch[chn].ao.shu[shu].conf[3], 0x1ff << 0);
777 clrbits32(&
ch[chn].ao.dummy_rd, (0x1 << 7) | (0x7 << 20));
781 for (
size_t r = 0; r < 2; r++) {
782 for (
size_t b = 0; b < 2; b++)
784 (0x1 << 28) | (0x1 << 23) | (0x3 << 30));
800 clrbits32(&
ch[chn].ao.shu[0].drving[0], 0x1 << 31);
802 setbits32(&
ch[chn].ao.shu[0].drving[0], 0x1 << 31);
808 for (
u8 rank = 0; rank < rk_num; rank++)
813 clrbits32(&
ch[chn].ao.shu[shu].hwset_vrcg, 0x1 << 19);
819 write32(&
ch[chn].phy.misc_cg_ctrl4, 0x11400000);
845 clrbits32(&
ch[chn].ao.dummy_rd, (0x7 << 20) | (0x1 << 7));
856 for (
size_t b = 0; b < 2; b++)
858 (flag ? 1 : 0) << 5);
872 TEST2_4_TEST_REQ_LEN1, 0,
873 TEST2_4_TESTXTALKPAT, 0,
874 TEST2_4_TESTAUDMODE, 0,
875 TEST2_4_TESTAUDBITINV, 0);
880 TEST2_4_TESTSSOPAT, 0,
881 TEST2_4_TESTSSOXTALKPAT, 0,
882 TEST2_4_TESTXTALKPAT, 1);
885 TEST2_4_TESTAUDINIT, 0x11,
886 TEST2_4_TESTAUDINC, 0xd,
887 TEST2_4_TESTAUDBITINV, 1);
890 TEST2_3_TESTAUDPAT, test_pat, TEST2_3_TESTCNT, 0);
898 DUMMY_RD_DQSG_DMYRD_EN, 0,
899 DUMMY_RD_DQSG_DMYWR_EN, 0,
900 DUMMY_RD_DUMMY_RD_EN, 0,
901 DUMMY_RD_SREF_DMYRD_EN, 0,
902 DUMMY_RD_DMY_RD_DBG, 0,
903 DUMMY_RD_DMY_WR_DBG, 0);
905 TESTCHIP_DMA1_DMA_LP4MATAB_OPT, 0);
911 TEST2_0_PAT1, t2_2 >> 24);
929 while (
wait_us(100,
read32(&
ch[chn].nao.testrpt) & status) != status) {
937 u8 rank_status = ((
read32(&
ch[chn].ao.test2_3) & 0xf) == 1) ? 3 : 1;
943 TEST2_3_TEST2R, 0, TEST2_3_TEST1, 0);
958 TEST2_3_TEST2W, 0, TEST2_3_TEST2R, 1, TEST2_3_TEST1, 0);
961 TEST2_3_TEST2W, 1, TEST2_3_TEST2R, 0, TEST2_3_TEST1, 0);
969 TEST2_3_TEST2W, 0, TEST2_3_TEST2R, 0, TEST2_3_TEST1, 0);
981 u8 dly_coarse_large,
u8 dly_coarse_0p5t,
u8 *pass_begin,
u8 *pass_count,
982 u8 *pass_count_1,
u8 *dly_fine_xt,
u8 *dqs_high,
u8 *dqs_done)
984 bool find_tune =
false;
985 u16 debug_cnt_perbyte, current_pass = 0, pass_byte_cnt = 0;
988 u8 dqs_result_r = (
u8) ((result_r >> (8 * dqs)) & 0xff);
989 u8 dqs_result_f = (
u8) ((result_f >> (8 * dqs)) & 0xff);
991 if (pass_byte_cnt & (1 << dqs))
995 debug_cnt_perbyte = (
u16) debug_cnt[dqs];
996 if (dqs_result_r == 0 && dqs_result_f == 0 &&
1001 if (pass_begin[dqs] == 0) {
1002 pass_begin[dqs] = 1;
1003 pass_count_1[dqs] = 0;
1004 dramc_dbg(
"[Byte %d]First pass (%d, %d, %d)\n",
1005 dqs, dly_coarse_large, dly_coarse_0p5t, *dly_fine_xt);
1008 if (pass_begin[dqs] == 1)
1009 pass_count_1[dqs]++;
1011 if (pass_begin[dqs] == 1 &&
1019 dramc_dbg(
"All bytes gating window > 1 coarse_tune, Early break\n");
1024 if (pass_begin[dqs] != 1)
1027 dramc_dbg(
"[Byte %d] pass_begin[dqs]:%d, pass_count[dqs]:%d,pass_count_1:%d\n",
1028 dqs, pass_begin[dqs], pass_count[dqs], pass_count_1[dqs]);
1030 pass_begin[dqs] = 0;
1031 if (pass_count_1[dqs] > pass_count[dqs]) {
1032 pass_count[dqs] = pass_count_1[dqs];
1035 pass_byte_cnt |= (1 << dqs);
1036 if (pass_byte_cnt == 3) {
1048 u8 dly_fine_xt,
u8 *dqs_high,
u8 *dly_coarse_large_cnt,
1049 u8 *dly_coarse_0p5t_cnt,
u8 *dly_fine_tune_cnt,
u8 *dqs_trans,
u8 *dqs_done)
1051 for (
size_t dqs = 0; dqs <
DQS_NUMBER; dqs++) {
1052 u32 dqs_cnt =
read32(&
ch[chn].phy_nao.misc_phy_stben_b[dqs]);
1053 dqs_cnt = (dqs_cnt >> 16) & 3;
1055 if (dqs_done[dqs] == 1)
1066 dly_coarse_large_cnt[dqs] = dly_coarse_large;
1067 dly_coarse_0p5t_cnt[dqs] = dly_coarse_0p5t;
1068 dly_fine_tune_cnt[dqs] = dly_fine_xt;
1073 if (dqs_trans[dqs] == 1)
1074 dramc_dbg(
"[Byte %ld] Lead/lag falling Transition"
1076 dqs, dly_coarse_large_cnt[dqs],
1077 dly_coarse_0p5t_cnt[dqs], dly_fine_tune_cnt[dqs]);
1081 dramc_dbg(
"[Byte %ld] Lead/lag Transition tap number (%d)\n",
1082 dqs, dqs_trans[dqs]);
1093 clrbits32(&
ch[chn].phy.b[0].dq[9], (1 << 4) | (1 << 0));
1094 clrbits32(&
ch[chn].phy.b[1].dq[9], (1 << 4) | (1 << 0));
1097 setbits32(&
ch[chn].phy.b[1].dq[9], (1 << 4) | (1 << 0));
1098 setbits32(&
ch[chn].phy.b[0].dq[9], (1 << 4) | (1 << 0));
1105 u8 vref = 0, burst = 0;
1112 for (
size_t b = 0; b < 2; b++) {
1120 clrbits32(&
ch[chn].phy.b[0].dq[9], (0x1 << 4) | (0x1 << 0));
1121 clrbits32(&
ch[chn].phy.b[1].dq[9], (0x1 << 4) | (0x1 << 0));
1123 setbits32(&
ch[chn].phy.b[1].dq[9], (0x1 << 4) | (0x1 << 0));
1124 setbits32(&
ch[chn].phy.b[0].dq[9], (0x1 << 4) | (0x1 << 0));
1149 (dly << 0) | (dly << 8) | (dly << 16) | (dly << 24) |
1150 (dly_p1 << 4) | (dly_p1 << 12) | (dly_p1 << 20) | (dly_p1 << 28));
1154 u8 *best_coarse_tune2t,
u8 *best_coarse_tune0p5t,
1155 u8 *best_coarse_tune2t_p1,
u8 *best_coarse_tune0p5t_p1)
1165 (best_coarse_tune2t[0] << 0) | (best_coarse_tune2t[1] << 8) |
1166 (best_coarse_tune2t_p1[0] << 4) | (best_coarse_tune2t_p1[1] << 12));
1169 (best_coarse_tune0p5t[0] << 0) | (best_coarse_tune0p5t[1] << 8) |
1170 (best_coarse_tune0p5t_p1[0] << 4) | (best_coarse_tune0p5t_p1[1] << 12));
1172 for (
size_t dqs = 0; dqs <
DQS_NUMBER; dqs++) {
1173 u8 tmp_value = (best_coarse_tune2t[dqs] << 3)
1174 + best_coarse_tune0p5t[dqs];
1176 if (tmp_value >= 11) {
1178 best_coarse_rodt[dqs] = tmp_value >> 3;
1179 best_coarse_0p5t_rodt[dqs] =
1180 tmp_value - (best_coarse_rodt[dqs] << 3);
1182 tmp_value = (best_coarse_tune2t_p1[dqs] << 3) +
1183 best_coarse_tune0p5t_p1[dqs] - 11;
1184 best_coarse_rodt_p1[dqs] = tmp_value >> 3;
1185 best_coarse_0p5t_rodt_p1[dqs] =
1186 tmp_value - (best_coarse_rodt_p1[dqs] << 3);
1188 dramc_dbg(
"Best RODT dly(2T, 0.5T) = (%d, %d)\n",
1189 best_coarse_rodt[dqs],
1190 best_coarse_0p5t_rodt[dqs]);
1192 best_coarse_rodt[dqs] = 0;
1193 best_coarse_0p5t_rodt[dqs] = 0;
1194 best_coarse_rodt_p1[dqs] = 4;
1195 best_coarse_0p5t_rodt_p1[dqs] = 4;
1196 dramc_dbg(
"RxdqsGatingCal error: best_coarse_tune2t:%zd"
1197 " is already 0. RODT cannot be -1 coarse\n",
1204 (best_coarse_rodt[0] << 0) | (best_coarse_rodt[1] << 8) |
1205 (best_coarse_rodt_p1[0] << 4) | (best_coarse_rodt_p1[1] << 12));
1208 (best_coarse_0p5t_rodt[0] << 0) | (best_coarse_0p5t_rodt[1] << 8) |
1209 (best_coarse_0p5t_rodt_p1[0] << 4) | (best_coarse_0p5t_rodt_p1[1] << 12));
1213 u32 coarse_start,
u32 coarse_end,
u8 freqDiv,
1214 u8 *pass_begin,
u8 *pass_count,
u8 *pass_count_1,
u8 *dqs_done,
1215 u8 *dqs_high,
u8 *dqs_transition,
u8 *dly_coarse_large_cnt,
1216 u8 *dly_coarse_0p5t_cnt,
u8 *dly_fine_tune_cnt)
1221 for (
u32 coarse_tune = coarse_start; coarse_tune < coarse_end;
1223 u32 dly_coarse_large_rodt = 0, dly_coarse_0p5t_rodt = 0;
1224 u32 dly_coarse_large_rodt_p1 = 4, dly_coarse_0p5t_rodt_p1 = 4;
1230 u32 value = (dly_coarse_large << 3) + dly_coarse_0p5t;
1234 dly_coarse_large_rodt =
value >> 3;
1235 dly_coarse_0p5t_rodt =
1236 value - (dly_coarse_large_rodt << 3);
1237 value = (dly_coarse_large << 3) + dly_coarse_0p5t - 11;
1238 dly_coarse_large_rodt_p1 =
value >> 3;
1239 dly_coarse_0p5t_rodt_p1 =
1240 value - (dly_coarse_large_rodt_p1 << 3);
1244 dly_coarse_large, dly_coarse_large_p1);
1246 dly_coarse_0p5t, dly_coarse_0p5t_p1);
1248 dly_coarse_large_rodt, dly_coarse_large_rodt_p1);
1250 dly_coarse_0p5t_rodt, dly_coarse_0p5t_rodt_p1);
1256 SHURK_DQSIEN_DQS0IEN, dly_fine_xt,
1257 SHURK_DQSIEN_DQS1IEN, dly_fine_xt);
1267 &
ch[chn].phy.misc_stberr_rk0_r,
1268 MISC_STBERR_RK_R_STBERR_RK_R);
1270 &
ch[chn].phy.misc_stberr_rk0_f,
1271 MISC_STBERR_RK_F_STBERR_RK_F);
1273 debug_cnt[0] =
read32(&
ch[chn].nao.dqsgnwcnt[0]);
1274 debug_cnt[1] = (debug_cnt[0] >> 16) & 0xffff;
1275 debug_cnt[0] &= 0xffff;
1281 dly_coarse_0p5t, dly_fine_xt, dqs_high,
1282 dly_coarse_large_cnt, dly_coarse_0p5t_cnt,
1283 dly_fine_tune_cnt, dqs_transition, dqs_done);
1285 dramc_dbg(
"%d %d %d |", dly_coarse_large,
1286 dly_coarse_0p5t, dly_fine_xt);
1299 dly_coarse_large, dly_coarse_0p5t, pass_begin,
1300 pass_count, pass_count_1, &dly_fine_xt,
1301 dqs_high, dqs_done))
1302 coarse_tune = coarse_end;
1311 u8 dqs, fsp, freqDiv = 4;
1322 u32 coarse_start, coarse_end;
1325 {&
ch[chn].ao.stbcal},
1326 {&
ch[chn].ao.stbcal1},
1327 {&
ch[chn].ao.ddrconf0},
1328 {&
ch[chn].ao.spcmd},
1329 {&
ch[chn].ao.refctrl0},
1330 {&
ch[chn].phy.b[0].dq[6]},
1331 {&
ch[chn].phy.b[1].dq[6]},
1333 for (
size_t i = 0; i <
ARRAY_SIZE(regs_bak); i++)
1342 u32 dummy_rd_backup =
read32(&
ch[chn].ao.dummy_rd);
1345 switch (freq_group) {
1359 die(
"Invalid DDR frequency group %u\n", freq_group);
1362 coarse_end = coarse_start + 12;
1368 coarse_start, coarse_end,
1369 freqDiv, pass_begin, pass_count, pass_count_1, dqs_done,
1370 dqs_high, dqs_transition, dly_coarse_large_cnt,
1371 dly_coarse_0p5t_cnt, dly_fine_tune_cnt);
1377 dramc_dbg(
"[bypass Gating params] dqs: %d\n", dqs);
1378 pass_count[dqs] =
params->gating_pass_count[chn][rank][dqs];
1379 min_fine_tune[dqs] =
params->gating_fine_tune[chn][rank][dqs];
1380 min_coarse_tune0p5t[dqs] =
params->gating05T[chn][rank][dqs];
1381 min_coarse_tune2t[dqs] =
params->gating2T[chn][rank][dqs];
1383 pass_count[dqs] = dqs_transition[dqs];
1384 min_fine_tune[dqs] = dly_fine_tune_cnt[dqs];
1385 min_coarse_tune0p5t[dqs] = dly_coarse_0p5t_cnt[dqs];
1386 min_coarse_tune2t[dqs] = dly_coarse_large_cnt[dqs];
1389 u8 tmp_value = min_fine_tune[dqs] + tmp_offset;
1393 tmp_value = min_coarse_tune0p5t[dqs] + tmp_offset;
1397 best_coarse_tune2t[dqs] = min_coarse_tune2t[dqs] + tmp_offset;
1399 tmp_value = best_coarse_tune0p5t[dqs] + freqDiv;
1403 best_coarse_tune2t_p1[dqs] =
1404 best_coarse_tune2t[dqs] + tmp_offset;
1408 dramc_dbg(
"Best DQS%d dly(2T, 0.5T, fine tune)"
1409 " = (%d, %d, %d)\n", dqs, best_coarse_tune2t[dqs],
1410 best_coarse_tune0p5t[dqs], best_fine_tune[dqs]);
1413 dramc_dbg(
"Best DQS%d P1 dly(2T, 0.5T, fine tune)"
1414 " = (%d, %d, %d)\n", dqs, best_coarse_tune2t_p1[dqs],
1415 best_coarse_tune0p5t_p1[dqs], best_fine_tune[dqs]);
1417 for (
size_t i = 0; i <
ARRAY_SIZE(regs_bak); i++)
1423 best_coarse_tune0p5t, best_coarse_tune2t_p1, best_coarse_tune0p5t_p1);
1426 SHURK_DQSIEN_DQS0IEN, best_fine_tune[0],
1427 SHURK_DQSIEN_DQS1IEN, best_fine_tune[1]);
1437 for (
size_t b = 0; b < 2; b++)
1438 clrbits32(&
ch[chn].phy.shu[0].b[b].dq[7], 0x1 << 7);
1444 temp_value |= ((0x5555 >> bit) & 0x1) << lpddr_phy_mapping[bit];
1446 u16 mr15_golden_value = temp_value & 0xff;
1447 u16 mr20_golden_value = (temp_value >> 8) & 0xff;
1449 MR_GOLDEN_MR15_GOLDEN, mr15_golden_value,
1450 MR_GOLDEN_MR20_GOLDEN, mr20_golden_value);
1461 dramc_dbg(
"[RDDQC] resp fail (time out)\n");
1484 for (
size_t b = 0; b < 2; b++)
1486 SHU1_BX_DQ5_RG_RX_ARDQ_VREF_SEL_B0, vref);
1506 u8 tune = 3, fine_tune = 0;
1512 if (adjust_center) {
1513 if (fine_tune < 10) {
1537 for (dq = 2; dq < 6; dq++)
1538 for (b = 0; b < 2; b++)
1540 SHU1_R0_B0_DQ6_RK0_RX_ARDQM0_F_DLY_B0,
val,
1541 SHU1_R0_B0_DQ6_RK0_RX_ARDQM0_R_DLY_B0,
val,
1542 SHU1_R0_B0_DQ6_RK0_RX_ARDQS0_F_DLY_B0,
val,
1543 SHU1_R0_B0_DQ6_RK0_RX_ARDQS0_R_DLY_B0,
val);
1547 for (b = 0; b < 2; b++)
1549 SHU1_R0_B0_DQ6_RK0_RX_ARDQM0_F_DLY_B0,
val,
1550 SHU1_R0_B0_DQ6_RK0_RX_ARDQM0_R_DLY_B0,
val);
1554 for (b = 0; b < 2; b++)
1556 SHU1_R0_B0_DQ6_RK0_RX_ARDQS0_F_DLY_B0,
val,
1557 SHU1_R0_B0_DQ6_RK0_RX_ARDQS0_R_DLY_B0,
val);
1569 u32 dly_large = 0, dly_large_oen = 0, dly_small = 0, dly_small_oen = 0;
1570 u32 adjust_center = 0;
1574 for (
u8 i = 0; i < 4; i++) {
1589 0x77777777, dly_large | (dly_large_oen << 16));
1591 0x77777777, dly_small | (dly_small_oen << 16));
1597 0x77777777, dly_large | (dly_large_oen << 16));
1599 0x77777777, dly_small | (dly_small_oen << 16));
1605 for (
size_t b = 0; b < 2; b++)
1610 for (
size_t b = 0; b < 2; b++)
1619 u32 min_dly = 0xffff, virtual_delay = 0;
1620 u32 tx_dly =
read32(&
ch[chn].ao.shu[0].selph_dqs0);
1624 for (
size_t dqs = 0; dqs <
DQS_NUMBER; dqs++) {
1625 tmp = ((tx_dly >> (dqs << 2) & 0x7) << mck) +
1626 (dly >> (dqs << 2) & 0x7);
1627 virtual_delay = (tmp << 5) +
params->wr_level[chn][rank][dqs];
1628 min_dly =
MIN(min_dly, virtual_delay);
1635 u8 freq_group,
u16 *pre_cal,
s16 *begin,
s16 *end,
1642 switch (freq_group) {
1654 die(
"Invalid DDR frequency group %u\n", freq_group);
1663 *end = *begin + 256;
1667 pre_dq_dly =
MIN(pre_cal[0], pre_cal[1]);
1668 pre_dq_dly = (pre_dq_dly > 24) ? (pre_dq_dly - 24) : 0;
1669 *begin = pre_dq_dly;
1679 s16 dly,
s16 dly_end,
bool fail_bit)
1689 else if (dly == dly_end)
1695 if (pass_win >= best_pass_win) {
1714 delay[bit].win_center = (
delay[bit].best_first +
delay[bit].best_last) >> 1;
1727 u32 win_size, min_bit = 0xff, min_winsize = 0xffff, tmp_win_sum = 0;
1733 win_size =
delay[bit].best_last -
delay[bit].best_first;
1735 if (win_size < min_winsize) {
1737 min_winsize = win_size;
1739 tmp_win_sum += win_size;
1741 dramc_dbg(
"type:%d vref:%d Min Bit=%d, min_winsize=%d, win sum:%d\n",
1742 type, vref, min_bit, min_winsize, tmp_win_sum);
1745 *win_min_max = min_winsize;
1751 dramc_dbg(
"type:%d vref:%d, win_sum_total:%d, tmp_win_sum:%d)\n",
1755 if (tmp_win_sum < vref_dly->max_win_sum * 95 / 100) {
1756 dramc_dbg(
"type:%d best vref found[%d], early break! (%d < %d)\n",
1766 win_size =
delay[bit].best_last -
delay[bit].best_first;
1768 if (win_size < min_winsize) {
1770 min_winsize = win_size;
1772 tmp_win_sum += win_size;
1774 dramc_dbg(
"type:%d vref:%d Min Bit=%d, min_winsize=%d, win sum:%d\n",
1775 type, vref, min_bit, min_winsize, tmp_win_sum);
1777 if (min_winsize > *win_min_max ||
1778 (min_winsize == *win_min_max &&
1780 *win_min_max = min_winsize;
1786 dramc_dbg(
"type:%d vref:%d, win_sum_total:%d, tmp_win_sum:%d)\n",
1790 if (tmp_win_sum < vref_dly->max_win_sum * 95 / 100) {
1791 dramc_dbg(
"type:%d best vref found[%d], early break! (%d < %d)\n",
1823 u8 use_delay_cell,
u32 *byte_dly_cell)
1825 u32 dq_large = 0, dq_large_oen = 0, dq_small = 0, dq_small_oen = 0, adjust_center = 1;
1826 u32 dqm_large = 0, dqm_large_oen = 0, dqm_small = 0, dqm_small_oen = 0;
1833 adjust_center, &dqdly_tune[i]);
1835 adjust_center, &dqmdly_tune[i]);
1854 for (
size_t rank = rank_start; rank <
RANK_MAX; rank++) {
1856 0x77777777, dq_large | (dq_large_oen << 16));
1858 0x77777777, dq_small | (dq_small_oen << 16));
1860 0x77777777, dqm_large | (dqm_large_oen << 16));
1862 0x77777777, dqm_small | (dqm_small_oen << 16));
1864 for (
size_t byte = 0;
byte < 2;
byte++)
1866 FINE_TUNE_DQ, dqdly_tune[
byte].
fine_tune,
1867 FINE_TUNE_DQM, dqmdly_tune[
byte].
fine_tune);
1869 if (use_delay_cell == 1) {
1870 for (
size_t byte = 0;
byte <
DQS_NUMBER;
byte++)
1871 write32(&
ch[chn].phy.shu[0].rk[rank].b[
byte].dq[0],
1872 byte_dly_cell[
byte]);
1882 clrsetbits32(&
ch[chn].ao.shu[0].rk[rank].dqs2dq_cal1, 0x7ff | (0x7ff << 16),
1884 clrsetbits32(&
ch[chn].ao.shu[0].rk[rank].dqs2dq_cal2, 0x7ff | (0x7ff << 16),
1886 clrsetbits32(&
ch[chn].ao.shu[0].rk[rank].dqs2dq_cal5, 0x7ff | (0x7ff << 16),
1898 value = (dqsdly_byte[byte] << 24) | (dqsdly_byte[
byte] << 16) |
1899 (dqmdly_byte[byte] << 8) | (dqmdly_byte[
byte] << 0);
1908 u8 dq_num = 2 + bit / 2;
1910 (dly[index + 1].best_dqdly << 16) |
1911 (dly[index].
best_dqdly << 8) | (dly[index].best_dqdly << 0);
1934 dly = ¢er_dly[byte];
1939 index = bit + 8 * byte;
1940 if (vref_dly[index].win_center < dly->
min_center)
1942 if (vref_dly[index].win_center > dly->
max_center)
1945 dramc_dbg(
"center_dly[%d].min_center = %d, "
1946 "center_dly[%d].max_center = %d\n",
1961 switch (freq_group) {
1975 die(
"Invalid DDR frequency group %u\n", freq_group);
1985 u16 *tx_dq_precal_result,
u16 dly_cell_unit,
1987 const bool fast_calib)
1989 int index, clock_rate;
2002 if (fast_calib && bypass_tx) {
2003 dramc_dbg(
"bypass TX, clock_rate: %d\n", clock_rate);
2008 index = bit + 8 * byte;
2010 params->tx_win_center[chn][rank][index];
2012 params->tx_first_pass[chn][rank][index];
2014 params->tx_last_pass[chn][rank][index];
2022 if (use_delay_cell == 0) {
2025 tx_dq_precal_result[byte] = center_dly[byte].
final_dly;
2028 tx_dq_precal_result[byte] = (center_dly[byte].
min_center
2032 index = bit + 8 * byte;
2035 dq_delay_cell[index] = ((tune_diff * 100000000) /
2036 (clock_rate * 64)) / dly_cell_unit;
2037 byte_dly_cell[byte] |= (dq_delay_cell[index] << (bit * 4));
2038 dramc_dbg(
"u1DelayCellOfst[%d]=%d cells (%d PI)\n",
2039 index, dq_delay_cell[index], tune_diff);
2045 use_delay_cell, byte_dly_cell);
2050 u8 bit_first, bit_last;
2059 dqsdly_byte[byte] = 64;
2061 for (
u8 bit = bit_first; bit <= bit_last; bit++) {
2062 if (perbit_dly[bit].win_center < dqsdly_byte[
byte])
2063 dqsdly_byte[byte] = perbit_dly[bit].
win_center;
2065 dqsdly_byte[byte] = (dqsdly_byte[byte] > 0) ? 0 : -dqsdly_byte[
byte];
2067 for (
u8 bit = bit_first; bit <= bit_last; bit++) {
2068 perbit_dly[bit].
best_dqdly = dqsdly_byte[byte] +
2081 u8 *vref_scan_en,
u8 *vref_begin,
u8 *vref_end)
2093 *vref_begin = 27 - 5;
2124 s16 dly_begin,
s16 dly_end,
s16 dly_step,
2130 for (
s16 dly = dly_begin; dly < dly_end; dly += dly_step) {
2134 if (!vref_scan_enable)
2138 bool bit_fail = (err_value & ((
u32) 1 << bit)) != 0;
2144 dly, dly_end, bit_fail) > 7)
2145 finish_bit |= (1 << bit);
2147 if (vref_scan_enable)
2155 if (!vref_scan_enable)
2158 if (finish_bit == 0xffff && (err_value & 0xffff) == 0xffff) {
2160 "early break! delay=%#x\n", dly);
2168 const bool fast_calib)
2170 u8 vref = 0, vref_begin = 0, vref_end = 1, vref_step = 1, vref_use = 0;
2171 u8 vref_scan_enable = 0, small_reg_value = 0xff;
2172 s16 dly_begin = 0, dly_end = 0, dly_step = 1;
2173 u32 dummy_rd_bak_engine2 = 0, finish_bit, win_min_max = 0;
2177 u16 dly_cell_unit =
params->delay_cell_unit;
2180 u8 vref_range = !fsp;
2181 bool bypass_tx_rx = !fsp;
2183 dramc_dbg(
"bypass TX RX window: %s\n", bypass_tx_rx ?
"Yes" :
"No");
2185 &vref_scan_enable, &vref_begin, &vref_end);
2187 &dly_begin, &dly_end,
params);
2191 vref_begin =
params->rx_vref[chn];
2192 vref_end = vref_begin + 1;
2193 dramc_dbg(
"bypass RX vref: %d\n", vref_begin);
2195 vref_begin =
params->tx_vref[chn][rank] | (vref_range << 6);
2196 vref_end = vref_begin + 1;
2197 dramc_dbg(
"bypass TX vref: %d\n", vref_begin);
2205 dramc_dbg(
"[channel %d] [rank %d] type: %d, vref_enable: %d, vref range[%d : %d]\n",
2206 chn, rank,
type, vref_scan_enable, vref_begin, vref_end);
2209 for (
size_t byte = 0;
byte < 2;
byte++) {
2210 write32(&
ch[chn].phy.shu[0].rk[rank].b[
byte].dq[0], 0);
2211 clrbits32(&
ch[chn].phy.shu[0].rk[rank].b[
byte].dq[1],
2220 if (fast_calib && bypass_tx_rx &&
2223 type, freq_group, dq_precal_result, dly_cell_unit,
2226 if (vref_scan_enable)
2236 dummy_rd_bak_engine2 =
read32(&
ch[chn].ao.dummy_rd);
2241 for (vref = vref_begin; vref < vref_end; vref += vref_step) {
2242 small_reg_value = 0xff;
2245 vref_use = vref | (vref_range << 6);
2256 if (vref_scan_enable)
2266 if (fast_calib && bypass_tx_rx &&
2271 params->rx_firspass[chn][rank][bit];
2273 params->rx_lastpass[chn][rank][bit];
2277 dly_begin, dly_end, dly_step,
2278 type, &small_reg_value,
2279 vref_scan_enable, win_perbit);
2283 dramc_dbg(
"Dq[%zd] win width (%d ~ %d) %d\n", bit,
2288 win_perbit, &win_min_max))
2305 dq_precal_result, dly_cell_unit,
params, fast_calib);
2315 u8 start_ext2 = 0, start_ext3 = 0, last_ext2 = 0, last_ext3 = 0;
2319 SHU_CONF1_DATLAT,
val,
2320 SHU_CONF1_DATLAT_DSEL,
val - 2,
2321 SHU_CONF1_DATLAT_DSEL_PHY,
val - 2);
2327 last_ext2 = last_ext3 = 1;
2332 SHU_PIPE_READ_START_EXTEND1, 1,
2333 SHU_PIPE_DLE_LAST_EXTEND1, 1,
2334 SHU_PIPE_READ_START_EXTEND2, start_ext2,
2335 SHU_PIPE_DLE_LAST_EXTEND2, last_ext2,
2336 SHU_PIPE_READ_START_EXTEND3, start_ext3,
2337 SHU_PIPE_DLE_LAST_EXTEND3, last_ext3);
2345 u32 datlat, begin = 0, first = 0, sum = 0, best_step;
2346 u32 datlat_start = 7;
2348 *test_passed =
true;
2351 dramc_dbg(
"[DATLAT] start. CH%d RK%d DATLAT Default: 0x%x\n",
2352 chn, rank, best_step);
2354 u32 dummy_rd_backup =
read32(&
ch[chn].ao.dummy_rd);
2358 best_step =
params->rx_datlat[chn][rank];
2359 dramc_dbg(
"bypass DATLAT, best_step: %d\n", best_step);
2380 dramc_dbg(
"Datlat=%2d, err_value=0x%4x, sum=%d\n", datlat, err, sum);
2385 *test_passed = (sum != 0);
2386 if (!*test_passed) {
2392 best_step = first + (sum >> 1);
2394 best_step = first + 2;
2395 dramc_dbg(
"First_step=%d, total pass=%d, best_step=%d\n",
2396 begin, sum, best_step);
2402 PADCTRL_DQIENQKEND, 1, PADCTRL_DQIENLATEBEGIN, 1);
2404 return (
u8) best_step;
2409 u8 final_datlat =
MAX(datlat0, datlat1);
2416 u32 read_dqsinctl, rankinctl_root, reg_tx_dly_dqsgated_min = 3;
2417 u8 txdly_cal_min = 0xff, txdly_cal_max = 0, tx_dly_dqs_gated = 0;
2422 reg_tx_dly_dqsgated_min = 2;
2424 reg_tx_dly_dqsgated_min = 1;
2427 for (
size_t rank = 0; rank < rk_num; rank++) {
2428 u32 dqsg0 =
read32(&
ch[chn].ao.shu[0].rk[rank].selph_dqsg0);
2429 for (
size_t dqs = 0; dqs <
DQS_NUMBER; dqs++) {
2430 best_coarse_tune2t[rank][dqs] = (dqsg0 >> (dqs * 8)) & 0x7;
2431 best_coarse_tune2t_p1[rank][dqs] = (dqsg0 >> (dqs * 8 + 4)) & 0x7;
2432 dramc_dbg(
"Rank%zd best DQS%zd dly(2T,(P1)2T)=(%d, %d)\n",
2433 rank, dqs, best_coarse_tune2t[rank][dqs],
2434 best_coarse_tune2t_p1[rank][dqs]);
2436 tx_dly_dqs_gated = best_coarse_tune2t[rank][dqs];
2437 txdly_cal_min =
MIN(txdly_cal_min, tx_dly_dqs_gated);
2439 tx_dly_dqs_gated = best_coarse_tune2t_p1[rank][dqs];
2440 txdly_cal_max =
MAX(txdly_cal_max, tx_dly_dqs_gated);
2444 dqsinctl = reg_tx_dly_dqsgated_min - txdly_cal_min;
2445 dramc_dbg(
"Dqsinctl:%d, dqsgated_min %d, txdly_cal_min %d, txdly_cal_max %d\n",
2446 dqsinctl, reg_tx_dly_dqsgated_min, txdly_cal_min, txdly_cal_max);
2448 if (dqsinctl != 0) {
2449 txdly_cal_min += dqsinctl;
2450 txdly_cal_max += dqsinctl;
2452 for (
size_t rank = 0; rank < rk_num; rank++) {
2454 for (
size_t dqs = 0; dqs <
DQS_NUMBER; dqs++) {
2455 best_coarse_tune2t[rank][dqs] += dqsinctl;
2456 best_coarse_tune2t_p1[rank][dqs] += dqsinctl;
2458 dramc_dbg(
"Best DQS%zd dly(2T) = (%d)\n",
2459 dqs, best_coarse_tune2t[rank][dqs]);
2460 dramc_dbg(
"Best DQS%zd P1 dly(2T) = (%d)\n",
2461 dqs, best_coarse_tune2t_p1[rank][dqs]);
2466 (best_coarse_tune2t[rank][0] << 0) |
2467 (best_coarse_tune2t[rank][1] << 8) |
2468 (best_coarse_tune2t_p1[rank][0] << 4) |
2469 (best_coarse_tune2t_p1[rank][1] << 12));
2474 SHURK_DQSCTL_DQSINCTL) - dqsinctl;
2475 rankinctl_root = (read_dqsinctl >= 2) ? (read_dqsinctl - 2) : 0;
2477 SET32_BITFIELDS(&
ch[chn].ao.shu[0].rk[0].dqsctl, SHURK_DQSCTL_DQSINCTL, read_dqsinctl);
2478 SET32_BITFIELDS(&
ch[chn].ao.shu[0].rk[1].dqsctl, SHURK_DQSCTL_DQSINCTL, read_dqsinctl);
2480 (0xf << 28) | (0xf << 20) | (0xf << 24) | 0xf,
2481 (read_dqsinctl << 28) | (rankinctl_root << 20) |
2482 (rankinctl_root << 24) | rankinctl_root);
2484 u8 ROEN =
read32(&
ch[chn].ao.shu[0].odtctrl) & 0x1;
2485 clrsetbits32(&
ch[chn].ao.shu[0].rodtenstb, (0xffff << 8) | (0x3f << 2) | (0x1),
2486 (0xff << 8) | (0x9 << 2) | ROEN);
2493 SPCMDRESP_DQSOSCEN_RESPONSE))) {
2501 u16 *osc_thrd_inc,
u16 *osc_thrd_dec)
2505 u16 dqsosc_cnt[2], dqs_cnt, dqsosc, thrd_inc, thrd_dec;
2506 u32 clock_rate, tck;
2510 {&
ch[chn].ao.dramc_pd_ctrl},
2511 {&
ch[chn].ao.ckectrl},
2514 for (
size_t i = 0; i <
ARRAY_SIZE(regs_bak); i++)
2526 SHU_SCINTV_DQSOSCENDIS, 1);
2529 DRAMC_PD_CTRL_MIOCKCTRLOFF, 1);
2538 dqsosc_cnt[0] = (mr18 & 0xff) | ((mr19 & 0xff) << 8);
2539 dqsosc_cnt[1] = (mr18 >> 8) | (mr19 & 0xff00);
2540 dramc_dbg(
"DQSOscCnt B0=%#x, B1=%#x\n", dqsosc_cnt[0], dqsosc_cnt[1]);
2544 tck = 1000000 / clock_rate;
2546 dqs_cnt = (mr18 & 0xff) | ((mr19 & 0xff) << 8);
2548 dqsosc = mr23 * 16 * 1000000 / (2 * dqs_cnt * clock_rate);
2549 thrd_inc = mr23 * tck * tck / (dqsosc * dqsosc * 10);
2550 thrd_dec = 3 * mr23 * tck * tck / (dqsosc * dqsosc * 20);
2556 osc_thrd_inc[rank] = thrd_inc;
2557 osc_thrd_dec[rank] = thrd_dec;
2558 dramc_dbg(
"CH%d_RK%d: MR18=%#x, MR19=%#x, DQSOSC=%d, MR23=%d, "
2560 chn, rank, mr18, mr19, dqsosc, mr23, thrd_inc, thrd_dec);
2562 for (
size_t i = 0; i <
ARRAY_SIZE(regs_bak); i++)
2566 SHU1RK0_DQSOSC_DQSOSC_BASE_RK0, dqsosc_cnt[0],
2567 SHU1RK0_DQSOSC_DQSOSC_BASE_RK0_B1, dqsosc_cnt[1]);
2577 RK2_DQSOSC_FREQ_RATIO_TX_0, freq_shu2 * 8 / freq_shu1,
2578 RK2_DQSOSC_FREQ_RATIO_TX_1, freq_shu3 * 8 / freq_shu1);
2580 RK2_DQSOSC_FREQ_RATIO_TX_3, freq_shu1 * 8 / freq_shu2,
2581 RK2_DQSOSC_FREQ_RATIO_TX_4, freq_shu3 * 8 / freq_shu2);
2583 RK2_DUMMY_RD_BK_FREQ_RATIO_TX_6,
2584 freq_shu1 * 8 / freq_shu3,
2585 RK2_DUMMY_RD_BK_FREQ_RATIO_TX_7,
2586 freq_shu2 * 8 / freq_shu3);
2589 PRE_TDQSCK1_SHU_PRELOAD_TX_HW, 1,
2590 PRE_TDQSCK1_SHU_PRELOAD_TX_START, 0,
2591 PRE_TDQSCK1_SW_UP_TX_NOW_CASE, 0);
2607 SHU_SCINTV_DQSOSCENDIS, 1);
2611 u16 *osc_thrd_inc,
u16 *osc_thrd_dec)
2613 u8 filt_pithrd, w2r_sel, upd_sel;
2615 u16 prd_cnt, thrd_inc, thrd_dec;
2618 SHU_SCINTV_DQS2DQ_SHU_PITHRD, 0);
2620 RK0_DQSOSC_R_DMDQS2DQ_FILT_OPT, 0);
2622 switch (freq_group) {
2644 die(
"Invalid DDR frequency group %u\n", freq_group);
2649 SHU_SCINTV_DQS2DQ_FILT_PITHRD, filt_pithrd);
2651 SHU1_WODT_TXUPD_W2R_SEL, w2r_sel,
2652 SHU1_WODT_TXUPD_SEL, upd_sel);
2654 prd_cnt = mr23 / 4 + 3;
2656 SHU1_DQSOSC_PRD_DQSOSC_PRDCNT, prd_cnt);
2658 SHU_DQSOSCR_DQSOSCRCNT, 0x40);
2661 thrd_inc = osc_thrd_inc[rk];
2662 thrd_dec = osc_thrd_dec[rk];
2666 SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK0,
2669 SHU_DQSOSCTHRD_DQSOSCTHRD_DEC_RK0,
2673 SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK1_7TO0,
2676 SHU1_DQSOSC_PRD_DQSOSCTHRD_INC_RK1_11TO8,
2677 (thrd_inc & 0xF00) >> 8);
2679 SHU1_DQSOSC_PRD_DQSOSCTHRD_DEC_RK1,
2685 SHU_DQSOSCR2_DQSOSCENCNT, 0x1FF);
2690 u32 jump_ratio_index = 0;
2692 u32 u4value = 0, u4value1 = 0;
2696 if (shu_src == shu_dst)
2707 dramc_dbg(
"Jump_RATIO [%d]: %x Freq %d -> %d DDR%d ->"
2710 jump_ratio[jump_ratio_index],
2711 shu_src + 1, shu_dst + 1,
2717 struct dramc_ao_regs_shu *shu = &
ch[chn].ao.shu[0];
2720 PRE_TDQSCK1_TDQSCK_PRECAL_HW, 1);
2722 PRE_TDQSCK2_TDDQSCK_JUMP_RATIO0, jump_ratio[0],
2723 PRE_TDQSCK2_TDDQSCK_JUMP_RATIO1, jump_ratio[1],
2724 PRE_TDQSCK2_TDDQSCK_JUMP_RATIO2, jump_ratio[2],
2725 PRE_TDQSCK2_TDDQSCK_JUMP_RATIO3, jump_ratio[3]);
2727 PRE_TDQSCK3_TDDQSCK_JUMP_RATIO4, jump_ratio[4],
2728 PRE_TDQSCK3_TDDQSCK_JUMP_RATIO5, jump_ratio[5],
2729 PRE_TDQSCK3_TDDQSCK_JUMP_RATIO6, jump_ratio[6],
2730 PRE_TDQSCK3_TDDQSCK_JUMP_RATIO7, jump_ratio[7]);
2732 PRE_TDQSCK4_TDDQSCK_JUMP_RATIO8, jump_ratio[8],
2733 PRE_TDQSCK4_TDDQSCK_JUMP_RATIO9, jump_ratio[9],
2734 PRE_TDQSCK4_TDDQSCK_JUMP_RATIO10, jump_ratio[10],
2735 PRE_TDQSCK4_TDDQSCK_JUMP_RATIO11, jump_ratio[11]);
2740 &shu[0].rk[rnk].selph_dqsg0,
2741 SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED);
2743 &shu[0].rk[rnk].selph_dqsg1,
2744 SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED);
2746 RK0_PRE_TDQSCK1_TDQSCK_UIFREQ1_B0R0,
2747 (u4value << 3) | u4value1);
2749 &shu[0].rk[rnk].dqsien,
2750 SHURK0_DQSIEN_R0DQS0IEN);
2752 RK0_PRE_TDQSCK1_TDQSCK_PIFREQ1_B0R0,
2755 &shu[0].rk[rnk].selph_dqsg0,
2756 SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1);
2758 &shu[0].rk[rnk].selph_dqsg1,
2759 SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1);
2761 RK0_PRE_TDQSCK3_TDQSCK_UIFREQ1_P1_B0R0,
2762 (u4value << 3) | u4value1);
2765 &shu[1].rk[rnk].selph_dqsg0,
2766 SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED);
2768 &shu[1].rk[rnk].selph_dqsg1,
2769 SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED);
2771 RK0_PRE_TDQSCK1_TDQSCK_UIFREQ2_B0R0,
2772 (u4value << 3) | u4value1);
2774 &shu[1].rk[rnk].dqsien,
2775 SHURK0_DQSIEN_R0DQS0IEN);
2777 RK0_PRE_TDQSCK1_TDQSCK_PIFREQ2_B0R0, u4value);
2779 &shu[1].rk[rnk].selph_dqsg0,
2780 SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1);
2782 &shu[1].rk[rnk].selph_dqsg1,
2783 SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1);
2785 RK0_PRE_TDQSCK3_TDQSCK_UIFREQ2_P1_B0R0,
2786 (u4value << 3) | u4value1);
2789 &shu[2].rk[rnk].selph_dqsg0,
2790 SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED);
2792 &shu[2].rk[rnk].selph_dqsg1,
2793 SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED);
2795 RK0_PRE_TDQSCK2_TDQSCK_UIFREQ3_B0R0,
2796 (u4value << 3) | u4value1);
2798 &shu[2].rk[rnk].dqsien,
2799 SHURK0_DQSIEN_R0DQS0IEN);
2801 RK0_PRE_TDQSCK2_TDQSCK_PIFREQ3_B0R0,
2804 &shu[2].rk[rnk].selph_dqsg0,
2805 SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1);
2807 &shu[2].rk[rnk].selph_dqsg1,
2808 SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1);
2810 RK0_PRE_TDQSCK3_TDQSCK_UIFREQ3_P1_B0R0,
2811 (u4value << 3) | u4value1);
2816 &shu[0].rk[rnk].selph_dqsg0,
2817 SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED);
2819 &shu[0].rk[rnk].selph_dqsg1,
2820 SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED);
2822 RK0_PRE_TDQSCK4_TDQSCK_UIFREQ1_B1R0,
2823 (u4value << 3) | u4value1);
2825 &shu[0].rk[rnk].dqsien,
2826 SHURK0_DQSIEN_R0DQS1IEN);
2828 RK0_PRE_TDQSCK4_TDQSCK_PIFREQ1_B1R0,
2831 &shu[0].rk[rnk].selph_dqsg0,
2832 SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1);
2834 &shu[0].rk[rnk].selph_dqsg1,
2835 SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1);
2837 RK0_PRE_TDQSCK6_TDQSCK_UIFREQ1_P1_B1R0,
2838 (u4value << 3) | u4value1);
2841 &shu[1].rk[rnk].selph_dqsg0,
2842 SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED);
2844 &shu[1].rk[rnk].selph_dqsg1,
2845 SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED);
2847 RK0_PRE_TDQSCK4_TDQSCK_UIFREQ2_B1R0,
2848 (u4value << 3) | u4value1);
2850 &shu[1].rk[rnk].dqsien,
2851 SHURK0_DQSIEN_R0DQS1IEN);
2853 RK0_PRE_TDQSCK4_TDQSCK_PIFREQ2_B1R0,
2856 &shu[1].rk[rnk].selph_dqsg0,
2857 SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1);
2859 &shu[1].rk[rnk].selph_dqsg1,
2860 SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1);
2862 RK0_PRE_TDQSCK6_TDQSCK_UIFREQ2_P1_B1R0,
2863 (u4value << 3) | u4value1);
2866 &shu[2].rk[rnk].selph_dqsg0,
2867 SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED);
2869 &shu[2].rk[rnk].selph_dqsg1,
2870 SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED);
2872 RK0_PRE_TDQSCK5_TDQSCK_UIFREQ3_B1R0,
2873 (u4value << 3) | u4value1);
2875 &shu[2].rk[rnk].dqsien,
2876 SHURK0_DQSIEN_R0DQS1IEN);
2878 RK0_PRE_TDQSCK5_TDQSCK_PIFREQ3_B1R0,
2881 &shu[2].rk[rnk].selph_dqsg0,
2882 SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1);
2884 &shu[2].rk[rnk].selph_dqsg1,
2885 SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1);
2887 RK0_PRE_TDQSCK6_TDQSCK_UIFREQ3_P1_B1R0,
2888 (u4value << 3) | u4value1);
2893 &shu[0].rk[rnk].selph_dqsg0,
2894 SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED);
2896 &shu[0].rk[rnk].selph_dqsg1,
2897 SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED);
2899 RK0_PRE_TDQSCK7_TDQSCK_UIFREQ1_B2R0,
2900 (u4value << 3) | u4value1);
2902 &shu[0].rk[rnk].dqsien,
2903 SHURK0_DQSIEN_R0DQS2IEN);
2905 RK0_PRE_TDQSCK7_TDQSCK_PIFREQ1_B2R0,
2908 &shu[0].rk[rnk].selph_dqsg0,
2909 SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1);
2911 &shu[0].rk[rnk].selph_dqsg1,
2912 SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1);
2914 RK0_PRE_TDQSCK9_TDQSCK_UIFREQ1_P1_B2R0,
2915 (u4value << 3) | u4value1);
2918 &shu[1].rk[rnk].selph_dqsg0,
2919 SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED);
2921 &shu[1].rk[rnk].selph_dqsg1,
2922 SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED);
2924 RK0_PRE_TDQSCK7_TDQSCK_UIFREQ2_B2R0,
2925 (u4value << 3) | u4value1);
2927 &shu[1].rk[rnk].dqsien,
2928 SHURK0_DQSIEN_R0DQS2IEN);
2930 RK0_PRE_TDQSCK7_TDQSCK_PIFREQ2_B2R0,
2933 &shu[1].rk[rnk].selph_dqsg0,
2934 SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1);
2936 &shu[1].rk[rnk].selph_dqsg1,
2937 SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1);
2939 RK0_PRE_TDQSCK9_TDQSCK_UIFREQ2_P1_B2R0,
2940 (u4value << 3) | u4value1);
2943 &shu[2].rk[rnk].selph_dqsg0,
2944 SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED);
2946 &shu[2].rk[rnk].selph_dqsg1,
2947 SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED);
2949 RK0_PRE_TDQSCK8_TDQSCK_UIFREQ3_B2R0,
2950 (u4value << 3) | u4value1);
2952 &shu[2].rk[rnk].dqsien,
2953 SHURK0_DQSIEN_R0DQS2IEN);
2955 RK0_PRE_TDQSCK8_TDQSCK_PIFREQ3_B2R0,
2958 &shu[2].rk[rnk].selph_dqsg0,
2959 SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1);
2961 &shu[2].rk[rnk].selph_dqsg1,
2962 SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1);
2964 RK0_PRE_TDQSCK9_TDQSCK_UIFREQ3_P1_B2R0,
2965 (u4value << 3) | u4value1);
2970 &shu[0].rk[rnk].selph_dqsg0,
2971 SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED);
2973 &shu[0].rk[rnk].selph_dqsg1,
2974 SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED);
2976 RK0_PRE_TDQSCK10_TDQSCK_UIFREQ1_B3R0,
2977 (u4value << 3) | u4value1);
2979 &shu[0].rk[rnk].dqsien,
2980 SHURK0_DQSIEN_R0DQS3IEN);
2982 RK0_PRE_TDQSCK10_TDQSCK_PIFREQ1_B3R0,
2985 &shu[0].rk[rnk].selph_dqsg0,
2986 SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1);
2988 &shu[0].rk[rnk].selph_dqsg1,
2989 SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1);
2991 RK0_PRE_TDQSCK12_TDQSCK_UIFREQ1_P1_B3R0,
2992 (u4value << 3) | u4value1);
2995 &shu[1].rk[rnk].selph_dqsg0,
2996 SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED);
2998 &shu[1].rk[rnk].selph_dqsg1,
2999 SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED);
3001 RK0_PRE_TDQSCK10_TDQSCK_UIFREQ2_B3R0,
3002 (u4value << 3) | u4value1);
3004 &shu[1].rk[rnk].dqsien,
3005 SHURK0_DQSIEN_R0DQS3IEN);
3007 RK0_PRE_TDQSCK10_TDQSCK_PIFREQ2_B3R0,
3010 &shu[1].rk[rnk].selph_dqsg0,
3011 SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1);
3013 &shu[1].rk[rnk].selph_dqsg1,
3014 SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1);
3016 RK0_PRE_TDQSCK12_TDQSCK_UIFREQ2_P1_B3R0,
3017 (u4value << 3) | u4value1);
3020 &shu[2].rk[rnk].selph_dqsg0,
3021 SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED);
3023 &shu[2].rk[rnk].selph_dqsg1,
3024 SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED);
3026 RK0_PRE_TDQSCK11_TDQSCK_UIFREQ3_B3R0,
3027 (u4value << 3) | u4value1);
3029 &shu[2].rk[rnk].dqsien,
3030 SHURK0_DQSIEN_R0DQS3IEN);
3032 RK0_PRE_TDQSCK11_TDQSCK_PIFREQ3_B3R0,
3035 &shu[2].rk[rnk].selph_dqsg0,
3036 SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1);
3038 &shu[2].rk[rnk].selph_dqsg1,
3039 SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1);
3041 RK0_PRE_TDQSCK12_TDQSCK_UIFREQ3_P1_B3R0,
3042 (u4value << 3) | u4value1);
3046 PRE_TDQSCK1_TDQSCK_REG_DVFS, 0x1);
3048 PRE_TDQSCK1_TDQSCK_HW_SW_UP_SEL, 1);
3054 u8 vendor_id, density, max_density = 0;
3055 u32 ddr_size, max_size = 0;
3060 for (
u8 rk =
RANK_0; rk < rk_num; rk++) {
3063 density = (density >> 2) & 0xf;
3091 if (ddr_size > max_size) {
3092 max_size = ddr_size;
3093 max_density = density;
3095 dramc_dbg(
"RK%d size %dGb, density:%d\n", rk, ddr_size, max_density);
3098 *density_result = max_density;
3102 u8 freq_group,
struct mr_value *mr,
bool run_dvfs)
3113 die(
"Invalid DRAM param source %u\n", pams->
source);
3123 dramc_dbg(
"Start K: freq=%d, ch=%d, rank=%d\n",
3124 freq_group, chn, rk);
3139 pams, fast_calib, &test_passed);
3146 dqsosc_auto(chn, rk, freq_group, osc_thrd_inc, osc_thrd_dec);
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
static struct sdram_info params
void __noreturn die(const char *fmt,...)
void delay(unsigned int secs)
#define dramc_err(_x_...)
#define dramc_dbg(_x_...)
void dramc_cke_fix_onoff(enum cke_type option, u8 chn)
#define DIV_ROUND_CLOSEST(x, divisor)
#define setbits32(addr, set)
#define WRITE32_BITFIELDS(addr,...)
#define SET32_BITFIELDS(addr,...)
#define READ32_BITFIELD(addr, name)
#define clrsetbits32(addr, clear, set)
#define clrbits32(addr, clear)
#define wait_us(timeout_us, condition)
u32 dram_k_perbit(u32 channel)
static struct dramc_channel const ch[2]
static struct mtk_spm_regs *const mtk_spm
static void dramc_get_vref_prop(u8 rank, enum CAL_TYPE type, u8 fsp, u8 *vref_scan_en, u8 *vref_begin, u8 *vref_end)
static void move_dramc_tx_dq(u8 chn, u8 rank, u8 byte, s8 shift_coarse_tune)
static void dramc_rx_dqs_gating_cal_partial(u8 chn, u8 rank, u32 coarse_start, u32 coarse_end, u8 freqDiv, u8 *pass_begin, u8 *pass_count, u8 *pass_count_1, u8 *dqs_done, u8 *dqs_high, u8 *dqs_transition, u8 *dly_coarse_large_cnt, u8 *dly_coarse_0p5t_cnt, u8 *dly_fine_tune_cnt)
static void dramc_rx_dqs_gating_cal(u8 chn, u8 rank, u8 freq_group, const struct sdram_params *params, const bool fast_calib, const struct mr_value *mr)
static void dramc_dle_factor_handler(u8 chn, u8 val, u8 freq_group)
static void dramc_rx_dqs_gating_post_process(u8 chn, u8 freq_group, u32 rk_num)
static void cbt_set_vref(u8 chn, u8 rank, u8 vref, bool is_final, u32 cbt_mode)
static void dramc_set_rank_engine2(u8 chn, u8 rank)
static u32 get_freq_group_clock(u8 freq_group)
static void dramc_read_dbi_onoff(size_t chn, bool on)
static void dqsosc_auto(u8 chn, u8 rank, u8 freq_group, u16 *osc_thrd_inc, u16 *osc_thrd_dec)
static void cbt_switch_freq(cbt_freq freq, bool run_dvfs)
static void dramc_set_dqdqs_dly(u8 chn, u8 rank, enum CAL_TYPE type, u8 *small_value, s32 dly)
static void dramc_rx_input_delay_tracking_init_by_freq(u8 chn, u8 freq_group)
int dramc_calibrate_all_channels(const struct sdram_params *pams, u8 freq_group, struct mr_value *mr, bool run_dvfs)
static void cbt_exit(u8 chn, u8 rank, u8 fsp, struct mr_value *mr, u32 cbt_mode)
static void dramc_set_tx_dly_factor(u8 chn, u8 rk, enum CAL_TYPE type, u8 *dq_small_reg, u32 dly)
static void dramc_engine2_setpat(u8 chn, bool test_pat)
static void dramc_find_dly_tune(u8 chn, u8 dly_coarse_large, u8 dly_coarse_0p5t, u8 dly_fine_xt, u8 *dqs_high, u8 *dly_coarse_large_cnt, u8 *dly_coarse_0p5t_cnt, u8 *dly_fine_tune_cnt, u8 *dqs_trans, u8 *dqs_done)
void dramc_apply_config_after_calibration(const struct mr_value *mr, u32 rk_num)
static int dramc_check_dqdqs_win(struct win_perbit_dly *perbit_dly, s16 dly, s16 dly_end, bool fail_bit)
static void dramc_rx_rd_dqc_end(u8 chn)
static void dramc_set_rx_best_dly_factor(u8 chn, u8 rank, struct win_perbit_dly *dly, s32 *dqsdly_byte, s32 *dqmdly_byte)
static void cbt_set_fsp(u8 chn, u8 rank, u8 fsp, struct mr_value *mr)
static void dramc_set_tx_best_dly_factor(u8 chn, u8 rank_start, u8 type, struct per_byte_dly *tx_perbyte_dly, u16 *dq_precal_dly, u8 use_delay_cell, u32 *byte_dly_cell)
#define WRITE_LEVELING_MOVD_DQS
static void cbt_dramc_dfs_direct_jump(u8 shu_level, bool run_dvfs)
static void dramc_set_rx_dly_factor(u8 chn, u8 rank, enum RX_TYPE type, u32 val)
static u16 dramc_mode_reg_read(u8 chn, u8 mr_idx)
static void dramc_transfer_dly_tune(u8 chn, u32 dly, u32 adjust_center, struct tx_dly_tune *dly_tune)
static void cbt_set_ca_clk_result(u8 chn, u8 rank, const struct sdram_params *params)
static void move_dramc_tx_dqs_oen(u8 chn, u8 byte, s8 shift_coarse_tune)
static u8 dramc_mode_reg_read_by_rank(u8 chn, u8 rank, u8 mr_idx)
void dramc_hw_dqsosc(u8 chn, u32 rk_num)
static u8 get_cbt_vref_pinmux_value(u8 chn, u8 vref_level, u32 cbt_mode)
static u8 dramc_window_perbit_cal(u8 chn, u8 rank, u8 freq_group, enum CAL_TYPE type, const struct sdram_params *params, const bool fast_calib)
static u32 dramc_rx_rd_dqc_run(u8 chn)
static void dramc_rx_vref_pre_setting(u8 chn)
static void dramc_auto_refresh_switch(u8 chn, bool option)
static void dramc_engine2_end(u8 chn, u32 dummy_rd)
static void o1_path_on_off(u8 cbt_on)
static void dramc_write_dqs_gating_result(u8 chn, u8 rank, u8 *best_coarse_tune2t, u8 *best_coarse_tune0p5t, u8 *best_coarse_tune2t_p1, u8 *best_coarse_tune0p5t_p1)
static void dramc_phy_dcm_2_channel(u8 chn, bool en)
static void dramc_set_mr13_vrcg_to_normal(u8 chn, const struct mr_value *mr, u32 rk_num)
static void move_dramc_tx_dq_oen(u8 chn, u8 rank, u8 byte, s8 shift_coarse_tune)
static void dramc_dual_rank_rx_datlat_cal(u8 chn, u8 freq_group, u8 datlat0, u8 datlat1)
static void dramc_rx_dqs_gating_cal_pre(u8 chn, u8 rank)
static void dramc_reset_delay_chain_before_calibration(size_t chn)
static const u8 lp4_ca_mapping_pop[CHANNEL_MAX][CA_NUM_LP4]
static void dramc_set_rx_vref(u8 chn, u8 vref)
static void set_dram_mr_cbt_on_off(u8 chn, u8 rank, u8 fsp, bool cbt_on, struct mr_value *mr, u32 cbt_mode)
static void write_leveling_move_dqs_instead_of_clk(u8 chn)
static int dramc_set_rx_best_dly(u8 chn, u8 rank, struct win_perbit_dly *perbit_dly)
static void dramc_engine2_init(u8 chn, u8 rank, u32 t2_1, u32 t2_2, bool test_pat)
static u32 dramc_get_smallest_dqs_dly(u8 chn, u8 rank, const struct sdram_params *params)
static void dramc_rx_dqs_isi_pulse_cg_switch(u8 chn, bool flag)
void get_dram_info_after_cal(u8 *density_result, u32 rk_num)
void dramc_dqs_precalculation_preset(void)
void dramc_mode_reg_write(u8 chn, u8 mr_idx, u8 value)
static void move_dramc_tx_dqs(u8 chn, u8 byte, s8 shift_coarse_tune)
static void dram_phy_reset(u8 chn)
static void dramc_rx_rd_dqc_init(u8 chn, u8 rank)
static void dramc_set_vref_dly(struct vref_perbit_dly *vref_dly, struct win_perbit_dly delay[])
static void dqsosc_shu_settings(u8 chn, u8 freq_group, u16 *osc_thrd_inc, u16 *osc_thrd_dec)
static void cbt_entry(u8 chn, u8 rank, u8 fsp, struct mr_value *mr, u32 cbt_mode)
static void dramc_set_rx_dqdqs_dly(u8 chn, u8 rank, s32 dly)
static void dramc_engine2_check_complete(u8 chn, u8 status)
static void dramc_get_dly_range(u8 chn, u8 rank, enum CAL_TYPE type, u8 freq_group, u16 *pre_cal, s16 *begin, s16 *end, const struct sdram_params *params)
static bool dramk_calc_best_vref(enum CAL_TYPE type, u8 vref, struct vref_perbit_dly *vref_dly, struct win_perbit_dly delay[], u32 *win_min_max)
static void dramc_set_vref(u8 chn, u8 rank, enum CAL_TYPE type, u8 vref)
static u8 dramc_rx_datlat_cal(u8 chn, u8 rank, u8 freq_group, const struct sdram_params *params, const bool fast_calib, bool *test_passed)
void dramc_hw_gating_onoff(u8 chn, bool on)
static bool dramc_find_gating_window(u32 result_r, u32 result_f, u32 *debug_cnt, u8 dly_coarse_large, u8 dly_coarse_0p5t, u8 *pass_begin, u8 *pass_count, u8 *pass_count_1, u8 *dly_fine_xt, u8 *dqs_high, u8 *dqs_done)
static void dramc_cmd_bus_training(u8 chn, u8 rank, u8 freq_group, const struct sdram_params *params, struct mr_value *mr, bool run_dvfs)
static void dramc_set_tx_dly_center(struct per_byte_dly *center_dly, const struct win_perbit_dly *vref_dly)
static void move_dramc_delay(u32 *reg_0, u32 *reg_1, u8 shift, s8 shift_coarse_tune)
static void dramc_set_tx_best_dly(u8 chn, u8 rank, bool bypass_tx, struct win_perbit_dly *vref_dly, enum CAL_TYPE type, u8 freq_group, u16 *tx_dq_precal_result, u16 dly_cell_unit, const struct sdram_params *params, const bool fast_calib)
static void dramc_engine2_compare(u8 chn, enum dram_te_op wr)
static void dramc_write_leveling(u8 chn, u8 rank, u8 freq_group, const u8 wr_level[CHANNEL_MAX][RANK_MAX][DQS_NUMBER])
static void dramc_set_gating_mode(u8 chn, bool mode)
static void cbt_set_perbit_delay_cell(u8 chn, u8 rank)
static void start_dqsosc(u8 chn)
void dramc_apply_config_before_calibration(u8 freq_group, u32 cbt_mode)
static void dramc_set_tx_vref(u8 chn, u8 rank, u8 value)
static void set_selph_gating_value(uint32_t *addr, u8 dly, u8 dly_p1)
static u32 dramc_engine2_run(u8 chn, enum dram_te_op wr)
static void dramc_mode_reg_write_by_rank(u8 chn, u8 rank, u8 mr_idx, u8 value)
static void dramc_write_dbi_onoff(size_t chn, bool onoff)
void dramc_enable_phy_dcm(u8 chn, bool en)
static void dramc_window_perbit_cal_partial(u8 chn, u8 rank, s16 dly_begin, s16 dly_end, s16 dly_step, enum CAL_TYPE type, u8 *small_value, u8 vref_scan_enable, struct win_perbit_dly *win_perbit)
void set_mrr_pinmux_mapping(void)
void cbt_mrr_pinmux_mapping(void)
const u8 phy_mapping[CHANNEL_MAX][16]
#define HW_REG_SHUFFLE_MAX
#define TX_DQ_COARSE_TUNE_TO_FINE_TUNE_TAP
#define DATLAT_TAP_NUMBER
#define MR23_DEFAULT_VALUE
@ DRAMC_PARAM_SOURCE_FLASH
@ DRAMC_PARAM_SOURCE_SDRAM_CONFIG
struct dramc_ddrphy_regs_shu_rk::@919 b[2]
Defines the SDRAM parameter structure.
u8 wr_level[CHANNEL_MAX][RANK_MAX][DQS_NUMBER]
struct win_perbit_dly perbit_dly[DQ_DATA_WIDTH]