diff mbox

[U-Boot,v4,6/8] POST: add new memory regions test

Message ID 1315837122-11952-7-git-send-email-valentin.longchamp@keymile.com
State Accepted
Delegated to: Wolfgang Denk
Headers show

Commit Message

Valentin Longchamp Sept. 12, 2011, 2:18 p.m. UTC
This test is similar to the actual POST memory test but quicker and
far less complete. It checks the address and data lines and then only
tests some regularly placed sub regions of the RAM.
This can be useful when we want to test the RAM but we do not have enough
time to run the full memory test.

The POST memory test code was rearranged in order to avoid code duplication
between the two tests but the memory test functionnality remains the same.

Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
Signed-off-by: Holger Brunck <holger.brunck@keymile.com>
Ackey-by: Mike Frysinger <vapier@gentoo.org>
---
Changes for v3:
 - cosmetic changes in the test list
Changes for v4:
 - rebased on 2011.09-rc1
---
 include/post.h        |    1 +
 post/drivers/memory.c |   78 +++++++++++++++++++++++++++++++++++++------------
 post/tests.c          |   13 ++++++++
 3 files changed, 73 insertions(+), 19 deletions(-)

Comments

Wolfgang Denk Oct. 5, 2011, 6:54 p.m. UTC | #1
Dear Valentin Longchamp,

In message <1315837122-11952-7-git-send-email-valentin.longchamp@keymile.com> you wrote:
> This test is similar to the actual POST memory test but quicker and
> far less complete. It checks the address and data lines and then only
> tests some regularly placed sub regions of the RAM.
> This can be useful when we want to test the RAM but we do not have enough
> time to run the full memory test.
> 
> The POST memory test code was rearranged in order to avoid code duplication
> between the two tests but the memory test functionnality remains the same.
> 
> Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
> Signed-off-by: Holger Brunck <holger.brunck@keymile.com>
> Ackey-by: Mike Frysinger <vapier@gentoo.org>
> ---
> Changes for v3:
>  - cosmetic changes in the test list
> Changes for v4:
>  - rebased on 2011.09-rc1
> ---
>  include/post.h        |    1 +
>  post/drivers/memory.c |   78 +++++++++++++++++++++++++++++++++++++------------
>  post/tests.c          |   13 ++++++++
>  3 files changed, 73 insertions(+), 19 deletions(-)

Applied, thanks.

Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/include/post.h b/include/post.h
index e783b94..ac93f43 100644
--- a/include/post.h
+++ b/include/post.h
@@ -196,6 +196,7 @@  extern int memory_post_test(int flags);
 #define CONFIG_SYS_POST_CODEC		0x00200000
 #define CONFIG_SYS_POST_COPROC		0x00400000
 #define CONFIG_SYS_POST_FLASH		0x00800000
+#define CONFIG_SYS_POST_MEM_REGIONS	0x01000000
 
 #endif /* CONFIG_POST */
 
diff --git a/post/drivers/memory.c b/post/drivers/memory.c
index 69c5dbe..69973c0 100644
--- a/post/drivers/memory.c
+++ b/post/drivers/memory.c
@@ -153,7 +153,7 @@ 
 #include <post.h>
 #include <watchdog.h>
 
-#if CONFIG_POST & CONFIG_SYS_POST_MEMORY
+#if CONFIG_POST & (CONFIG_SYS_POST_MEMORY | CONFIG_SYS_POST_MEM_REGIONS)
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -413,23 +413,29 @@  static int memory_post_test4(unsigned long start, unsigned long size)
 	return ret;
 }
 
-static int memory_post_tests(unsigned long start, unsigned long size)
+static int memory_post_test_lines(unsigned long start, unsigned long size)
 {
 	int ret = 0;
 
-	if (!ret)
-		ret = memory_post_dataline((unsigned long long *)start);
+	ret = memory_post_dataline((unsigned long long *)start);
 	WATCHDOG_RESET();
 	if (!ret)
 		ret = memory_post_addrline((ulong *)start, (ulong *)start,
-						size);
+				size);
 	WATCHDOG_RESET();
 	if (!ret)
-		ret = memory_post_addrline((ulong *)(start + size - 8),
-					    (ulong *)start, size);
+		ret = memory_post_addrline((ulong *)(start+size-8),
+				(ulong *)start, size);
 	WATCHDOG_RESET();
-	if (!ret)
-		ret = memory_post_test1(start, size, 0x00000000);
+
+	return ret;
+}
+
+static int memory_post_test_patterns(unsigned long start, unsigned long size)
+{
+	int ret = 0;
+
+	ret = memory_post_test1(start, size, 0x00000000);
 	WATCHDOG_RESET();
 	if (!ret)
 		ret = memory_post_test1(start, size, 0xffffffff);
@@ -453,6 +459,33 @@  static int memory_post_tests(unsigned long start, unsigned long size)
 	return ret;
 }
 
+static int memory_post_test_regions(unsigned long start, unsigned long size)
+{
+	unsigned long i;
+	int ret = 0;
+
+	for (i = 0; i < (size >> 20) && (!ret); i++) {
+		if (!ret)
+			ret = memory_post_test_patterns(i << 20, 0x800);
+		if (!ret)
+			ret = memory_post_test_patterns((i << 20) + 0xff800,
+				0x800);
+	}
+
+	return ret;
+}
+
+static int memory_post_tests(unsigned long start, unsigned long size)
+{
+	int ret = 0;
+
+	ret = memory_post_test_lines(start, size);
+	if (!ret)
+		ret = memory_post_test_patterns(start, size);
+
+	return ret;
+}
+
 /*
  * !! this is only valid, if you have contiguous memory banks !!
  */
@@ -490,6 +523,21 @@  void arch_memory_failure_handle(void)
 	return;
 }
 
+int memory_regions_post_test(int flags)
+{
+	int ret = 0;
+	phys_addr_t phys_offset = 0;
+	u32 memsize, vstart;
+
+	arch_memory_test_prepare(&vstart, &memsize, &phys_offset);
+
+	ret = memory_post_test_lines(vstart, memsize);
+	if (!ret)
+		ret = memory_post_test_regions(vstart, memsize);
+
+	return ret;
+}
+
 int memory_post_test(int flags)
 {
 	int ret = 0;
@@ -502,15 +550,7 @@  int memory_post_test(int flags)
 		if (flags & POST_SLOWTEST) {
 			ret = memory_post_tests(vstart, memsize);
 		} else {			/* POST_NORMAL */
-			unsigned long i;
-			for (i = 0; i < (memsize >> 20) && !ret; i++) {
-				if (!ret)
-					ret = memory_post_tests(vstart +
-						(i << 20), 0x800);
-				if (!ret)
-					ret = memory_post_tests(vstart +
-						(i << 20) + 0xff800, 0x800);
-			}
+			ret = memory_post_test_regions(vstart, memsize);
 		}
 	} while (!ret &&
 		!arch_memory_test_advance(&vstart, &memsize, &phys_offset));
@@ -522,4 +562,4 @@  int memory_post_test(int flags)
 	return ret;
 }
 
-#endif /* CONFIG_POST & CONFIG_SYS_POST_MEMORY */
+#endif /* CONFIG_POST&(CONFIG_SYS_POST_MEMORY|CONFIG_SYS_POST_MEM_REGIONS) */
diff --git a/post/tests.c b/post/tests.c
index bfb9cb5..c25460b 100644
--- a/post/tests.c
+++ b/post/tests.c
@@ -55,6 +55,7 @@  extern int fpga_post_test (int flags);
 extern int lwmon5_watchdog_post_test(int flags);
 extern int sysmon1_post_test(int flags);
 extern int coprocessor_post_test(int flags);
+extern int memory_regions_post_test(int flags);
 
 extern int sysmon_init_f (void);
 
@@ -316,6 +317,18 @@  struct post_test post_list[] =
 	CONFIG_SYS_POST_FLASH
     },
 #endif
+#if CONFIG_POST & CONFIG_SYS_POST_MEM_REGIONS
+    {
+	"Memory regions test",
+	"mem_regions",
+	"This test checks regularly placed regions of the RAM.",
+	POST_ROM | POST_SLOWTEST | POST_PREREL,
+	&memory_regions_post_test,
+	NULL,
+	NULL,
+	CONFIG_SYS_POST_MEM_REGIONS
+    },
+#endif
 };
 
 unsigned int post_list_size = ARRAY_SIZE(post_list);