From: "haidong.zheng" <haidong.zh...@nxp.com>

On i.MX93/91, dynamic refresh rate should be disabled before doing any
MR read or write. Otherwise conflict may happen with read MR12/MR14 in
ddr_init.
We randomly meet DDR unstable with low drive mode frequencies and 1600MTS
DDR setting on iMX91. With this fix, the issue is gone.

Signed-off-by: haidong.zheng <haidong.zh...@nxp.com>
Tested-by: Ye Li <ye...@nxp.com>
Reviewed-by: Jacky Bai <ping....@nxp.com>
Signed-off-by: Peng Fan <peng....@nxp.com>
---
 drivers/ddr/imx/imx9/ddr_init.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/ddr/imx/imx9/ddr_init.c b/drivers/ddr/imx/imx9/ddr_init.c
index 
5a134dda78a331c21d4a75b2369c5b9314028bbc..42ba493ebca4d6efc5ee047dd3f049cebb24b69d
 100644
--- a/drivers/ddr/imx/imx9/ddr_init.c
+++ b/drivers/ddr/imx/imx9/ddr_init.c
@@ -266,6 +266,11 @@ void update_umctl2_rank_space_setting(struct 
dram_timing_info *dram_timing, unsi
 u32 ddrc_mrr(u32 chip_select, u32 mode_reg_num, u32 *mode_reg_val)
 {
        u32 temp;
+       u8 dyn_ref_rate_en = 0;
+
+       dyn_ref_rate_en = !!(readl(REG_DDR_SDRAM_CFG_3) & BIT(7));
+       if (dyn_ref_rate_en)
+               clrbits_le32(REG_DDR_SDRAM_CFG_3, BIT(7));
 
        writel(0x80000000, REG_DDR_SDRAM_MD_CNTL_2);
        temp = 0x80000000 | (chip_select << 28) | (mode_reg_num << 0);
@@ -281,12 +286,20 @@ u32 ddrc_mrr(u32 chip_select, u32 mode_reg_num, u32 
*mode_reg_val)
        writel(0x0, REG_DDR_SDRAM_MPR4);
        writel(0x0, REG_DDR_SDRAM_MD_CNTL_2);
 
+       if (dyn_ref_rate_en)
+               setbits_le32(REG_DDR_SDRAM_CFG_3, BIT(7));
+
        return 0;
 }
 
 void ddrc_mrs(u32 cs_sel, u32 opcode, u32 mr)
 {
        u32 regval;
+       u8 dyn_ref_rate_en = 0;
+
+       dyn_ref_rate_en = !!(readl(REG_DDR_SDRAM_CFG_3) & BIT(7));
+       if (dyn_ref_rate_en)
+               clrbits_le32(REG_DDR_SDRAM_CFG_3, BIT(7));
 
        regval = (cs_sel << 28) | (opcode << 6) | (mr);
        writel(regval, REG_DDR_SDRAM_MD_CNTL);
@@ -294,6 +307,9 @@ void ddrc_mrs(u32 cs_sel, u32 opcode, u32 mr)
        while ((readl(REG_DDR_SDRAM_MD_CNTL) & 0x80000000) == 0x80000000)
                ;
        check_ddrc_idle();
+
+       if (dyn_ref_rate_en)
+               setbits_le32(REG_DDR_SDRAM_CFG_3, BIT(7));
 }
 
 u32 lpddr4_mr_read(u32 mr_rank, u32 mr_addr)

-- 
2.35.3

Reply via email to