diff options
Diffstat (limited to 'src/soc/nvidia/tegra132/sdram.c')
-rw-r--r-- | src/soc/nvidia/tegra132/sdram.c | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/src/soc/nvidia/tegra132/sdram.c b/src/soc/nvidia/tegra132/sdram.c index 0b1edf10f9..c1d178ed2e 100644 --- a/src/soc/nvidia/tegra132/sdram.c +++ b/src/soc/nvidia/tegra132/sdram.c @@ -475,7 +475,10 @@ static void sdram_set_clock_enable_signal(const struct sdram_params *param, (param->EmcDevSelect << EMC_NOP_NOP_DEV_SELECTN_SHIFT)), ®s->nop, EMC_NOP_NOP_CMD_MASK | EMC_NOP_NOP_DEV_SELECTN_MASK); +} +static void sdram_init_ddr3(const struct sdram_params *param, struct tegra_emc_regs *regs) +{ /* Write mode registers */ writel(param->EmcEmrs2, ®s->emrs2); writel(param->EmcEmrs3, ®s->emrs3); @@ -483,7 +486,44 @@ static void sdram_set_clock_enable_signal(const struct sdram_params *param, writel(param->EmcMrs, ®s->mrs); if (param->EmcExtraModeRegWriteEnable) { - writel(param->EmcMrwExtra, ®s->mrs); + writel(param->EmcMrsExtra, ®s->mrs); + } + + writel(param->EmcZcalInitDev0, ®s->zq_cal); + udelay(param->EmcZcalInitWait); + + if ((param->EmcDevSelect & 2) == 0) { + writel(param->EmcZcalInitDev1, ®s->zq_cal); + udelay(param->EmcZcalInitWait); + } +} + +static void sdram_init_lpddr3(const struct sdram_params *param, struct tegra_emc_regs *regs) +{ + /* Precharge all banks. DEV_SELECTN = 0 => Select all devices */ + writel(((param->EmcDevSelect << EMC_REF_DEV_SELECTN_SHIFT) | 1), ®s->pre); + + /* Send Reset MRW command */ + writel(param->EmcMrwResetCommand, ®s->mrw); + udelay(param->EmcMrwResetNInitWait); + + writel(param->EmcZcalInitDev0, ®s->mrw); + udelay(param->EmcZcalInitWait); + + if ((param->EmcDevSelect & 2) == 0) + { + writel(param->EmcZcalInitDev1, ®s->mrw); + udelay(param->EmcZcalInitWait); + } + + /* Write mode registers */ + writel(param->EmcMrw2, ®s->mrw2); + writel(param->EmcMrw1, ®s->mrw); + writel(param->EmcMrw3, ®s->mrw3); + writel(param->EmcMrw4, ®s->mrw4); + + if (param->EmcExtraModeRegWriteEnable) { + writel(param->EmcMrwExtra, ®s->mrw); } } @@ -493,14 +533,12 @@ static void sdram_init_zq_calibration(const struct sdram_params *param, if ((param->EmcZcalWarmColdBootEnables & EMC_ZCAL_WARM_COLD_BOOT_ENABLES_COLDBOOT_MASK) == 1) { /* Need to initialize ZCAL on coldboot. */ - writel(param->EmcZcalInitDev0, ®s->zq_cal); - udelay(param->EmcZcalInitWait); - - if ((param->EmcDevSelect & 2) == 0) { - writel(param->EmcZcalInitDev1, ®s->zq_cal); - udelay(param->EmcZcalInitWait); - } + if (param->MemoryType == NvBootMemoryType_Ddr3) + sdram_init_ddr3(param, regs); + else if (param->MemoryType == NvBootMemoryType_LpDdr2) + sdram_init_lpddr3(param, regs); } else { + /* Wait for DLL stablization time even without ZCAL */ udelay(param->EmcZcalInitWait); } } @@ -573,7 +611,8 @@ void sdram_init(const struct sdram_params *param) param->MemoryType, clock_get_pll_input_khz() * param->PllMFeedbackDivider / param->PllMInputDivider / (1 + param->PllMSelectDiv2)); - if (param->MemoryType != NvBootMemoryType_Ddr3) + if (param->MemoryType != NvBootMemoryType_Ddr3 && + param->MemoryType != NvBootMemoryType_LpDdr2) die("Unsupported memory type!\n"); sdram_configure_pmc(param, pmc); |