Hi Fabio, On 08/29/2016 11:48 AM, Eric Nelson wrote: > Hi Fabio, > > On 08/29/2016 10:56 AM, Fabio Estevam wrote: >> From: Fabio Estevam <fabio.este...@nxp.com> >> >> When running a NXP 4.1 kernel with U-Boot mainline we observe a >> hang when going into the lowest operational point of cpufreq. >> >> After comparing the SPL DDR initialization against the DCD table >> from NXP U-Boot, the key difference that causes the hang is the >> MDREF register setting. >> >> In all the DDR3 MX6UL boards we have the following configuration >> for MDREF: >> > > I think this commit message needs work. > > "we have" seems to mean that the NXP U-Boot fork has this > setting, but this isn't an explanation of why. >
After reviewing the manual, I think I understand why this is needed and something like this is probably better: The i.MX6UL kernel uses a 32kHz clock for to drive refresh in low power mode. Configure the MMDC to use it as the input for refresh in MMDC_MDREF. >> DATA 4 0x021B0020 0x00000800 >> >> ,which means: >> >> REF_SEL = 0 -->Periodic refresh cycle: 64kHz >> REFR = 1 ---> Refresh Rate - 2 refreshes >> >> So adjust the MDREF initialization for MX6UL to fix the kernel >> hang issue. >> >> Reported-by: Eric Nelson <e...@nelint.com> >> Signed-off-by: Fabio Estevam <fabio.este...@nxp.com> >> --- >> Changes since v1: >> - Newly introduced in this version >> >> arch/arm/cpu/armv7/mx6/ddr.c | 12 +++++++++--- >> 1 file changed, 9 insertions(+), 3 deletions(-) >> >> diff --git a/arch/arm/cpu/armv7/mx6/ddr.c b/arch/arm/cpu/armv7/mx6/ddr.c >> index f151eec..56d3e65 100644 >> --- a/arch/arm/cpu/armv7/mx6/ddr.c >> +++ b/arch/arm/cpu/armv7/mx6/ddr.c >> @@ -1183,7 +1183,7 @@ void mx6_ddr3_cfg(const struct mx6_ddr_sysinfo >> *sysinfo, >> volatile struct mmdc_p_regs *mmdc0; >> volatile struct mmdc_p_regs *mmdc1; >> u32 val; >> - u8 tcke, tcksrx, tcksre, txpdll, taofpd, taonpd, trrd; >> + u8 tcke, tcksrx, tcksre, txpdll, taofpd, taonpd, trrd, refr, refsel; >> u8 todtlon, taxpd, tanpd, tcwl, txp, tfaw, tcl; >> u8 todt_idle_off = 0x4; /* from DDR3 Script Aid spreadsheet */ >> u16 trcd, trc, tras, twr, tmrd, trtp, trp, twtr, trfc, txs, txpr; >> @@ -1472,9 +1472,15 @@ void mx6_ddr3_cfg(const struct mx6_ddr_sysinfo >> *sysinfo, >> MMDC1(mpzqhwctrl, val); >> >> /* Step 12: Configure and activate periodic refresh */ >> - mmdc0->mdref = (1 << 14) | /* REF_SEL: Periodic refresh cycle: 32kHz */ >> - (7 << 11); /* REFR: Refresh Rate - 8 refreshes */ > > I'm not understanding why this is CPU specific. Is the issue > >> + if (!is_mx6ul()) { > > Table 44-15 of the 6DQ reference manual says that this will generate > tREFI at 3.9uS (256kHz). > Never mind. Your comment is about the input clock, not the refresh cycle. I do wonder if both of these settings don't over-refresh the DDR3 though. >> + refsel = 1; /* REF_SEL: Periodic refresh cycle: 32kHz */ >> + refr = 7; /* REFR: Refresh Rate - 8 refreshes */ >> + } else { > > Table 33-15 of the 6UL manual says 7.8us (128 kHz). > >> + refsel = 0; /* REF_SEL: Periodic refresh cycle: 64kHz */ >> + refr = 1; /* REFR: Refresh Rate - 2 refreshes */ >> + } >> >> + mmdc0->mdref = (refsel << 14) | (refr << 11); >> /* Step 13: Deassert config request - init complete */ >> mmdc0->mdscr = 0x00000000; >> >> > > I did test this patch though, and I can confirm that the problem > I experienced (hang with low bus frequency) goes away with just > this change, so > > Tested-by: Eric Nelson <e...@nelint.com> > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot