|
@@ -39,6 +39,9 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
|
|
|
unsigned int csn_bnds_backup = 0, cs_sa, cs_ea, *csn_bnds_t;
|
|
|
int csn = -1;
|
|
|
#endif
|
|
|
+#ifdef CONFIG_SYS_FSL_ERRATUM_DDR_A003
|
|
|
+ u32 save1, save2;
|
|
|
+#endif
|
|
|
|
|
|
switch (ctrl_num) {
|
|
|
case 0:
|
|
@@ -197,6 +200,8 @@ step2:
|
|
|
out_be32(&ddr->ddr_wrlvl_cntl, regs->ddr_wrlvl_cntl & 0x7fffffff);
|
|
|
out_be32(&ddr->sdram_cfg_2, regs->ddr_sdram_cfg_2 & 0xffffffeb);
|
|
|
out_be32(&ddr->mtcr, 0);
|
|
|
+ save1 = in_be32(&ddr->debug[12]);
|
|
|
+ save2 = in_be32(&ddr->debug[21]);
|
|
|
out_be32(&ddr->debug[12], 0x00000015);
|
|
|
out_be32(&ddr->debug[21], 0x24000000);
|
|
|
out_be32(&ddr->sdram_interval, regs->ddr_sdram_interval & 0xffff);
|
|
@@ -214,6 +219,18 @@ step2:
|
|
|
0x04000000 |
|
|
|
MD_CNTL_WRCW |
|
|
|
MD_CNTL_MD_VALUE(0x02));
|
|
|
+#if (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
|
|
|
+ if (!(regs->cs[2].config & SDRAM_CS_CONFIG_EN))
|
|
|
+ break;
|
|
|
+ while (in_be32(&ddr->sdram_md_cntl) & MD_CNTL_MD_EN)
|
|
|
+ ;
|
|
|
+ out_be32(&ddr->sdram_md_cntl,
|
|
|
+ MD_CNTL_MD_EN |
|
|
|
+ MD_CNTL_CS_SEL_CS2_CS3 |
|
|
|
+ 0x04000000 |
|
|
|
+ MD_CNTL_WRCW |
|
|
|
+ MD_CNTL_MD_VALUE(0x02));
|
|
|
+#endif
|
|
|
break;
|
|
|
case 0x00100000:
|
|
|
out_be32(&ddr->sdram_md_cntl,
|
|
@@ -222,6 +239,18 @@ step2:
|
|
|
0x04000000 |
|
|
|
MD_CNTL_WRCW |
|
|
|
MD_CNTL_MD_VALUE(0x0a));
|
|
|
+#if (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
|
|
|
+ if (!(regs->cs[2].config & SDRAM_CS_CONFIG_EN))
|
|
|
+ break;
|
|
|
+ while (in_be32(&ddr->sdram_md_cntl) & MD_CNTL_MD_EN)
|
|
|
+ ;
|
|
|
+ out_be32(&ddr->sdram_md_cntl,
|
|
|
+ MD_CNTL_MD_EN |
|
|
|
+ MD_CNTL_CS_SEL_CS2_CS3 |
|
|
|
+ 0x04000000 |
|
|
|
+ MD_CNTL_WRCW |
|
|
|
+ MD_CNTL_MD_VALUE(0x0a));
|
|
|
+#endif
|
|
|
break;
|
|
|
case 0x00200000:
|
|
|
out_be32(&ddr->sdram_md_cntl,
|
|
@@ -230,6 +259,18 @@ step2:
|
|
|
0x04000000 |
|
|
|
MD_CNTL_WRCW |
|
|
|
MD_CNTL_MD_VALUE(0x12));
|
|
|
+#if (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
|
|
|
+ if (!(regs->cs[2].config & SDRAM_CS_CONFIG_EN))
|
|
|
+ break;
|
|
|
+ while (in_be32(&ddr->sdram_md_cntl) & MD_CNTL_MD_EN)
|
|
|
+ ;
|
|
|
+ out_be32(&ddr->sdram_md_cntl,
|
|
|
+ MD_CNTL_MD_EN |
|
|
|
+ MD_CNTL_CS_SEL_CS2_CS3 |
|
|
|
+ 0x04000000 |
|
|
|
+ MD_CNTL_WRCW |
|
|
|
+ MD_CNTL_MD_VALUE(0x12));
|
|
|
+#endif
|
|
|
break;
|
|
|
case 0x00300000:
|
|
|
out_be32(&ddr->sdram_md_cntl,
|
|
@@ -238,6 +279,18 @@ step2:
|
|
|
0x04000000 |
|
|
|
MD_CNTL_WRCW |
|
|
|
MD_CNTL_MD_VALUE(0x1a));
|
|
|
+#if (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
|
|
|
+ if (!(regs->cs[2].config & SDRAM_CS_CONFIG_EN))
|
|
|
+ break;
|
|
|
+ while (in_be32(&ddr->sdram_md_cntl) & MD_CNTL_MD_EN)
|
|
|
+ ;
|
|
|
+ out_be32(&ddr->sdram_md_cntl,
|
|
|
+ MD_CNTL_MD_EN |
|
|
|
+ MD_CNTL_CS_SEL_CS2_CS3 |
|
|
|
+ 0x04000000 |
|
|
|
+ MD_CNTL_WRCW |
|
|
|
+ MD_CNTL_MD_VALUE(0x1a));
|
|
|
+#endif
|
|
|
break;
|
|
|
default:
|
|
|
out_be32(&ddr->sdram_md_cntl,
|
|
@@ -246,6 +299,18 @@ step2:
|
|
|
0x04000000 |
|
|
|
MD_CNTL_WRCW |
|
|
|
MD_CNTL_MD_VALUE(0x02));
|
|
|
+#if (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
|
|
|
+ if (!(regs->cs[2].config & SDRAM_CS_CONFIG_EN))
|
|
|
+ break;
|
|
|
+ while (in_be32(&ddr->sdram_md_cntl) & MD_CNTL_MD_EN)
|
|
|
+ ;
|
|
|
+ out_be32(&ddr->sdram_md_cntl,
|
|
|
+ MD_CNTL_MD_EN |
|
|
|
+ MD_CNTL_CS_SEL_CS2_CS3 |
|
|
|
+ 0x04000000 |
|
|
|
+ MD_CNTL_WRCW |
|
|
|
+ MD_CNTL_MD_VALUE(0x02));
|
|
|
+#endif
|
|
|
printf("Unsupported RC10\n");
|
|
|
break;
|
|
|
}
|
|
@@ -259,8 +324,8 @@ step2:
|
|
|
out_be32(&ddr->ddr_zq_cntl, regs->ddr_zq_cntl);
|
|
|
out_be32(&ddr->ddr_wrlvl_cntl, regs->ddr_wrlvl_cntl);
|
|
|
out_be32(&ddr->sdram_cfg_2, regs->ddr_sdram_cfg_2);
|
|
|
- out_be32(&ddr->debug[12], 0x0);
|
|
|
- out_be32(&ddr->debug[21], 0x0);
|
|
|
+ out_be32(&ddr->debug[12], save1);
|
|
|
+ out_be32(&ddr->debug[21], save2);
|
|
|
out_be32(&ddr->sdram_interval, regs->ddr_sdram_interval);
|
|
|
|
|
|
}
|