huayang duan has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_register.h 4 files changed, 296 insertions(+), 15 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/1
diff --git a/src/soc/mediatek/mt8183/dramc_pi_basic_api.c b/src/soc/mediatek/mt8183/dramc_pi_basic_api.c index 1eb86f4..c609128 100644 --- a/src/soc/mediatek/mt8183/dramc_pi_basic_api.c +++ b/src/soc/mediatek/mt8183/dramc_pi_basic_api.c @@ -419,6 +419,51 @@ } }
+extern const u8 freq_shuffle[DRAM_DFS_SHUFFLE_MAX]; +extern const u8 freq_shuffle_emcp[DRAM_DFS_SHUFFLE_MAX]; +extern const u32 frequency_table[LP4X_DDRFREQ_MAX]; + +static void dramc_hw_dqs_osc(u8 chn) +{ + u32 freq_shu0, freq_shu1, freq_shu2; + const u8 *freq_tbl; + + if (CONFIG_MT8183_DRAM_EMCP) + freq_tbl = freq_shuffle_emcp; + else + freq_tbl = freq_shuffle; + + dramc_dbg("%s %d called!\n", __func__, __LINE__); + + freq_shu0 = frequency_table[freq_tbl[0]]; + freq_shu1 = frequency_table[freq_tbl[1]]; + freq_shu2 = frequency_table[freq_tbl[2]]; + + SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_0, (freq_shu1*8/freq_shu0)); + SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_1, (freq_shu2*8/freq_shu0)); + SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_3, (freq_shu0*8/freq_shu1)); + SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_4, (freq_shu2*8/freq_shu1)); + SET32_BITFIELDS(&ch[chn].ao.rk[2].dummy_rd_bk, RK2_DUMMY_RD_BK_FREQ_RATIO_TX_6, (freq_shu0*8/freq_shu2)); + SET32_BITFIELDS(&ch[chn].ao.rk[2].dummy_rd_bk, RK2_DUMMY_RD_BK_FREQ_RATIO_TX_7, (freq_shu1*8/freq_shu2)); + + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[0], PRE_TDQSCK1_SHU_PRELOAD_TX_HW, 1); + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[0], PRE_TDQSCK1_SHU_PRELOAD_TX_START, 0); + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[0], PRE_TDQSCK1_SW_UP_TX_NOW_CASE, 0); + + + SET32_BITFIELDS(&ch[chn].ao.mpc_option, MPC_OPTION_MPC_BLOCKALE_OPT, 0); + SET32_BITFIELDS(&ch[chn].phy.misc_ctrl1, MISC_CTRL1_R_DMARPIDQ_SW, 1); + SET32_BITFIELDS(&ch[chn].ao.dqsoscr, DQSOSCR_ARUIDQ_SW, 1); + SET32_BITFIELDS(&ch[chn].ao.dqsoscr, DQSOSCR_DQSOSCRDIS, 1); + + SET32_BITFIELDS(&ch[chn].ao.rk[0].dqsosc, RK0_DQSOSC_DQSOSCR_RK0EN, 1); + SET32_BITFIELDS(&ch[chn].ao.rk[1].dqsosc, RK1_DQSOSC_DQSOSCR_RK1EN, 1); + SET32_BITFIELDS(&ch[chn].ao.dqsoscr, DQSOSCR_DQSOSC_CALEN, 1); + + for (u8 shu = 0; shu < DRAM_DFS_SHUFFLE_MAX; shu++) + SET32_BITFIELDS(&ch[chn].ao.shu[shu].scintv, SHU_SCINTV_DQSOSCENDIS, 1); +} + void dramc_runtime_config(void) { clrbits32(&ch[0].ao.refctrl0, 0x1 << 29); @@ -427,6 +472,9 @@ transfer_pll_to_spm_control(); setbits32(&mtk_spm->spm_power_on_val0, 0x1 << 25);
+ for (u8 chn = 0; chn < CHANNEL_MAX; chn++) + dramc_hw_dqs_osc(chn); + /* RX_TRACKING: ON */ for (u8 chn = 0; chn < CHANNEL_MAX; chn++) dramc_rx_input_delay_tracking(chn); diff --git a/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c b/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c index 0ec0193..2e5228d 100644 --- a/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c +++ b/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c @@ -105,6 +105,37 @@ CKECTRL_CKEFIXOFF, cke_off); }
+static u16 dramc_mode_reg_read(u8 chn, u8 mr_idx) +{ + u16 value; + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSMA, mr_idx); + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_MRREN, 1); + + /* Wait MRW command fired */ + while (READ32_BITFIELD(&ch[chn].nao.spcmdresp, SPCMDRESP_MRR_RESPONSE) + == 0) + udelay(1); + + value = READ32_BITFIELD(&ch[chn].nao.mrr_status, MRR_STATUS_MRR_REG); + + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_MRREN, 0); + dramc_dbg("Read MR%d =0x%x\n", mr_idx, value); + + return value; +} + +static u16 dramc_mode_reg_read_by_rank(u8 chn, u8 rank, u8 mr_idx) +{ + u16 value; + u32 mrs_bak = READ32_BITFIELD(&ch[chn].ao.mrs, MRS_MRSRK); + + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSRK, rank); + value = dramc_mode_reg_read(chn, mr_idx); + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSRK, mrs_bak); + + return value; +} + void dramc_mode_reg_write(u8 chn, u8 mr_idx, u8 value) { u32 ckectrl_bak = read32(&ch[chn].ao.ckectrl); @@ -117,7 +148,7 @@ /* Wait MRW command fired */ while (READ32_BITFIELD(&ch[chn].nao.spcmdresp, SPCMDRESP_MRW_RESPONSE) == 0) - ; + udelay(1);
SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_MRWEN, 0); write32(&ch[chn].ao.ckectrl, ckectrl_bak); @@ -1577,17 +1608,9 @@ } }
-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 u32 get_freq_group_clock(u8 freq_group) { - int index, clock_rate; - u8 use_delay_cell; - u32 byte_dly_cell[DQS_NUMBER] = {0}; - struct per_byte_dly center_dly[DQS_NUMBER]; - u16 tune_diff, dq_delay_cell[DQ_DATA_WIDTH]; - + u32 clock_rate = 0;
/* * The clock rate is usually (frequency / 2 - delta), where the delta @@ -1609,8 +1632,23 @@ break; default: die("Invalid DDR frequency group %u\n", freq_group); - return; + break; } + return clock_rate; +} + +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) +{ + int index, clock_rate; + u8 use_delay_cell; + u32 byte_dly_cell[DQS_NUMBER] = {0}; + struct per_byte_dly center_dly[DQS_NUMBER]; + u16 tune_diff, dq_delay_cell[DQ_DATA_WIDTH]; + + clock_rate = get_freq_group_clock(freq_group);
if (type == TX_WIN_DQ_ONLY && get_freq_fsq(freq_group) == FSP_1) use_delay_cell = 1; @@ -2104,6 +2142,152 @@ (0xff << 8) | (0x9 << 2) | ROEN); }
+static void start_dqs_osc(u8 chn) +{ + u32 loop = 0; + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_DQSOSCENEN, 1); + while (!wait_us(10, read32(&ch[chn].nao.spcmdresp) & (0x1 << 10))) { + if (loop++ > 10) + dramc_err("start DQSOSC fail (time out)\n"); + return; + } + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_DQSOSCENEN, 0); +} + +static void dqs_osc_set(u8 chn, u8 rank, u8 freq_group) +{ + u8 mr23 = 0x3F; + u16 mr18, mr19; + u16 dqs_osc_cnt[2]; + + struct reg_value regs_bak[] = { + {&ch[chn].ao.mrs}, + {&ch[chn].ao.dramc_pd_ctrl}, + {&ch[chn].ao.ckectrl}, + }; + + for (size_t i = 0; i < ARRAY_SIZE(regs_bak); i++) + regs_bak[i].value = read32(regs_bak[i].addr); + dramc_dbg("%s %d called!\n", __func__, __LINE__); + + SET32_BITFIELDS(&ch[chn].ao.rkcfg, RKCFG_DQSOSC2RK, 0); + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSRK, rank); + SET32_BITFIELDS(&ch[chn].ao.mpc_option, MPC_OPTION_MPCRKEN, 1); + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSRK, rank); + dramc_mode_reg_write(chn, 23, mr23); + + for (u8 shu = 0; shu < DRAM_DFS_SHUFFLE_MAX; shu++) + SET32_BITFIELDS(&ch[chn].ao.shu[shu].scintv, SHU_SCINTV_DQSOSCENDIS, 1); + + SET32_BITFIELDS(&ch[chn].ao.dramc_pd_ctrl, DRAMC_PD_CTRL_MIOCKCTRLOFF, 1); + dramc_cke_fix_onoff(chn, true, false); + + start_dqs_osc(chn); + udelay(1); + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRRRK, rank); + + for (size_t i = 0; i < ARRAY_SIZE(regs_bak); i++) + write32(regs_bak[i].addr, regs_bak[i].value); + + mr18 = dramc_mode_reg_read(chn, 18); + mr19 = dramc_mode_reg_read(chn, 19); + dqs_osc_cnt[0] = (mr18 & 0xFF) | ((mr19 & 0xFF) << 8); + dqs_osc_cnt[1] = (mr18 >> 8) | (mr19 & 0xFF00); + dramc_dbg("DQSOscCnt B0=0x%X, B1=0x%X\n", dqs_osc_cnt[0] , dqs_osc_cnt[1]); + + SET32_BITFIELDS(&ch[chn].ao.shu[0].rk[rank].dqsosc, + SHU1RK0_DQSOSC_DQSOSC_BASE_RK0, dqs_osc_cnt[0]); + SET32_BITFIELDS(&ch[chn].ao.shu[0].rk[rank].dqsosc, + SHU1RK0_DQSOSC_DQSOSC_BASE_RK0_B1, dqs_osc_cnt[1]); +} + +static void dqs_osc_shu_settings(u8 chn, u8 freq_group) +{ + u8 filt_pithrd, w2r_sel, upd_sel; + u8 mr23 = 0x3F; + u16 mr18, mr19; + u16 dqs_cnt, dqs_osc, prd_cnt, thrd_inc, thrd_dec; + u32 clock_rate, tck; + + SET32_BITFIELDS(&ch[chn].ao.shu[0].scintv, SHU_SCINTV_DQS2DQ_SHU_PITHRD, 0); + SET32_BITFIELDS(&ch[chn].ao.rk[0].dqsosc, RK0_DQSOSC_R_DMDQS2DQ_FILT_OPT, 0); + + switch (freq_group) { + case LP4X_DDR1600: + filt_pithrd = 0x5; + w2r_sel = 0x5; + upd_sel = 0x0; + break; + case LP4X_DDR2400: + filt_pithrd = 0x8; + w2r_sel = 0x2; + upd_sel = 0x0; + break; + case LP4X_DDR3200: + filt_pithrd = 0xA; + w2r_sel = 0x2; + upd_sel = 0x0; + break; + case LP4X_DDR3600: + filt_pithrd = 0xB; + w2r_sel = 0x2; + upd_sel = 0x0; + break; + default: + die("Invalid DDR frequency group %u\n", freq_group); + return; + } + dramc_dbg("%s %d called!\n", __func__, __LINE__); + + SET32_BITFIELDS(&ch[chn].ao.shu[0].scintv, SHU_SCINTV_DQS2DQ_FILT_PITHRD, filt_pithrd); + SET32_BITFIELDS(&ch[chn].ao.shu[0].wodt, SHU1_WODT_TXUPD_W2R_SEL, w2r_sel); + SET32_BITFIELDS(&ch[chn].ao.shu[0].wodt, SHU1_WODT_TXUPD_SEL, upd_sel); + + prd_cnt = mr23 / 4 + 3; + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsosc_prd, SHU1_DQSOSC_PRD_DQSOSC_PRDCNT, prd_cnt); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscr, SHU_DQSOSCR_DQSOSCRCNT, 0x40); + + for (u8 rk = RANK_0; rk < RANK_MAX; rk++) { + mr18 = dramc_mode_reg_read_by_rank(chn, rk, 18); + mr19 = dramc_mode_reg_read_by_rank(chn, rk, 19); + + clock_rate = get_freq_group_clock(freq_group); + tck = 1000000 /clock_rate; + + dqs_cnt = (mr18 & 0xFF) | ((mr19 & 0xFF) <<8); + if (dqs_cnt != 0) { + dqs_osc = mr23*16 *1000000 / (2 * dqs_cnt * clock_rate); + thrd_inc = (mr23 * tck * tck) / (dqs_osc * dqs_osc * 10); + thrd_dec = (3 * mr23 * tck * tck) / (dqs_osc * dqs_osc * 20); + } else { + dqs_osc = 0; + thrd_inc = 0x6; + thrd_dec = 0x4; + } + + dramc_dbg("CH%d_RK%d: MR19=0x%x, MR18=0x%x, DQSOSC=%d, MR23=0x%x, INC=%d, DEC=%d\n", + chn, rk, mr18, mr19, dqs_cnt, mr23, thrd_inc, thrd_dec); + + if (rk == RANK_0) { + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscthrd, + SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK0, thrd_inc); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscthrd, + SHU_DQSOSCTHRD_DQSOSCTHRD_DEC_RK0, thrd_dec); + } else { + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscthrd, + SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK1_7TO0, + thrd_inc & 0xFF); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsosc_prd, + SHU1_DQSOSC_PRD_DQSOSCTHRD_INC_RK1_11TO8, + (thrd_inc & 0xF00) >> 8); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsosc_prd, + SHU1_DQSOSC_PRD_DQSOSCTHRD_DEC_RK1, thrd_dec); + } + } + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscr2, SHU_DQSOSCR2_DQSOSCENCNT, 0x1FF); + dramc_dbg("%s %d called!\n", __func__, __LINE__); +} + int dramc_calibrate_all_channels(const struct sdram_params *pams, u8 freq_group, const struct mr_value *mr) { @@ -2146,8 +2330,11 @@ dramc_window_perbit_cal(chn, rk, freq_group, RX_WIN_TEST_ENG, pams, fast_calib); dramc_auto_refresh_switch(chn, false); + + dqs_osc_set(chn, rk, freq_group); }
+ dqs_osc_shu_settings(chn, freq_group); dramc_rx_dqs_gating_post_process(chn, freq_group); dramc_dual_rank_rx_datlat_cal(chn, freq_group, rx_datlat[0], rx_datlat[1]); } diff --git a/src/soc/mediatek/mt8183/emi.c b/src/soc/mediatek/mt8183/emi.c index cf104f8..3755d2b 100644 --- a/src/soc/mediatek/mt8183/emi.c +++ b/src/soc/mediatek/mt8183/emi.c @@ -22,19 +22,19 @@ #include <soc/mt6358.h> #include <soc/spm.h>
-static const u8 freq_shuffle[DRAM_DFS_SHUFFLE_MAX] = { +const u8 freq_shuffle[DRAM_DFS_SHUFFLE_MAX] = { [DRAM_DFS_SHUFFLE_1] = LP4X_DDR3200, [DRAM_DFS_SHUFFLE_2] = LP4X_DDR2400, [DRAM_DFS_SHUFFLE_3] = LP4X_DDR1600, };
-static const u8 freq_shuffle_emcp[DRAM_DFS_SHUFFLE_MAX] = { +const u8 freq_shuffle_emcp[DRAM_DFS_SHUFFLE_MAX] = { [DRAM_DFS_SHUFFLE_1] = LP4X_DDR3600, [DRAM_DFS_SHUFFLE_2] = LP4X_DDR3200, [DRAM_DFS_SHUFFLE_3] = LP4X_DDR1600, };
-u32 frequency_table[LP4X_DDRFREQ_MAX] = { +const u32 frequency_table[LP4X_DDRFREQ_MAX] = { [LP4X_DDR1600] = 1600, [LP4X_DDR2400] = 2400, [LP4X_DDR3200] = 3200, diff --git a/src/soc/mediatek/mt8183/include/soc/dramc_register.h b/src/soc/mediatek/mt8183/include/soc/dramc_register.h index b3ee6af..38e1bb2 100644 --- a/src/soc/mediatek/mt8183/include/soc/dramc_register.h +++ b/src/soc/mediatek/mt8183/include/soc/dramc_register.h @@ -627,12 +627,17 @@ check_member(emi_mpu_regs, mpu_ctrl_d[0], 0x0800);
DEFINE_BITFIELD(MISC_STATUSA_REFRESH_QUEUE_CNT, 27, 24) +DEFINE_BIT(SPCMDRESP_MRR_RESPONSE, 0) DEFINE_BIT(SPCMDRESP_MRW_RESPONSE, 0) +DEFINE_BITFIELD(MRR_STATUS_MRR_REG, 15, 0)
DEFINE_BIT(DDRCONF0_DM4TO1MODE, 22) DEFINE_BIT(DDRCONF0_RDATRST, 0) DEFINE_BIT(PERFCTL0_RWOFOEN, 4)
+DEFINE_BIT(RKCFG_DQSOSC2RK, 11) +DEFINE_BIT(DRAMC_PD_CTRL_MIOCKCTRLOFF, 26) + DEFINE_BIT(PADCTRL_DQIENLATEBEGIN, 3) DEFINE_BITFIELD(PADCTRL_DQIENQKEND, 1, 0)
@@ -655,16 +660,21 @@ DEFINE_BITFIELD(MRS_MRSMA, 20, 8) DEFINE_BITFIELD(MRS_MRSOP, 7, 0)
+DEFINE_BIT(SPCMD_DQSOSCENEN, 10) DEFINE_BIT(SPCMD_DQSGCNTRST, 9) DEFINE_BIT(SPCMD_DQSGCNTEN, 8) DEFINE_BIT(SPCMD_ZQLATEN, 6) DEFINE_BIT(SPCMD_RDDQCEN, 7) DEFINE_BIT(SPCMD_ZQCEN, 4) +DEFINE_BIT(SPCMD_MRREN, 0) DEFINE_BIT(SPCMD_MRWEN, 0)
DEFINE_BIT(SPCMDCTRL_RDDQCDIS, 11)
DEFINE_BIT(MPC_OPTION_MPCRKEN, 17) +DEFINE_BIT(MPC_OPTION_MPC_BLOCKALE_OPT, 0) + +
DEFINE_BIT(DVFSDLL_R_BYPASS_1ST_DLL_SHU1, 1)
@@ -727,7 +737,41 @@ DEFINE_BITFIELD(SHU_RANKCTL_RANKINCTL, 23, 20)
DEFINE_BIT(SHU1_WODT_DBIWR, 29) +DEFINE_BIT(SHU_SCINTV_DQSOSCENDIS, 30) +DEFINE_BITFIELD(SHU_SCINTV_DQS2DQ_SHU_PITHRD, 23, 18) DEFINE_BITFIELD(SHURK_DQSCTL_DQSINCTL, 3, 0) +DEFINE_BIT(RK0_DQSOSC_R_DMDQS2DQ_FILT_OPT, 29) +DEFINE_BIT(RK0_DQSOSC_DQSOSCR_RK0EN, 30) +DEFINE_BIT(RK1_DQSOSC_DQSOSCR_RK1EN, 30) + +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_0, 4, 0) +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_1, 9, 5) +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_3, 19, 15) +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_4, 24, 20) +DEFINE_BITFIELD(RK2_DUMMY_RD_BK_FREQ_RATIO_TX_6, 7, 3) +DEFINE_BITFIELD(RK2_DUMMY_RD_BK_FREQ_RATIO_TX_7, 12, 8) + +DEFINE_BIT(PRE_TDQSCK1_SW_UP_TX_NOW_CASE, 16) +DEFINE_BIT(PRE_TDQSCK1_SHU_PRELOAD_TX_START, 18) +DEFINE_BIT(PRE_TDQSCK1_SHU_PRELOAD_TX_HW, 19) + + +DEFINE_BITFIELD(SHU_SCINTV_DQS2DQ_FILT_PITHRD, 29, 24) +DEFINE_BITFIELD(SHU1_WODT_TXUPD_W2R_SEL, 16, 14) +DEFINE_BITFIELD(SHU1_WODT_TXUPD_SEL, 13, 12) +DEFINE_BITFIELD(SHU1_DQSOSC_PRD_DQSOSC_PRDCNT, 9, 0) +DEFINE_BITFIELD(SHU_DQSOSCR_DQSOSCRCNT, 7, 0) +DEFINE_BIT(DQSOSCR_ARUIDQ_SW, 7) +DEFINE_BIT(DQSOSCR_DQSOSCRDIS, 24) +DEFINE_BIT(DQSOSCR_DQSOSC_CALEN, 31) + + +DEFINE_BITFIELD(SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK0, 11, 0) +DEFINE_BITFIELD(SHU_DQSOSCTHRD_DQSOSCTHRD_DEC_RK0, 23, 12) +DEFINE_BITFIELD(SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK1_7TO0, 31, 24) +DEFINE_BITFIELD(SHU1_DQSOSC_PRD_DQSOSCTHRD_INC_RK1_11TO8, 19, 16) +DEFINE_BITFIELD(SHU1_DQSOSC_PRD_DQSOSCTHRD_DEC_RK1, 31, 20) +DEFINE_BITFIELD(SHU_DQSOSCR2_DQSOSCENCNT, 8, 0)
DEFINE_BITFIELD(SHURK_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1, 14, 12) DEFINE_BITFIELD(SHURK_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1, 6, 4) @@ -736,6 +780,8 @@ DEFINE_BITFIELD(SHURK_SELPH_DQSG1_TX_DLY_DQS1_GATED_P1, 14, 12) DEFINE_BITFIELD(SHURK_SELPH_DQSG1_TX_DLY_DQS0_GATED_P1, 6, 4) DEFINE_BITFIELD(SHURK_SELPH_DQSG1_TX_DLY_DQS0_GATED, 2, 0) +DEFINE_BITFIELD(SHU1RK0_DQSOSC_DQSOSC_BASE_RK0, 15, 0) +DEFINE_BITFIELD(SHU1RK0_DQSOSC_DQSOSC_BASE_RK0_B1, 31, 16)
DEFINE_BIT(B0_DQ5_RG_RX_ARDQ_VREF_EN_B0, 16) DEFINE_BIT(B1_DQ5_RG_RX_ARDQ_VREF_EN_B1, 16)
build bot (Jenkins) has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 1:
(25 comments)
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_basic_api.c:
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 436: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 436: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 436: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 442: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_0, (freq_shu1*8/freq_shu0)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 443: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_1, (freq_shu2*8/freq_shu0)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 444: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_3, (freq_shu0*8/freq_shu1)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 445: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_4, (freq_shu2*8/freq_shu1)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 446: SET32_BITFIELDS(&ch[chn].ao.rk[2].dummy_rd_bk, RK2_DUMMY_RD_BK_FREQ_RATIO_TX_6, (freq_shu0*8/freq_shu2)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 447: SET32_BITFIELDS(&ch[chn].ao.rk[2].dummy_rd_bk, RK2_DUMMY_RD_BK_FREQ_RATIO_TX_7, (freq_shu1*8/freq_shu2)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2171: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2171: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2171: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2196: dramc_dbg("DQSOscCnt B0=0x%X, B1=0x%X\n", dqs_osc_cnt[0] , dqs_osc_cnt[1]); space prohibited before that ',' (ctx:WxW)
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2240: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2240: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2240: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2255: tck = 1000000 /clock_rate; need consistent spacing around '/' (ctx:WxV)
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2257: dqs_cnt = (mr18 & 0xFF) | ((mr19 & 0xFF) <<8); need consistent spacing around '<<' (ctx:WxV)
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2259: dqs_osc = mr23*16 *1000000 / (2 * dqs_cnt * clock_rate); need consistent spacing around '*' (ctx:WxV)
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2263: dqs_osc = 0; code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2263: dqs_osc = 0; please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2263: dqs_osc = 0; please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2288: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2288: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/1/src/soc/mediatek/mt8183/dra... PS1, Line 2288: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
Hello Julius Werner, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#2).
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/Kconfig M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 299 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/2
build bot (Jenkins) has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 2:
(25 comments)
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_basic_api.c:
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 436: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 436: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 436: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 442: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_0, (freq_shu1*8/freq_shu0)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 443: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_1, (freq_shu2*8/freq_shu0)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 444: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_3, (freq_shu0*8/freq_shu1)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 445: SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, RK2_DQSOSC_FREQ_RATIO_TX_4, (freq_shu2*8/freq_shu1)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 446: SET32_BITFIELDS(&ch[chn].ao.rk[2].dummy_rd_bk, RK2_DUMMY_RD_BK_FREQ_RATIO_TX_6, (freq_shu0*8/freq_shu2)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 447: SET32_BITFIELDS(&ch[chn].ao.rk[2].dummy_rd_bk, RK2_DUMMY_RD_BK_FREQ_RATIO_TX_7, (freq_shu1*8/freq_shu2)); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2172: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2172: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2172: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2197: dramc_dbg("DQSOscCnt B0=0x%X, B1=0x%X\n", dqs_osc_cnt[0] , dqs_osc_cnt[1]); space prohibited before that ',' (ctx:WxW)
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2241: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2241: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2241: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2256: tck = 1000000 /clock_rate; need consistent spacing around '/' (ctx:WxV)
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2258: dqs_cnt = (mr18 & 0xFF) | ((mr19 & 0xFF) <<8); need consistent spacing around '<<' (ctx:WxV)
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2260: dqs_osc = mr23*16 *1000000 / (2 * dqs_cnt * clock_rate); need consistent spacing around '*' (ctx:WxV)
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2264: dqs_osc = 0; code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2264: dqs_osc = 0; please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2264: dqs_osc = 0; please, no spaces at the start of a line
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2289: dramc_dbg("%s %d called!\n", __func__, __LINE__); code indent should use tabs where possible
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2289: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no space before tabs
https://review.coreboot.org/c/coreboot/+/37996/2/src/soc/mediatek/mt8183/dra... PS2, Line 2289: dramc_dbg("%s %d called!\n", __func__, __LINE__); please, no spaces at the start of a line
Hello Julius Werner, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#3).
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/Kconfig M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 305 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/3
Hello Julius Werner, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#4).
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/Kconfig M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 304 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/4
Hello Julius Werner, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#5).
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/Kconfig M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 305 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/5
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 5:
(3 comments)
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG@9 PS5, Line 9: tracking track
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG@10 PS5, Line 10: Please elaborate, what the problem is, and why using DQS OSC fixes this.
https://review.coreboot.org/c/coreboot/+/37996/5/src/soc/mediatek/mt8183/Kco... File src/soc/mediatek/mt8183/Kconfig:
https://review.coreboot.org/c/coreboot/+/37996/5/src/soc/mediatek/mt8183/Kco... PS5, Line 22: default y Unwanted?
Hello Julius Werner, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#6).
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/Kconfig M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 305 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/6
Hello Julius Werner, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#7).
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/Kconfig M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 6 files changed, 293 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/7
build bot (Jenkins) has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 7:
(4 comments)
https://review.coreboot.org/c/coreboot/+/37996/7/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/7/src/soc/mediatek/mt8183/dra... PS7, Line 2153: u16* osc_thrd_inc, u16* osc_thrd_dec) "foo* bar" should be "foo *bar"
https://review.coreboot.org/c/coreboot/+/37996/7/src/soc/mediatek/mt8183/dra... PS7, Line 2153: u16* osc_thrd_inc, u16* osc_thrd_dec) "foo* bar" should be "foo *bar"
https://review.coreboot.org/c/coreboot/+/37996/7/src/soc/mediatek/mt8183/dra... PS7, Line 2264: u16* osc_thrd_inc, u16* osc_thrd_dec) "foo* bar" should be "foo *bar"
https://review.coreboot.org/c/coreboot/+/37996/7/src/soc/mediatek/mt8183/dra... PS7, Line 2264: u16* osc_thrd_inc, u16* osc_thrd_dec) "foo* bar" should be "foo *bar"
Hello Julius Werner, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#8).
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
soc/mediatek/mt8183: add TX tracking for DRAM DVFS
use dqs osc to tracking the TX window for DVFS
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/Kconfig M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 6 files changed, 574 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/8
build bot (Jenkins) has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 8:
(98 comments)
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2345: if (shu_src >= DRAM_DFS_SHUFFLE_MAX || shu_dst>= DRAM_DFS_SHUFFLE_MAX) { spaces required around that '>=' (ctx:VxW)
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2351: div_round_close((get_shu_frequency(shu_dst) >> 1)* 32, need consistent spacing around '*' (ctx:VxW)
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2380: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2381: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2382: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[0], RK0_PRE_TDQSCK1_TDQSCK_UIFREQ1_B0R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2383: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS0IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2384: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[0], RK0_PRE_TDQSCK1_TDQSCK_PIFREQ1_B0R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2385: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2386: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2387: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[2], RK0_PRE_TDQSCK3_TDQSCK_UIFREQ1_P1_B0R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2389: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2390: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2391: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[0], RK0_PRE_TDQSCK1_TDQSCK_UIFREQ2_B0R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2392: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS0IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2393: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[0], RK0_PRE_TDQSCK1_TDQSCK_PIFREQ2_B0R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2394: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2395: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2396: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[2], RK0_PRE_TDQSCK3_TDQSCK_UIFREQ2_P1_B0R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2398: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2399: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2400: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[1], RK0_PRE_TDQSCK2_TDQSCK_UIFREQ3_B0R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2401: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS0IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2402: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[1], RK0_PRE_TDQSCK2_TDQSCK_PIFREQ3_B0R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2403: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2404: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2405: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[2], RK0_PRE_TDQSCK3_TDQSCK_UIFREQ3_P1_B0R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2409: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2410: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2411: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[3], RK0_PRE_TDQSCK4_TDQSCK_UIFREQ1_B1R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2412: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS1IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2413: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[3], RK0_PRE_TDQSCK4_TDQSCK_PIFREQ1_B1R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2414: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2415: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2416: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[5], RK0_PRE_TDQSCK6_TDQSCK_UIFREQ1_P1_B1R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2418: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2419: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2420: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[3], RK0_PRE_TDQSCK4_TDQSCK_UIFREQ2_B1R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2421: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS1IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2422: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[3], RK0_PRE_TDQSCK4_TDQSCK_PIFREQ2_B1R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2423: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2424: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2425: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[5], RK0_PRE_TDQSCK6_TDQSCK_UIFREQ2_P1_B1R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2427: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2428: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2429: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[4], RK0_PRE_TDQSCK5_TDQSCK_UIFREQ3_B1R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2430: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS1IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2431: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[4], RK0_PRE_TDQSCK5_TDQSCK_PIFREQ3_B1R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2432: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2433: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2434: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[5], RK0_PRE_TDQSCK6_TDQSCK_UIFREQ3_P1_B1R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2438: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2439: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2440: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[6], RK0_PRE_TDQSCK7_TDQSCK_UIFREQ1_B2R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2441: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS2IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2442: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[6], RK0_PRE_TDQSCK7_TDQSCK_PIFREQ1_B2R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2443: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2444: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2445: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[8], RK0_PRE_TDQSCK9_TDQSCK_UIFREQ1_P1_B2R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2447: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2448: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2449: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[6], RK0_PRE_TDQSCK7_TDQSCK_UIFREQ2_B2R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2450: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS2IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2451: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[6], RK0_PRE_TDQSCK7_TDQSCK_PIFREQ2_B2R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2452: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2453: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2454: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[8], RK0_PRE_TDQSCK9_TDQSCK_UIFREQ2_P1_B2R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2456: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2457: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2458: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[7], RK0_PRE_TDQSCK8_TDQSCK_UIFREQ3_B2R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2459: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS2IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2460: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[7], RK0_PRE_TDQSCK8_TDQSCK_PIFREQ3_B2R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2461: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2462: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2463: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[8], RK0_PRE_TDQSCK9_TDQSCK_UIFREQ3_P1_B2R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2467: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2468: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2469: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[9], RK0_PRE_TDQSCK10_TDQSCK_UIFREQ1_B3R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2470: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS3IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2471: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[9], RK0_PRE_TDQSCK10_TDQSCK_PIFREQ1_B3R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2472: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2473: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2474: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[11], RK0_PRE_TDQSCK12_TDQSCK_UIFREQ1_P1_B3R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2476: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2477: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2478: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[9], RK0_PRE_TDQSCK10_TDQSCK_UIFREQ2_B3R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2479: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS3IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2480: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[9], RK0_PRE_TDQSCK10_TDQSCK_PIFREQ2_B3R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2481: u4value = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2482: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[1].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2483: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[11], RK0_PRE_TDQSCK12_TDQSCK_UIFREQ2_P1_B3R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2485: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2486: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2487: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[10], RK0_PRE_TDQSCK11_TDQSCK_UIFREQ3_B3R0, (u4value << 3) | u4value1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2488: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].dqsien, SHURK0_DQSIEN_R0DQS3IEN); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2489: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[10], RK0_PRE_TDQSCK11_TDQSCK_PIFREQ3_B3R0, u4value); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2490: u4value = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2491: u4value1 = READ32_BITFIELD(&ch[chn].ao.shu[2].rk[rnk].selph_dqsg1, SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1); line over 96 characters
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2492: SET32_BITFIELDS(&ch[chn].ao.rk[rnk].pre_tdqsck[11], RK0_PRE_TDQSCK12_TDQSCK_UIFREQ3_P1_B3R0, (u4value << 3) | u4value1); line over 96 characters
Hung-Te Lin has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 8:
(1 comment)
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 25: extern const u8 freq_shuffle[DRAM_DFS_SHUFFLE_MAX]; : extern const u8 freq_shuffle_emcp[DRAM_DFS_SHUFFLE_MAX]; : extern const u32 frequency_table[LP4X_DDRFREQ_MAX]; Please pass these as function arguments (for example, https://review.coreboot.org/c/coreboot/+/36286 ), or at least pack them into a struct.
Yu-Ping Wu has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 8:
(6 comments)
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG@9 PS8, Line 9: DVFS DVFS.
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG@9 PS8, Line 9: use Use
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG@9 PS8, Line 9: tracking track
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... File src/soc/mediatek/mt8183/Kconfig:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... PS8, Line 22: default y Shouldn't change this.
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2345: if (shu_src >= DRAM_DFS_SHUFFLE_MAX || shu_dst>= DRAM_DFS_SHUFFLE_MAX) {
spaces required around that '>=' (ctx:VxW)
Please fix this.
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2351: div_round_close((get_shu_frequency(shu_dst) >> 1)* 32,
need consistent spacing around '*' (ctx:VxW)
Please fix this.
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 8:
(4 comments)
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... File src/soc/mediatek/mt8183/Kconfig:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... PS8, Line 22: default y
Shouldn't change this.
I think this was changed so that Jenkins build-tests the change. This can also be achieved by adding a new file into `configs/` with this option enabled.
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2338: * I would also use spaces here
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2345: if (shu_src >= DRAM_DFS_SHUFFLE_MAX || shu_dst>= DRAM_DFS_SHUFFLE_MAX) {
Please fix this.
Note: Adding the extra space will make this line one character too long. Ouch :S
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2380: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED);
line over 96 characters
I would try to split these lines
Duan huayang has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: add TX tracking for DRAM DVFS ......................................................................
Patch Set 8:
(11 comments)
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG@9 PS5, Line 9: tracking
track
Done
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG@10 PS5, Line 10:
Please elaborate, what the problem is, and why using DQS OSC fixes this.
updated at commit msg
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG@9 PS8, Line 9: use
Use
Done
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG@9 PS8, Line 9: tracking
track
Done
https://review.coreboot.org/c/coreboot/+/37996/8//COMMIT_MSG@9 PS8, Line 9: DVFS
DVFS.
Done
https://review.coreboot.org/c/coreboot/+/37996/5/src/soc/mediatek/mt8183/Kco... File src/soc/mediatek/mt8183/Kconfig:
https://review.coreboot.org/c/coreboot/+/37996/5/src/soc/mediatek/mt8183/Kco... PS5, Line 22: default y
Unwanted?
Done
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... File src/soc/mediatek/mt8183/Kconfig:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... PS8, Line 22: default y
I think this was changed so that Jenkins build-tests the change. […]
have revert this unexpect change
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 25: extern const u8 freq_shuffle[DRAM_DFS_SHUFFLE_MAX]; : extern const u8 freq_shuffle_emcp[DRAM_DFS_SHUFFLE_MAX]; : extern const u32 frequency_table[LP4X_DDRFREQ_MAX];
Please pass these as function arguments (for example, https://review.coreboot. […]
Done
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2338: *
I would also use spaces here
Done
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2345: if (shu_src >= DRAM_DFS_SHUFFLE_MAX || shu_dst>= DRAM_DFS_SHUFFLE_MAX) {
Note: Adding the extra space will make this line one character too long. […]
Done
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2351: div_round_close((get_shu_frequency(shu_dst) >> 1)* 32,
Please fix this.
Done
Hello Yu-Ping Wu, Duan huayang, Julius Werner, Hung-Te Lin, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#9).
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature
The TX window maybe offset to edge while system do DVFS switch, it maybe cause the TX data transmission error. Need use standard dqsosc do TX window tracking for DDR DVFS feature.
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 690 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/9
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 9: Code-Review+2
(3 comments)
Looks good
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG@10 PS5, Line 10:
updated at commit msg
Paul, I guess this is done?
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... File src/soc/mediatek/mt8183/Kconfig:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/Kco... PS8, Line 22: default y
have revert this unexpect change
Done
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2380: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED);
I would try to split these lines
Done
Yu-Ping Wu has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 9:
(12 comments)
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG@10 PS5, Line 10:
updated at commit msg
Ack
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/8/src/soc/mediatek/mt8183/dra... PS8, Line 2380: u4value = READ32_BITFIELD(&ch[chn].ao.shu[0].rk[rnk].selph_dqsg0, SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED);
I would try to split these lines
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2142: return; Should we return -1 on error?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2150: Remove extra space
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2189: tck = 1000000 / clock_rate; Are you sure we want to round down here, rather than round up or round to closest?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2194: (mr23 * tck * tck) Remove unnecessary parentheses. Same below.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2216: 0 Please use DRAM_DFS_SHUFFLE_1.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2221: * Add spaces around binary operators.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2314: static int div_round_close(const int n, const int d) There's already DIV_ROUND_CLOSEST in commonlib/include/commonlib/helpers.h, but you may want to check if it's exactly the same.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2330: shu_dst >= DRAM_DFS_SHUFFLE_MAX) { Please align with previous line.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2340: + Add spaces around binary operators.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2386: SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED); Need one more tab. Same below.
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 9: Code-Review+1
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 9:
(26 comments)
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/5//COMMIT_MSG@10 PS5, Line 10:
Ack
Done
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: maybe may be
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: do does
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: it maybe : cause the TX data transmission error.
It may cause a TX data transmission error.
Is that visible in the logs? Does the boot hang then?
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@11 PS9, Line 11: Need use standard dqsosc do TX window tracking for DDR DVFS feature. Do you mean?
So, use standard dqsosc TX window tracking for DDR DVFS feature.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_basic_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 430: u8 unsigned int
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 431: dramc_hw_dqsosc(chn); Please change the function signature to `unsigned int`.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 114: /* Wait MRW command fired */ Maybe?
Wait until MRW command fired
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 1635: {0} Please add spaces around the 0.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 1683: dramc_dbg("u1DelayCellOfst[%d]=%d cells (%d PI)\n", Should be a separate commit next time.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: while (!wait_us(10, read32(&ch[chn].nao.spcmdresp) & (0x1 << 10))) { Can you use coreboot’s stopwatch framework?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: 0x1 << 10 Define a macro for that bit?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2141: dramc_err("start DQSOSC fail (time out)\n"); Maybe:
Start of DQSOSC timed out after ten iterations
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2141: time out The noun is spelled *timeout* or *time-out*.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2148: u16 *osc_thrd_inc, u16 *osc_thrd_dec) This should fit on one line with 96 text width?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2150: u8 mr23 = 0x3F; Add a comment, why you initialize this to 0x3f?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2171: u8 unsigned int?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2183: 0xFF coreboot uses lowercase hex numbers.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2185: 0x%X %#X adds the 0x itself to my knowledge.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2214: void dramc_hw_dqsosc(u8 chn) Add a function description (with a reference to the datasheet section)?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2243: u8 unsigned int
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2248: u16 *osc_thrd_inc, u16 *osc_thrd_dec) Should fit on one line.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2251: u8 mr23 = 0x3F; Why this value?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2291: u8 unsigned int
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2316: return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d); Please add spaces around the operators.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/emi... File src/soc/mediatek/mt8183/emi.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/emi... PS9, Line 87: freq_tbl = freq_shuffle; freq_tbl = CONFIG_MT8183_DRAM_EMCP ? freq_shuffle_emcp : freq_shuffle
Duan huayang has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 9:
(30 comments)
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: do
does
Done
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: maybe
may be
Done
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: it maybe : cause the TX data transmission error.
It may cause a TX data transmission error. […]
system will do DVFS switch background after DVFS module init success at kernel, if the DRAM have data error, kernel will report random crash errors.
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@11 PS9, Line 11: Need use standard dqsosc do TX window tracking for DDR DVFS feature.
Do you mean? […]
yes
https://review.coreboot.org/c/coreboot/+/37996/5/src/soc/mediatek/mt8183/Kco... File src/soc/mediatek/mt8183/Kconfig:
https://review.coreboot.org/c/coreboot/+/37996/5/src/soc/mediatek/mt8183/Kco... PS5, Line 22: default y
Done
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_basic_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 430: u8
unsigned int
why use 'unsigned int' instead of u8 here?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 114: /* Wait MRW command fired */
Maybe? […]
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 1635: {0}
Please add spaces around the 0.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 1683: dramc_dbg("u1DelayCellOfst[%d]=%d cells (%d PI)\n",
Should be a separate commit next time.
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: 0x1 << 10
Define a macro for that bit?
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: while (!wait_us(10, read32(&ch[chn].nao.spcmdresp) & (0x1 << 10))) {
Can you use coreboot’s stopwatch framework?
what is the 'coreboot’s stopwatch framework', please give a example.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2141: time out
The noun is spelled *timeout* or *time-out*.
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2141: dramc_err("start DQSOSC fail (time out)\n");
Maybe: […]
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2142: return;
Should we return -1 on error?
no need return error value to caller.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2148: u16 *osc_thrd_inc, u16 *osc_thrd_dec)
This should fit on one line with 96 text width?
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2150:
Remove extra space
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2150: u8 mr23 = 0x3F;
Add a comment, why you initialize this to 0x3f?
is a default value. From LP4 JEDEC-209 standard SPEC, the MR23 is the 'DQS interval timer run time setting'
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2171: u8
unsigned int?
why unsigned int?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2183: 0xFF
coreboot uses lowercase hex numbers.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2185: 0x%X
%#X adds the 0x itself to my knowledge.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2189: tck = 1000000 / clock_rate;
Are you sure we want to round down here, rather than round up or round to closest?
can you give more detai?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2194: (mr23 * tck * tck)
Remove unnecessary parentheses. Same below.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2216: 0
Please use DRAM_DFS_SHUFFLE_1.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2221: *
Add spaces around binary operators.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2248: u16 *osc_thrd_inc, u16 *osc_thrd_dec)
Should fit on one line.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2251: u8 mr23 = 0x3F;
Why this value?
is a default value. From LP4 JEDEC-209 standard SPEC, the MR23 is the 'DQS interval timer run time setting
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2314: static int div_round_close(const int n, const int d)
There's already DIV_ROUND_CLOSEST in commonlib/include/commonlib/helpers. […]
replace with common API DIV_ROUND_CLOSEST later
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2330: shu_dst >= DRAM_DFS_SHUFFLE_MAX) {
Please align with previous line.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2340: +
Add spaces around binary operators.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2386: SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED);
Need one more tab. Same below.
Done
Hello Yu-Ping Wu, Duan huayang, Angel Pons, Julius Werner, Hung-Te Lin, build bot (Jenkins),
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#10).
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature
The TX window will offset to edge while system does DVFS switch, it may be cause the TX data transmission error. So use standard dqsosc do TX window tracking for DDR DVFS feature.
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 684 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/10
Yu-Ping Wu has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 10:
(11 comments)
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: it maybe : cause the TX data transmission error.
system will do DVFS switch background after DVFS module init success at kernel, if the DRAM have dat […]
Please add this description to the commit message.
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@11 PS9, Line 11: Need use standard dqsosc do TX window tracking for DDR DVFS feature.
yes
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_basic_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 430: u8
why use 'unsigned int' instead of u8 here?
Let's use u8 here for consistency.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 431: dramc_hw_dqsosc(chn);
Please change the function signature to `unsigned int`.
Same as above. Type u8 is used for channel throughout soc/mediatek/mt8183.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: while (!wait_us(10, read32(&ch[chn].nao.spcmdresp) & (0x1 << 10))) {
what is the 'coreboot’s stopwatch framework', please give a example.
I think Paul means the wait_us() macro. There's already a while loop inside it, could we change this to
if (!wait_us(10 * 10, ...)) dramc_err(...);
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2142: return;
no need return error value to caller.
So what would happen if this failed?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2171: u8
why unsigned int?
Same as above.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2189: tck = 1000000 / clock_rate;
can you give more detai?
We've seen plenty of situations where the truncation in integral division leads to inaccurate result. I'm just saying that we should be careful when doing this.
If you have tested this function with 4 different clock rates, then I think we're good here.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2243: u8
unsigned int
Same.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2251: u8 mr23 = 0x3F;
is a default value. […]
Since this value appears more than once, we should define a constant for it. Something like:
#define MR23_DEFAULT_VALUE 0x3f
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2291: u8
unsigned int
Same.
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 10:
(3 comments)
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: while (!wait_us(10, read32(&ch[chn].nao.spcmdresp) & (0x1 << 10))) {
I think Paul means the wait_us() macro. […]
Sorry for the late replay. Please search for `stopwatch_init_msecs_expire()` and `stopwatch_expired()` in the coreboot code.
https://review.coreboot.org/cgit/coreboot.git/tree/src/include/timer.h#n162
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2150: u8 mr23 = 0x3F;
is a default value. […]
Add that as a comment?
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2251: u8 mr23 = 0x3F;
Since this value appears more than once, we should define a constant for it. Something like: […]
Good idea.
Julius Werner has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 10:
(1 comment)
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: while (!wait_us(10, read32(&ch[chn].nao.spcmdresp) & (0x1 << 10))) {
Sorry for the late replay. […]
Paul, wait_us() is a convenience wrapper around the stopwatch framework (see https://review.coreboot.org/cgit/coreboot.git/tree/src/include/timer.h#n200) that is designed specifically for situations like this. It is the preferred way of handling "wait for a state change or timeout" cases like this.
And, yes, it should just be
if (!wait_us(100, ...)) dramc_err(...);
There's no need to put another loop around it.
Duan huayang has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 10:
(11 comments)
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/9//COMMIT_MSG@9 PS9, Line 9: it maybe : cause the TX data transmission error.
Please add this description to the commit message.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_basic_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 430: u8
Let's use u8 here for consistency.
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 431: dramc_hw_dqsosc(chn);
Same as above. Type u8 is used for channel throughout soc/mediatek/mt8183.
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2139: while (!wait_us(10, read32(&ch[chn].nao.spcmdresp) & (0x1 << 10))) {
Paul, wait_us() is a convenience wrapper around the stopwatch framework (see https://review. […]
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2142: return;
So what would happen if this failed?
the DDR not response to the DRAM controler, the error result undefined!
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2150: u8 mr23 = 0x3F;
Add that as a comment?
I think no need add a comment for this.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2171: u8
Same as above.
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2189: tck = 1000000 / clock_rate;
We've seen plenty of situations where the truncation in integral division leads to inaccurate result […]
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2214: void dramc_hw_dqsosc(u8 chn)
Add a function description (with a reference to the datasheet section)?
most of this is accomplished by the DRAM control hardware, no need detail description.
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2251: u8 mr23 = 0x3F;
Good idea.
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2316: return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d);
Please add spaces around the operators.
use DIV_ROUND_CLOSEST replace this API.remove this API later.
Hello Hung-Te Lin, build bot (Jenkins), Julius Werner, Angel Pons, Yu-Ping Wu, Duan huayang,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#11).
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature
The TX window will offset to edge while system does DVFS switch, it may be cause the TX data transmission error and cause kernel randomly crash. So use standard dqsosc do TX window tracking for DDR DVFS feature.
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 682 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/11
build bot (Jenkins) has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 11:
(1 comment)
https://review.coreboot.org/c/coreboot/+/37996/11/src/soc/mediatek/mt8183/in... File src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h:
https://review.coreboot.org/c/coreboot/+/37996/11/src/soc/mediatek/mt8183/in... PS11, Line 42: #define MR23_DEFAULT_VALUE 0x3f please, no space before tabs
Hello Hung-Te Lin, build bot (Jenkins), Julius Werner, Angel Pons, Yu-Ping Wu, Duan huayang,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#12).
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature
The TX window will offset to edge while system does DVFS switch, it may be cause the TX data transmission error and cause kernel randomly crash. So use standard dqsosc do TX window tracking for DDR DVFS feature.
BUG=b:none BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 682 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/12
Yu-Ping Wu has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 12:
(6 comments)
https://review.coreboot.org/c/coreboot/+/37996/12//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/12//COMMIT_MSG@13 PS12, Line 13: b:none b:142358843
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2142: return;
the DDR not response to the DRAM controler, the error result undefined!
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2214: void dramc_hw_dqsosc(u8 chn)
most of this is accomplished by the DRAM control hardware, no need detail description.
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2316: return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d);
use DIV_ROUND_CLOSEST replace this API.remove this API later.
Ack
https://review.coreboot.org/c/coreboot/+/37996/12/src/soc/mediatek/mt8183/dr... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/12/src/soc/mediatek/mt8183/dr... PS12, Line 122: 0x%x %#x
https://review.coreboot.org/c/coreboot/+/37996/12/src/soc/mediatek/mt8183/dr... PS12, Line 2181: 0x%X %#x
Hello Hung-Te Lin, build bot (Jenkins), Julius Werner, Angel Pons, Yu-Ping Wu, Duan huayang,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/37996
to look at the new patch set (#13).
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature
The TX window will offset to edge while system does DVFS switch, it may be cause the TX data transmission error and cause kernel randomly crash. So use standard dqsosc do TX window tracking for DDR DVFS feature.
BUG=b:142358843 BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 682 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/13
Yu-Ping Wu has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 13:
(3 comments)
https://review.coreboot.org/c/coreboot/+/37996/12//COMMIT_MSG Commit Message:
https://review.coreboot.org/c/coreboot/+/37996/12//COMMIT_MSG@13 PS12, Line 13: b:none
b:142358843
Done
https://review.coreboot.org/c/coreboot/+/37996/12/src/soc/mediatek/mt8183/dr... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/12/src/soc/mediatek/mt8183/dr... PS12, Line 122: 0x%x
%#x
Done
https://review.coreboot.org/c/coreboot/+/37996/12/src/soc/mediatek/mt8183/dr... PS12, Line 2181: 0x%X
%#x
Done
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 13: Code-Review+1
Yu-Ping Wu has uploaded a new patch set (#14) to the change originally created by huayang duan. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: Do TX tracking for DRAM DVFS feature ......................................................................
soc/mediatek/mt8183: Do TX tracking for DRAM DVFS feature
The TX window will offset to edge during DVFS switch, which may cause TX data transmission error and random kernel crash. Therefore, use the standard dqsosc (DQS Oscillator) for TX window tracking.
BUG=b:142358843 BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 776 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/96/37996/14
Yu-Ping Wu has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: Do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 14:
(3 comments)
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... File src/soc/mediatek/mt8183/dramc_pi_calibration_api.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2150: u8 mr23 = 0x3F;
I think no need add a comment for this.
Ack
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/dra... PS9, Line 2314: static int div_round_close(const int n, const int d)
replace with common API DIV_ROUND_CLOSEST later
Done
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/emi... File src/soc/mediatek/mt8183/emi.c:
https://review.coreboot.org/c/coreboot/+/37996/9/src/soc/mediatek/mt8183/emi... PS9, Line 87: freq_tbl = freq_shuffle;
freq_tbl = CONFIG_MT8183_DRAM_EMCP ? freq_shuffle_emcp : freq_shuffle
Done
Hung-Te Lin has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: Do TX tracking for DRAM DVFS feature ......................................................................
Patch Set 14: Code-Review+2
Patrick Georgi has submitted this change. ( https://review.coreboot.org/c/coreboot/+/37996 )
Change subject: soc/mediatek/mt8183: Do TX tracking for DRAM DVFS feature ......................................................................
soc/mediatek/mt8183: Do TX tracking for DRAM DVFS feature
The TX window will offset to edge during DVFS switch, which may cause TX data transmission error and random kernel crash. Therefore, use the standard dqsosc (DQS Oscillator) for TX window tracking.
BUG=b:142358843 BRANCH=kukui TEST=Boots correctly on Kukui
Change-Id: Idcf9213a488e795df3faf64b03588cfe55cb2f81 Signed-off-by: Huayang Duan huayang.duan@mediatek.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/37996 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Hung-Te Lin hungte@chromium.org --- M src/soc/mediatek/mt8183/dramc_pi_basic_api.c M src/soc/mediatek/mt8183/dramc_pi_calibration_api.c M src/soc/mediatek/mt8183/emi.c M src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h M src/soc/mediatek/mt8183/include/soc/dramc_register.h 5 files changed, 776 insertions(+), 14 deletions(-)
Approvals: build bot (Jenkins): Verified Hung-Te Lin: Looks good to me, approved
diff --git a/src/soc/mediatek/mt8183/dramc_pi_basic_api.c b/src/soc/mediatek/mt8183/dramc_pi_basic_api.c index 1eb86f4..c7d6c74 100644 --- a/src/soc/mediatek/mt8183/dramc_pi_basic_api.c +++ b/src/soc/mediatek/mt8183/dramc_pi_basic_api.c @@ -427,6 +427,9 @@ transfer_pll_to_spm_control(); setbits32(&mtk_spm->spm_power_on_val0, 0x1 << 25);
+ for (u8 chn = 0; chn < CHANNEL_MAX; chn++) + dramc_hw_dqsosc(chn); + /* RX_TRACKING: ON */ for (u8 chn = 0; chn < CHANNEL_MAX; chn++) dramc_rx_input_delay_tracking(chn); @@ -498,6 +501,7 @@ (0x3 << 4) | (0x1 << 2) | (0x1 << 0)); setbits32(&ch[chn].ao.dummy_rd, 0x3 << 26); } + dramc_dqs_precalculation_preset();
enable_emi_dcm(); dramc_enable_dramc_dcm(); diff --git a/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c b/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c index 0ec0193..4ccc7fc 100644 --- a/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c +++ b/src/soc/mediatek/mt8183/dramc_pi_calibration_api.c @@ -105,6 +105,25 @@ CKECTRL_CKEFIXOFF, cke_off); }
+static u16 dramc_mode_reg_read(u8 chn, u8 mr_idx) +{ + u16 value; + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSMA, mr_idx); + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_MRREN, 1); + + /* Wait until MRW command fired */ + while (READ32_BITFIELD(&ch[chn].nao.spcmdresp, SPCMDRESP_MRR_RESPONSE) + == 0) + udelay(1); + + value = READ32_BITFIELD(&ch[chn].nao.mrr_status, MRR_STATUS_MRR_REG); + + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_MRREN, 0); + dramc_dbg("Read MR%d =%#x\n", mr_idx, value); + + return value; +} + void dramc_mode_reg_write(u8 chn, u8 mr_idx, u8 value) { u32 ckectrl_bak = read32(&ch[chn].ao.ckectrl); @@ -117,7 +136,7 @@ /* Wait MRW command fired */ while (READ32_BITFIELD(&ch[chn].nao.spcmdresp, SPCMDRESP_MRW_RESPONSE) == 0) - ; + udelay(1);
SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_MRWEN, 0); write32(&ch[chn].ao.ckectrl, ckectrl_bak); @@ -1577,17 +1596,9 @@ } }
-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 u32 get_freq_group_clock(u8 freq_group) { - int index, clock_rate; - u8 use_delay_cell; - u32 byte_dly_cell[DQS_NUMBER] = {0}; - struct per_byte_dly center_dly[DQS_NUMBER]; - u16 tune_diff, dq_delay_cell[DQ_DATA_WIDTH]; - + u32 clock_rate = 0;
/* * The clock rate is usually (frequency / 2 - delta), where the delta @@ -1609,9 +1620,27 @@ break; default: die("Invalid DDR frequency group %u\n", freq_group); - return; + break; }
+ return clock_rate; +} + +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) +{ + int index, clock_rate; + u8 use_delay_cell; + u32 byte_dly_cell[DQS_NUMBER] = { 0 }; + struct per_byte_dly center_dly[DQS_NUMBER]; + u16 tune_diff, dq_delay_cell[DQ_DATA_WIDTH]; + + clock_rate = get_freq_group_clock(freq_group); + if (type == TX_WIN_DQ_ONLY && get_freq_fsq(freq_group) == FSP_1) use_delay_cell = 1; else @@ -1653,7 +1682,7 @@ dq_delay_cell[index] = ((tune_diff * 100000000) / (clock_rate * 64)) / dly_cell_unit; byte_dly_cell[byte] |= (dq_delay_cell[index] << (bit * 4)); - dramc_show("u1DelayCellOfst[%d]=%d cells (%d PI)\n", + dramc_dbg("u1DelayCellOfst[%d]=%d cells (%d PI)\n", index, dq_delay_cell[index], tune_diff); } } @@ -2104,6 +2133,566 @@ (0xff << 8) | (0x9 << 2) | ROEN); }
+static void start_dqsosc(u8 chn) +{ + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_DQSOSCENEN, 1); + if (!wait_us(100, READ32_BITFIELD(&ch[chn].nao.spcmdresp, + SPCMDRESP_DQSOSCEN_RESPONSE))) { + dramc_err("start dqsosc timed out\n"); + return; + } + SET32_BITFIELDS(&ch[chn].ao.spcmd, SPCMD_DQSOSCENEN, 0); +} + +static void dqsosc_auto(u8 chn, u8 rank, u8 freq_group, + u16 *osc_thrd_inc, u16 *osc_thrd_dec) +{ + u8 mr23 = MR23_DEFAULT_VALUE; + u16 mr18, mr19; + u16 dqsosc_cnt[2], dqs_cnt, dqsosc, thrd_inc, thrd_dec; + u32 clock_rate, tck; + + struct reg_value regs_bak[] = { + {&ch[chn].ao.mrs}, + {&ch[chn].ao.dramc_pd_ctrl}, + {&ch[chn].ao.ckectrl}, + }; + + for (size_t i = 0; i < ARRAY_SIZE(regs_bak); i++) + regs_bak[i].value = read32(regs_bak[i].addr); + + SET32_BITFIELDS(&ch[chn].ao.rkcfg, RKCFG_DQSOSC2RK, 0); + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSRK, rank); + SET32_BITFIELDS(&ch[chn].ao.mpc_option, MPC_OPTION_MPCRKEN, 1); + + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRSRK, rank); + dramc_mode_reg_write(chn, 23, mr23); + + for (u8 shu = 0; shu < DRAM_DFS_SHUFFLE_MAX; shu++) + SET32_BITFIELDS(&ch[chn].ao.shu[shu].scintv, + SHU_SCINTV_DQSOSCENDIS, 1); + + SET32_BITFIELDS(&ch[chn].ao.dramc_pd_ctrl, + DRAMC_PD_CTRL_MIOCKCTRLOFF, 1); + dramc_cke_fix_onoff(chn, true, false); + + start_dqsosc(chn); + udelay(1); + SET32_BITFIELDS(&ch[chn].ao.mrs, MRS_MRRRK, rank); + + mr18 = dramc_mode_reg_read(chn, 18); + mr19 = dramc_mode_reg_read(chn, 19); + dqsosc_cnt[0] = (mr18 & 0xff) | ((mr19 & 0xff) << 8); + dqsosc_cnt[1] = (mr18 >> 8) | (mr19 & 0xff00); + dramc_dbg("DQSOscCnt B0=%#x, B1=%#x\n", dqsosc_cnt[0], dqsosc_cnt[1]); + + /* get the INC and DEC values */ + clock_rate = get_freq_group_clock(freq_group); + tck = 1000000 / clock_rate; + + dqs_cnt = (mr18 & 0xff) | ((mr19 & 0xff) << 8); + if (dqs_cnt != 0) { + dqsosc = mr23 * 16 * 1000000 / (2 * dqs_cnt * clock_rate); + thrd_inc = mr23 * tck * tck / (dqsosc * dqsosc * 10); + thrd_dec = 3 * mr23 * tck * tck / (dqsosc * dqsosc * 20); + } else { + dqsosc = 0; + thrd_inc = 0x6; + thrd_dec = 0x4; + } + osc_thrd_inc[rank] = thrd_inc; + osc_thrd_dec[rank] = thrd_dec; + dramc_dbg("CH%d_RK%d: MR18=%#x, MR19=%#x, DQSOSC=%d, MR23=%d, " + "INC=%d, DEC=%d\n", + chn, rank, mr18, mr19, dqsosc, mr23, thrd_inc, thrd_dec); + + for (size_t i = 0; i < ARRAY_SIZE(regs_bak); i++) + write32(regs_bak[i].addr, regs_bak[i].value); + + SET32_BITFIELDS(&ch[chn].ao.shu[0].rk[rank].dqsosc, + SHU1RK0_DQSOSC_DQSOSC_BASE_RK0, dqsosc_cnt[0], + SHU1RK0_DQSOSC_DQSOSC_BASE_RK0_B1, dqsosc_cnt[1]); +} + +void dramc_hw_dqsosc(u8 chn) +{ + u32 freq_shu1 = get_shu_freq(DRAM_DFS_SHUFFLE_1); + u32 freq_shu2 = get_shu_freq(DRAM_DFS_SHUFFLE_2); + u32 freq_shu3 = get_shu_freq(DRAM_DFS_SHUFFLE_3); + + SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, + RK2_DQSOSC_FREQ_RATIO_TX_0, freq_shu2 * 8 / freq_shu1, + RK2_DQSOSC_FREQ_RATIO_TX_1, freq_shu3 * 8 / freq_shu1); + SET32_BITFIELDS(&ch[chn].ao.rk[2].dqsosc, + RK2_DQSOSC_FREQ_RATIO_TX_3, freq_shu1 * 8 / freq_shu2, + RK2_DQSOSC_FREQ_RATIO_TX_4, freq_shu3 * 8 / freq_shu2); + SET32_BITFIELDS(&ch[chn].ao.rk[2].dummy_rd_bk, + RK2_DUMMY_RD_BK_FREQ_RATIO_TX_6, + freq_shu1 * 8 / freq_shu3, + RK2_DUMMY_RD_BK_FREQ_RATIO_TX_7, + freq_shu2 * 8 / freq_shu3); + + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[0], + PRE_TDQSCK1_SHU_PRELOAD_TX_HW, 1, + PRE_TDQSCK1_SHU_PRELOAD_TX_START, 0, + PRE_TDQSCK1_SW_UP_TX_NOW_CASE, 0); + + SET32_BITFIELDS(&ch[chn].ao.mpc_option, MPC_OPTION_MPC_BLOCKALE_OPT, 0); + SET32_BITFIELDS(&ch[chn].phy.misc_ctrl1, MISC_CTRL1_R_DMARPIDQ_SW, 1); + SET32_BITFIELDS(&ch[chn].ao.dqsoscr, DQSOSCR_ARUIDQ_SW, 1); + SET32_BITFIELDS(&ch[chn].ao.dqsoscr, DQSOSCR_DQSOSCRDIS, 1); + + SET32_BITFIELDS(&ch[chn].ao.rk[0].dqsosc, RK0_DQSOSC_DQSOSCR_RK0EN, 1); + SET32_BITFIELDS(&ch[chn].ao.rk[1].dqsosc, RK1_DQSOSC_DQSOSCR_RK1EN, 1); + SET32_BITFIELDS(&ch[chn].ao.dqsoscr, DQSOSCR_DQSOSC_CALEN, 1); + + for (u8 shu = 0; shu < DRAM_DFS_SHUFFLE_MAX; shu++) + SET32_BITFIELDS(&ch[chn].ao.shu[shu].scintv, + SHU_SCINTV_DQSOSCENDIS, 1); +} + +static void dqsosc_shu_settings(u8 chn, u8 freq_group, + u16 *osc_thrd_inc, u16 *osc_thrd_dec) +{ + u8 filt_pithrd, w2r_sel, upd_sel; + u8 mr23 = MR23_DEFAULT_VALUE; + u16 prd_cnt, thrd_inc, thrd_dec; + + SET32_BITFIELDS(&ch[chn].ao.shu[0].scintv, + SHU_SCINTV_DQS2DQ_SHU_PITHRD, 0); + SET32_BITFIELDS(&ch[chn].ao.rk[0].dqsosc, + RK0_DQSOSC_R_DMDQS2DQ_FILT_OPT, 0); + + switch (freq_group) { + case LP4X_DDR1600: + filt_pithrd = 0x5; + w2r_sel = 0x5; + upd_sel = 0x0; + break; + case LP4X_DDR2400: + filt_pithrd = 0x8; + w2r_sel = 0x2; + upd_sel = 0x0; + break; + case LP4X_DDR3200: + filt_pithrd = 0xA; + w2r_sel = 0x2; + upd_sel = 0x0; + break; + case LP4X_DDR3600: + filt_pithrd = 0xB; + w2r_sel = 0x2; + upd_sel = 0x0; + break; + default: + die("Invalid DDR frequency group %u\n", freq_group); + return; + } + + SET32_BITFIELDS(&ch[chn].ao.shu[0].scintv, + SHU_SCINTV_DQS2DQ_FILT_PITHRD, filt_pithrd); + SET32_BITFIELDS(&ch[chn].ao.shu[0].wodt, + SHU1_WODT_TXUPD_W2R_SEL, w2r_sel, + SHU1_WODT_TXUPD_SEL, upd_sel); + + prd_cnt = mr23 / 4 + 3; + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsosc_prd, + SHU1_DQSOSC_PRD_DQSOSC_PRDCNT, prd_cnt); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscr, + SHU_DQSOSCR_DQSOSCRCNT, 0x40); + + for (u8 rk = RANK_0; rk < RANK_MAX; rk++) { + thrd_inc = osc_thrd_inc[rk]; + thrd_dec = osc_thrd_dec[rk]; + + if (rk == RANK_0) { + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscthrd, + SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK0, + thrd_inc); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscthrd, + SHU_DQSOSCTHRD_DQSOSCTHRD_DEC_RK0, + thrd_dec); + } else { + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscthrd, + SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK1_7TO0, + thrd_inc & 0xFF); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsosc_prd, + SHU1_DQSOSC_PRD_DQSOSCTHRD_INC_RK1_11TO8, + (thrd_inc & 0xF00) >> 8); + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsosc_prd, + SHU1_DQSOSC_PRD_DQSOSCTHRD_DEC_RK1, + thrd_dec); + } + } + + SET32_BITFIELDS(&ch[chn].ao.shu[0].dqsoscr2, + SHU_DQSOSCR2_DQSOSCENCNT, 0x1FF); +} + +void dramc_dqs_precalculation_preset(void) +{ + u32 jump_ratio_index = 0; + u16 jump_ratio[DRAM_DFS_SHUFFLE_MAX * HW_REG_SHUFFLE_MAX] = {0}; + u32 u4value = 0, u4value1 = 0; + + for (u8 shu_src = 0; shu_src < HW_REG_SHUFFLE_MAX; shu_src++) + for (u8 shu_dst = 0; shu_dst < HW_REG_SHUFFLE_MAX; shu_dst++) { + if (shu_src == shu_dst) + continue; + if (shu_src >= DRAM_DFS_SHUFFLE_MAX || + shu_dst >= DRAM_DFS_SHUFFLE_MAX) { + jump_ratio_index++; + continue; + } + + jump_ratio[jump_ratio_index] = DIV_ROUND_CLOSEST( + (get_shu_freq(shu_dst) >> 1) * 32, + get_shu_freq(shu_src) >> 1); + dramc_dbg("Jump_RATIO [%d]: %x Freq %d -> %d DDR%d ->" + " DDR%d\n", + jump_ratio_index, + jump_ratio[jump_ratio_index], + shu_src + 1, shu_dst + 1, + get_shu_freq(shu_src), get_shu_freq(shu_dst)); + jump_ratio_index++; + } + + for (size_t chn = 0; chn < CHANNEL_MAX; chn++) { + struct dramc_ao_regs_shu *shu = &ch[chn].ao.shu[0]; + struct dramc_ao_regs_rk *rk = &ch[chn].ao.rk[0]; + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[0], + PRE_TDQSCK1_TDQSCK_PRECAL_HW, 1); + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[1], + PRE_TDQSCK2_TDDQSCK_JUMP_RATIO0, jump_ratio[0], + PRE_TDQSCK2_TDDQSCK_JUMP_RATIO1, jump_ratio[1], + PRE_TDQSCK2_TDDQSCK_JUMP_RATIO2, jump_ratio[2], + PRE_TDQSCK2_TDDQSCK_JUMP_RATIO3, jump_ratio[3]); + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[2], + PRE_TDQSCK3_TDDQSCK_JUMP_RATIO4, jump_ratio[4], + PRE_TDQSCK3_TDDQSCK_JUMP_RATIO5, jump_ratio[5], + PRE_TDQSCK3_TDDQSCK_JUMP_RATIO6, jump_ratio[6], + PRE_TDQSCK3_TDDQSCK_JUMP_RATIO7, jump_ratio[7]); + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[3], + PRE_TDQSCK4_TDDQSCK_JUMP_RATIO8, jump_ratio[8], + PRE_TDQSCK4_TDDQSCK_JUMP_RATIO9, jump_ratio[9], + PRE_TDQSCK4_TDDQSCK_JUMP_RATIO10, jump_ratio[10], + PRE_TDQSCK4_TDDQSCK_JUMP_RATIO11, jump_ratio[11]); + + for (u8 rnk = RANK_0; rnk < RANK_MAX; rnk++) { + /* Shuffle 0 */ + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[0], + RK0_PRE_TDQSCK1_TDQSCK_UIFREQ1_B0R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS0IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[0], + RK0_PRE_TDQSCK1_TDQSCK_PIFREQ1_B0R0, + u4value); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[2], + RK0_PRE_TDQSCK3_TDQSCK_UIFREQ1_P1_B0R0, + (u4value << 3) | u4value1); + /* Shuffle 1 */ + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[0], + RK0_PRE_TDQSCK1_TDQSCK_UIFREQ2_B0R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS0IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[0], + RK0_PRE_TDQSCK1_TDQSCK_PIFREQ2_B0R0, u4value); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[2], + RK0_PRE_TDQSCK3_TDQSCK_UIFREQ2_P1_B0R0, + (u4value << 3) | u4value1); + /* Shuffle 2 */ + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[1], + RK0_PRE_TDQSCK2_TDQSCK_UIFREQ3_B0R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS0IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[1], + RK0_PRE_TDQSCK2_TDQSCK_PIFREQ3_B0R0, + u4value); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[2], + RK0_PRE_TDQSCK3_TDQSCK_UIFREQ3_P1_B0R0, + (u4value << 3) | u4value1); + + /* Byte 1 */ + /* Shuffle 0 */ + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[3], + RK0_PRE_TDQSCK4_TDQSCK_UIFREQ1_B1R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS1IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[3], + RK0_PRE_TDQSCK4_TDQSCK_PIFREQ1_B1R0, + u4value); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[5], + RK0_PRE_TDQSCK6_TDQSCK_UIFREQ1_P1_B1R0, + (u4value << 3) | u4value1); + /* Shuffle 1 */ + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[3], + RK0_PRE_TDQSCK4_TDQSCK_UIFREQ2_B1R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS1IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[3], + RK0_PRE_TDQSCK4_TDQSCK_PIFREQ2_B1R0, + u4value); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[5], + RK0_PRE_TDQSCK6_TDQSCK_UIFREQ2_P1_B1R0, + (u4value << 3) | u4value1); + /* Shuffle 2 */ + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[4], + RK0_PRE_TDQSCK5_TDQSCK_UIFREQ3_B1R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS1IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[4], + RK0_PRE_TDQSCK5_TDQSCK_PIFREQ3_B1R0, + u4value); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[5], + RK0_PRE_TDQSCK6_TDQSCK_UIFREQ3_P1_B1R0, + (u4value << 3) | u4value1); + + /* Byte 2 */ + /* Shuffle 0 */ + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[6], + RK0_PRE_TDQSCK7_TDQSCK_UIFREQ1_B2R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS2IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[6], + RK0_PRE_TDQSCK7_TDQSCK_PIFREQ1_B2R0, + u4value); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[8], + RK0_PRE_TDQSCK9_TDQSCK_UIFREQ1_P1_B2R0, + (u4value << 3) | u4value1); + /* Shuffle 1 */ + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[6], + RK0_PRE_TDQSCK7_TDQSCK_UIFREQ2_B2R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS2IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[6], + RK0_PRE_TDQSCK7_TDQSCK_PIFREQ2_B2R0, + u4value); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[8], + RK0_PRE_TDQSCK9_TDQSCK_UIFREQ2_P1_B2R0, + (u4value << 3) | u4value1); + /* Shuffle 2 */ + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[7], + RK0_PRE_TDQSCK8_TDQSCK_UIFREQ3_B2R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS2IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[7], + RK0_PRE_TDQSCK8_TDQSCK_PIFREQ3_B2R0, + u4value); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[8], + RK0_PRE_TDQSCK9_TDQSCK_UIFREQ3_P1_B2R0, + (u4value << 3) | u4value1); + + /* Byte 3 */ + /* Shuffle 0 */ + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[9], + RK0_PRE_TDQSCK10_TDQSCK_UIFREQ1_B3R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS3IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[9], + RK0_PRE_TDQSCK10_TDQSCK_PIFREQ1_B3R0, + u4value); + u4value = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[0].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[11], + RK0_PRE_TDQSCK12_TDQSCK_UIFREQ1_P1_B3R0, + (u4value << 3) | u4value1); + /* Shuffle 1 */ + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[9], + RK0_PRE_TDQSCK10_TDQSCK_UIFREQ2_B3R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS3IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[9], + RK0_PRE_TDQSCK10_TDQSCK_PIFREQ2_B3R0, + u4value); + u4value = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[1].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[11], + RK0_PRE_TDQSCK12_TDQSCK_UIFREQ2_P1_B3R0, + (u4value << 3) | u4value1); + /* Shuffle 2 */ + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[10], + RK0_PRE_TDQSCK11_TDQSCK_UIFREQ3_B3R0, + (u4value << 3) | u4value1); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].dqsien, + SHURK0_DQSIEN_R0DQS3IEN); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[10], + RK0_PRE_TDQSCK11_TDQSCK_PIFREQ3_B3R0, + u4value); + u4value = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg0, + SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1); + u4value1 = READ32_BITFIELD( + &shu[2].rk[rnk].selph_dqsg1, + SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1); + SET32_BITFIELDS(&rk[rnk].pre_tdqsck[11], + RK0_PRE_TDQSCK12_TDQSCK_UIFREQ3_P1_B3R0, + (u4value << 3) | u4value1); + } + + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[0], + PRE_TDQSCK1_TDQSCK_REG_DVFS, 0x1); + SET32_BITFIELDS(&ch[chn].ao.pre_tdqsck[0], + PRE_TDQSCK1_TDQSCK_HW_SW_UP_SEL, 1); + } +} + int dramc_calibrate_all_channels(const struct sdram_params *pams, u8 freq_group, const struct mr_value *mr) { @@ -2122,6 +2711,8 @@
bool test_passed; u8 rx_datlat[RANK_MAX] = {0}; + u16 osc_thrd_inc[RANK_MAX]; + u16 osc_thrd_dec[RANK_MAX]; for (u8 chn = 0; chn < CHANNEL_MAX; chn++) { for (u8 rk = RANK_0; rk < RANK_MAX; rk++) { dramc_dbg("Start K: freq=%d, ch=%d, rank=%d\n", @@ -2146,8 +2737,11 @@ dramc_window_perbit_cal(chn, rk, freq_group, RX_WIN_TEST_ENG, pams, fast_calib); dramc_auto_refresh_switch(chn, false); + + dqsosc_auto(chn, rk, freq_group, osc_thrd_inc, osc_thrd_dec); }
+ dqsosc_shu_settings(chn, freq_group, osc_thrd_inc, osc_thrd_dec); dramc_rx_dqs_gating_post_process(chn, freq_group); dramc_dual_rank_rx_datlat_cal(chn, freq_group, rx_datlat[0], rx_datlat[1]); } diff --git a/src/soc/mediatek/mt8183/emi.c b/src/soc/mediatek/mt8183/emi.c index e7cbda1..f1a2e39 100644 --- a/src/soc/mediatek/mt8183/emi.c +++ b/src/soc/mediatek/mt8183/emi.c @@ -34,7 +34,7 @@ [DRAM_DFS_SHUFFLE_3] = LP4X_DDR1600, };
-u32 frequency_table[LP4X_DDRFREQ_MAX] = { +static const u32 frequency_table[LP4X_DDRFREQ_MAX] = { [LP4X_DDR1600] = 1600, [LP4X_DDR2400] = 2400, [LP4X_DDR3200] = 3200, @@ -77,6 +77,13 @@ return read32(&mt8183_infracfg->dramc_wbr); }
+u32 get_shu_freq(u8 shu) +{ + const u8 *freq_tbl = CONFIG(MT8183_DRAM_EMCP) ? + freq_shuffle_emcp : freq_shuffle; + return frequency_table[freq_tbl[shu]]; +} + static u64 get_ch_rank_size(u8 chn, u8 rank) { u32 shift_for_16bit = 1; diff --git a/src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h b/src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h index 54f009e..59eb6dd 100644 --- a/src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h +++ b/src/soc/mediatek/mt8183/include/soc/dramc_pi_api.h @@ -29,6 +29,7 @@ #endif
#define DATLAT_TAP_NUMBER 32 +#define HW_REG_SHUFFLE_MAX 4
#define DRAMC_BROADCAST_ON 0x1f #define DRAMC_BROADCAST_OFF 0x0 @@ -38,6 +39,7 @@ #define IMP_DRVP_LP4X_UNTERM_VREF_SEL 0x1a #define IMP_DRVN_LP4X_UNTERM_VREF_SEL 0x16 #define IMP_TRACK_LP4X_UNTERM_VREF_SEL 0x1a +#define MR23_DEFAULT_VALUE 0x3f
enum dram_te_op { TE_OP_WRITE_READ_CHECK = 0, @@ -114,5 +116,8 @@ void dramc_enable_phy_dcm(bool bEn); void dramc_mode_reg_write(u8 chn, u8 mr_idx, u8 value); void dramc_cke_fix_onoff(u8 chn, bool fix_on, bool fix_off); +u32 get_shu_freq(u8 shu); +void dramc_hw_dqsosc(u8 chn); +void dramc_dqs_precalculation_preset(void);
#endif /* _DRAMC_PI_API_MT8183_H */ diff --git a/src/soc/mediatek/mt8183/include/soc/dramc_register.h b/src/soc/mediatek/mt8183/include/soc/dramc_register.h index b3ee6af..8c1f9ef 100644 --- a/src/soc/mediatek/mt8183/include/soc/dramc_register.h +++ b/src/soc/mediatek/mt8183/include/soc/dramc_register.h @@ -627,12 +627,18 @@ check_member(emi_mpu_regs, mpu_ctrl_d[0], 0x0800);
DEFINE_BITFIELD(MISC_STATUSA_REFRESH_QUEUE_CNT, 27, 24) +DEFINE_BIT(SPCMDRESP_DQSOSCEN_RESPONSE, 10) +DEFINE_BIT(SPCMDRESP_MRR_RESPONSE, 1) DEFINE_BIT(SPCMDRESP_MRW_RESPONSE, 0) +DEFINE_BITFIELD(MRR_STATUS_MRR_REG, 15, 0)
DEFINE_BIT(DDRCONF0_DM4TO1MODE, 22) DEFINE_BIT(DDRCONF0_RDATRST, 0) DEFINE_BIT(PERFCTL0_RWOFOEN, 4)
+DEFINE_BIT(RKCFG_DQSOSC2RK, 11) +DEFINE_BIT(DRAMC_PD_CTRL_MIOCKCTRLOFF, 26) + DEFINE_BIT(PADCTRL_DQIENLATEBEGIN, 3) DEFINE_BITFIELD(PADCTRL_DQIENQKEND, 1, 0)
@@ -655,16 +661,19 @@ DEFINE_BITFIELD(MRS_MRSMA, 20, 8) DEFINE_BITFIELD(MRS_MRSOP, 7, 0)
+DEFINE_BIT(SPCMD_DQSOSCENEN, 10) DEFINE_BIT(SPCMD_DQSGCNTRST, 9) DEFINE_BIT(SPCMD_DQSGCNTEN, 8) DEFINE_BIT(SPCMD_ZQLATEN, 6) DEFINE_BIT(SPCMD_RDDQCEN, 7) DEFINE_BIT(SPCMD_ZQCEN, 4) +DEFINE_BIT(SPCMD_MRREN, 1) DEFINE_BIT(SPCMD_MRWEN, 0)
DEFINE_BIT(SPCMDCTRL_RDDQCDIS, 11)
DEFINE_BIT(MPC_OPTION_MPCRKEN, 17) +DEFINE_BIT(MPC_OPTION_MPC_BLOCKALE_OPT, 0)
DEFINE_BIT(DVFSDLL_R_BYPASS_1ST_DLL_SHU1, 1)
@@ -727,7 +736,39 @@ DEFINE_BITFIELD(SHU_RANKCTL_RANKINCTL, 23, 20)
DEFINE_BIT(SHU1_WODT_DBIWR, 29) +DEFINE_BIT(SHU_SCINTV_DQSOSCENDIS, 30) +DEFINE_BITFIELD(SHU_SCINTV_DQS2DQ_SHU_PITHRD, 23, 18) DEFINE_BITFIELD(SHURK_DQSCTL_DQSINCTL, 3, 0) +DEFINE_BIT(RK0_DQSOSC_R_DMDQS2DQ_FILT_OPT, 29) +DEFINE_BIT(RK0_DQSOSC_DQSOSCR_RK0EN, 30) +DEFINE_BIT(RK1_DQSOSC_DQSOSCR_RK1EN, 30) + +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_0, 4, 0) +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_1, 9, 5) +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_3, 19, 15) +DEFINE_BITFIELD(RK2_DQSOSC_FREQ_RATIO_TX_4, 24, 20) +DEFINE_BITFIELD(RK2_DUMMY_RD_BK_FREQ_RATIO_TX_6, 7, 3) +DEFINE_BITFIELD(RK2_DUMMY_RD_BK_FREQ_RATIO_TX_7, 12, 8) + +DEFINE_BIT(PRE_TDQSCK1_SW_UP_TX_NOW_CASE, 16) +DEFINE_BIT(PRE_TDQSCK1_SHU_PRELOAD_TX_START, 18) +DEFINE_BIT(PRE_TDQSCK1_SHU_PRELOAD_TX_HW, 19) + +DEFINE_BITFIELD(SHU_SCINTV_DQS2DQ_FILT_PITHRD, 29, 24) +DEFINE_BITFIELD(SHU1_WODT_TXUPD_W2R_SEL, 16, 14) +DEFINE_BITFIELD(SHU1_WODT_TXUPD_SEL, 13, 12) +DEFINE_BITFIELD(SHU1_DQSOSC_PRD_DQSOSC_PRDCNT, 9, 0) +DEFINE_BITFIELD(SHU_DQSOSCR_DQSOSCRCNT, 7, 0) +DEFINE_BIT(DQSOSCR_ARUIDQ_SW, 7) +DEFINE_BIT(DQSOSCR_DQSOSCRDIS, 24) +DEFINE_BIT(DQSOSCR_DQSOSC_CALEN, 31) + +DEFINE_BITFIELD(SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK0, 11, 0) +DEFINE_BITFIELD(SHU_DQSOSCTHRD_DQSOSCTHRD_DEC_RK0, 23, 12) +DEFINE_BITFIELD(SHU_DQSOSCTHRD_DQSOSCTHRD_INC_RK1_7TO0, 31, 24) +DEFINE_BITFIELD(SHU1_DQSOSC_PRD_DQSOSCTHRD_INC_RK1_11TO8, 19, 16) +DEFINE_BITFIELD(SHU1_DQSOSC_PRD_DQSOSCTHRD_DEC_RK1, 31, 20) +DEFINE_BITFIELD(SHU_DQSOSCR2_DQSOSCENCNT, 8, 0)
DEFINE_BITFIELD(SHURK_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1, 14, 12) DEFINE_BITFIELD(SHURK_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1, 6, 4) @@ -736,6 +777,8 @@ DEFINE_BITFIELD(SHURK_SELPH_DQSG1_TX_DLY_DQS1_GATED_P1, 14, 12) DEFINE_BITFIELD(SHURK_SELPH_DQSG1_TX_DLY_DQS0_GATED_P1, 6, 4) DEFINE_BITFIELD(SHURK_SELPH_DQSG1_TX_DLY_DQS0_GATED, 2, 0) +DEFINE_BITFIELD(SHU1RK0_DQSOSC_DQSOSC_BASE_RK0, 15, 0) +DEFINE_BITFIELD(SHU1RK0_DQSOSC_DQSOSC_BASE_RK0_B1, 31, 16)
DEFINE_BIT(B0_DQ5_RG_RX_ARDQ_VREF_EN_B0, 16) DEFINE_BIT(B1_DQ5_RG_RX_ARDQ_VREF_EN_B1, 16) @@ -769,6 +812,115 @@ DEFINE_BITFIELD(SHU1_R0_CA_CMD9_RG_RK0_ARPI_CMD, 13, 8) DEFINE_BITFIELD(SHU1_R0_CA_CMD9_RG_RK0_ARPI_CS, 5, 0)
+/* DRAMC_REG_ADDR(DRAMC_REG_PRE_TDQSCK1) */ +DEFINE_BIT(PRE_TDQSCK1_TDQSCK_HW_SW_UP_SEL, 22) +DEFINE_BIT(PRE_TDQSCK1_TDQSCK_REG_DVFS, 25) +DEFINE_BIT(PRE_TDQSCK1_TDQSCK_PRECAL_HW, 26) + +/* DRAMC_REG_ADDR(DRAMC_REG_PRE_TDQSCK2) */ +DEFINE_BITFIELD(PRE_TDQSCK2_TDDQSCK_JUMP_RATIO3, 7, 0) +DEFINE_BITFIELD(PRE_TDQSCK2_TDDQSCK_JUMP_RATIO2, 15, 8) +DEFINE_BITFIELD(PRE_TDQSCK2_TDDQSCK_JUMP_RATIO1, 23, 16) +DEFINE_BITFIELD(PRE_TDQSCK2_TDDQSCK_JUMP_RATIO0, 31, 24) + +/* DRAMC_REG_ADDR(DRAMC_REG_PRE_TDQSCK3) */ +DEFINE_BITFIELD(PRE_TDQSCK3_TDDQSCK_JUMP_RATIO7, 7, 0) +DEFINE_BITFIELD(PRE_TDQSCK3_TDDQSCK_JUMP_RATIO6, 15, 8) +DEFINE_BITFIELD(PRE_TDQSCK3_TDDQSCK_JUMP_RATIO5, 23, 16) +DEFINE_BITFIELD(PRE_TDQSCK3_TDDQSCK_JUMP_RATIO4, 31, 24) + +/* DRAMC_REG_ADDR(DRAMC_REG_PRE_TDQSCK4) */ +DEFINE_BITFIELD(PRE_TDQSCK4_TDDQSCK_JUMP_RATIO11, 7, 0) +DEFINE_BITFIELD(PRE_TDQSCK4_TDDQSCK_JUMP_RATIO10, 15, 8) +DEFINE_BITFIELD(PRE_TDQSCK4_TDDQSCK_JUMP_RATIO9, 23, 16) +DEFINE_BITFIELD(PRE_TDQSCK4_TDDQSCK_JUMP_RATIO8, 31, 24) + +/* DRAMC_REG_ADDR(DRAMC_REG_SHURK0_SELPH_DQSG0) */ +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED_P1, 30, 28) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS3_GATED, 26, 24) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED_P1, 22, 20) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS2_GATED, 18, 16) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED_P1, 14, 12) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS1_GATED, 10, 8) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED_P1, 6, 4) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG0_TX_DLY_DQS0_GATED, 2, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_SHURK0_SELPH_DQSG1) */ +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED_P1, 30, 28) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS3_GATED, 26, 24) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED_P1, 22, 20) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS2_GATED, 18, 16) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED_P1, 14, 12) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS1_GATED, 10, 8) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED_P1, 6, 4) +DEFINE_BITFIELD(SHURK0_SELPH_DQSG1_REG_DLY_DQS0_GATED, 2, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK1) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK1_TDQSCK_PIFREQ2_B0R0, 25, 19) +DEFINE_BITFIELD(RK0_PRE_TDQSCK1_TDQSCK_UIFREQ2_B0R0, 18, 13) +DEFINE_BITFIELD(RK0_PRE_TDQSCK1_TDQSCK_PIFREQ1_B0R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK1_TDQSCK_UIFREQ1_B0R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_SHURK0_DQSIEN) */ +DEFINE_BITFIELD(SHURK0_DQSIEN_R0DQS3IEN, 30, 24) +DEFINE_BITFIELD(SHURK0_DQSIEN_R0DQS2IEN, 22, 16) +DEFINE_BITFIELD(SHURK0_DQSIEN_R0DQS1IEN, 14, 8) +DEFINE_BITFIELD(SHURK0_DQSIEN_R0DQS0IEN, 6, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK3) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK3_TDQSCK_UIFREQ3_P1_B0R0, 17, 12) +DEFINE_BITFIELD(RK0_PRE_TDQSCK3_TDQSCK_UIFREQ2_P1_B0R0, 11, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK3_TDQSCK_UIFREQ1_P1_B0R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK2) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK2_TDQSCK_PIFREQ3_B0R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK2_TDQSCK_UIFREQ3_B0R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK4) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK4_TDQSCK_PIFREQ2_B1R0, 25, 19) +DEFINE_BITFIELD(RK0_PRE_TDQSCK4_TDQSCK_UIFREQ2_B1R0, 18, 13) +DEFINE_BITFIELD(RK0_PRE_TDQSCK4_TDQSCK_PIFREQ1_B1R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK4_TDQSCK_UIFREQ1_B1R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK6) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK6_TDQSCK_UIFREQ3_P1_B1R0, 17, 12) +DEFINE_BITFIELD(RK0_PRE_TDQSCK6_TDQSCK_UIFREQ2_P1_B1R0, 11, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK6_TDQSCK_UIFREQ1_P1_B1R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK5) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK5_TDQSCK_PIFREQ3_B1R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK5_TDQSCK_UIFREQ3_B1R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK7) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK7_TDQSCK_PIFREQ2_B2R0, 25, 19) +DEFINE_BITFIELD(RK0_PRE_TDQSCK7_TDQSCK_UIFREQ2_B2R0, 18, 13) +DEFINE_BITFIELD(RK0_PRE_TDQSCK7_TDQSCK_PIFREQ1_B2R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK7_TDQSCK_UIFREQ1_B2R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK9) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK9_TDQSCK_UIFREQ3_P1_B2R0, 17, 12) +DEFINE_BITFIELD(RK0_PRE_TDQSCK9_TDQSCK_UIFREQ2_P1_B2R0, 11, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK9_TDQSCK_UIFREQ1_P1_B2R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK8) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK8_TDQSCK_PIFREQ3_B2R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK8_TDQSCK_UIFREQ3_B2R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK10) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK10_TDQSCK_PIFREQ2_B3R0, 25, 19) +DEFINE_BITFIELD(RK0_PRE_TDQSCK10_TDQSCK_UIFREQ2_B3R0, 18, 13) +DEFINE_BITFIELD(RK0_PRE_TDQSCK10_TDQSCK_PIFREQ1_B3R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK10_TDQSCK_UIFREQ1_B3R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK12) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK12_TDQSCK_UIFREQ3_P1_B3R0, 17, 12) +DEFINE_BITFIELD(RK0_PRE_TDQSCK12_TDQSCK_UIFREQ2_P1_B3R0, 11, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK12_TDQSCK_UIFREQ1_P1_B3R0, 5, 0) + +/* DRAMC_REG_ADDR(DRAMC_REG_RK0_PRE_TDQSCK11) */ +DEFINE_BITFIELD(RK0_PRE_TDQSCK11_TDQSCK_PIFREQ3_B3R0, 12, 6) +DEFINE_BITFIELD(RK0_PRE_TDQSCK11_TDQSCK_UIFREQ3_B3R0, 5, 0) + struct dramc_channel_regs { union { struct dramc_ddrphy_ao_regs phy;