Skip to content

Commit

Permalink
POST: add new memory regions test
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Holger Brunck <[email protected]>
Ackey-by: Mike Frysinger <[email protected]>
  • Loading branch information
Valentin Longchamp authored and wdenx committed Oct 5, 2011
1 parent ca51d05 commit 8d3fcb5
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 19 deletions.
1 change: 1 addition & 0 deletions include/post.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

Expand Down
78 changes: 59 additions & 19 deletions post/drivers/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand All @@ -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 !!
*/
Expand Down Expand Up @@ -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;
Expand All @@ -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));
Expand All @@ -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) */
13 changes: 13 additions & 0 deletions post/tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ extern int sysmon1_post_test(int flags);
extern int coprocessor_post_test(int flags);
extern int led_post_test(int flags);
extern int button_post_test(int flags);
extern int memory_regions_post_test(int flags);

extern int sysmon_init_f (void);

Expand Down Expand Up @@ -318,6 +319,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);

0 comments on commit 8d3fcb5

Please sign in to comment.