aboutsummaryrefslogtreecommitdiff
path: root/post/drivers
diff options
context:
space:
mode:
authorValentin Longchamp2011-09-12 04:18:40 +0000
committerWolfgang Denk2011-10-05 22:03:11 +0200
commit8d3fcb5e60b6c8e1d530dbc2e2e33ec6a44670da (patch)
tree4e87935673e8d70d40f17df1a8ee0b0335ca6c5a /post/drivers
parentca51d05758c430ec3aa0e90982a0419474ab5574 (diff)
POST: add new memory regions test
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>
Diffstat (limited to 'post/drivers')
-rw-r--r--post/drivers/memory.c78
1 files changed, 59 insertions, 19 deletions
diff --git a/post/drivers/memory.c b/post/drivers/memory.c
index 69c5dbec453..69973c0f442 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) */