From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Fri, 19 Dec 2014 17:55:44 +0100 Subject: [U-Boot] [PATCH 11/14] sunxi: Fill memory before comparing it when doing dram init on sun6i In-Reply-To: <1418929933.26985.106.camel@hellion.org.uk> References: <1418761900-14035-1-git-send-email-hdegoede@redhat.com> <1418761900-14035-11-git-send-email-hdegoede@redhat.com> <1418929933.26985.106.camel@hellion.org.uk> Message-ID: <54945890.1020708@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 18-12-14 20:12, Ian Campbell wrote: > On Tue, 2014-12-16 at 21:31 +0100, Hans de Goede wrote: >> The sun8i boot0 code fills the DRAM with a "random" pattern before comparing >> it at different offsets to do columns, etc. detection. The sun6i boot0 code >> does not do it, but it seems like a good idea to do this regardless. > > Is this the right way round? Yes, while working on the sun8i code I noticed that it was prefilling memory before doing wrap-around checks like the sun6i code is doing too, and then I realized that the sun6i code was relying on whatever is in DRAM being random enough for its wrap-around tests to work, without ensuring it is random enough. > The existing sun6i code (which you are > moving here) seems to _rely_ on something having written a useful > pattern, which I would have assumed to have been boot0. Or else how does > it work now? Chance? Yep, it purely works by chance so far. Regards, Hans > >> The new mctl_mem_fill function this introduces is added as an inline helper >> in dram.h, so that it can be shared with the sun8i dram code. >> >> While at it move mctl_mem_matches to dram.h for re-use in sun8i too. >> >> Signed-off-by: Hans de Goede >> --- >> arch/arm/cpu/armv7/sunxi/dram_sun6i.c | 15 +-------------- >> arch/arm/include/asm/arch-sunxi/dram.h | 29 +++++++++++++++++++++++++++++ >> 2 files changed, 30 insertions(+), 14 deletions(-) >> >> diff --git a/arch/arm/cpu/armv7/sunxi/dram_sun6i.c b/arch/arm/cpu/armv7/sunxi/dram_sun6i.c >> index e1670e5..4675c48 100644 >> --- a/arch/arm/cpu/armv7/sunxi/dram_sun6i.c >> +++ b/arch/arm/cpu/armv7/sunxi/dram_sun6i.c >> @@ -326,20 +326,6 @@ static void mctl_port_cfg(void) >> writel(0x00000307, &mctl_com->mbagcr[5]); >> } >> >> -static bool mctl_mem_matches(u32 offset) >> -{ >> - const int match_count = 64; >> - int i, matches = 0; >> - >> - for (i = 0; i < match_count; i++) { >> - if (readl(CONFIG_SYS_SDRAM_BASE + i * 4) == >> - readl(CONFIG_SYS_SDRAM_BASE + offset + i * 4)) >> - matches++; >> - } >> - >> - return matches == match_count; >> -} >> - >> unsigned long sunxi_dram_init(void) >> { >> struct sunxi_mctl_com_reg * const mctl_com = >> @@ -391,6 +377,7 @@ unsigned long sunxi_dram_init(void) >> MCTL_CR_BANK(1) | MCTL_CR_RANK(1)); >> >> /* Detect and set page size */ >> + mctl_mem_fill(); >> for (columns = 7; columns < 20; columns++) { >> if (mctl_mem_matches(1 << columns)) >> break; >> diff --git a/arch/arm/include/asm/arch-sunxi/dram.h b/arch/arm/include/asm/arch-sunxi/dram.h >> index 18924f5..0bf718c 100644 >> --- a/arch/arm/include/asm/arch-sunxi/dram.h >> +++ b/arch/arm/include/asm/arch-sunxi/dram.h >> @@ -22,6 +22,8 @@ >> #include >> #endif >> >> +#define MCTL_MEM_FILL_MATCH_COUNT 64 >> + >> unsigned long sunxi_dram_init(void); >> >> /* >> @@ -37,4 +39,31 @@ static inline void mctl_await_completion(u32 *reg, u32 mask, u32 val) >> } >> } >> >> +/* >> + * Fill beginning of DRAM with "random" data for mctl_mem_matches() >> + */ >> +static inline void mctl_mem_fill(void) >> +{ >> + int i; >> + >> + for (i = 0; i < MCTL_MEM_FILL_MATCH_COUNT; i++) >> + writel(0xaa55aa55 + i, CONFIG_SYS_SDRAM_BASE + i * 4); >> +} >> + >> +/* >> + * Test if memory at offset offset matches memory at begin of DRAM >> + */ >> +static inline bool mctl_mem_matches(u32 offset) >> +{ >> + int i, matches = 0; >> + >> + for (i = 0; i < MCTL_MEM_FILL_MATCH_COUNT; i++) { >> + if (readl(CONFIG_SYS_SDRAM_BASE + i * 4) == >> + readl(CONFIG_SYS_SDRAM_BASE + offset + i * 4)) >> + matches++; >> + } >> + >> + return matches == MCTL_MEM_FILL_MATCH_COUNT; >> +} >> + >> #endif /* _SUNXI_DRAM_H */ > >