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 <hdego...@redhat.com>
---
  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 <asm/arch/dram_sun4i.h>
  #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 */


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to