Skip to content
Snippets Groups Projects
Commit 0437655b authored by Tristan Gingold's avatar Tristan Gingold
Browse files

sw: add dram scrubber test

parent 71cf6b89
Branches
No related merge requests found
...@@ -20,6 +20,7 @@ static enum t_test ...@@ -20,6 +20,7 @@ static enum t_test
{ {
TEST_DRAM_DE, TEST_DRAM_DE,
TEST_DRAM_SE, TEST_DRAM_SE,
TEST_DRAM_SCRUB,
TEST_IRAM_DE, TEST_IRAM_DE,
TEST_IRAM_SE, TEST_IRAM_SE,
TEST_IRAM_SCRUB, TEST_IRAM_SCRUB,
...@@ -182,16 +183,20 @@ main (void) ...@@ -182,16 +183,20 @@ main (void)
switch (next_test) { switch (next_test) {
case TEST_DRAM_DE: case TEST_DRAM_DE:
/* Add double-errors */
SUPERVISOR->dram_ecc_mask = 0x03; SUPERVISOR->dram_ecc_mask = 0x03;
ecc[0] = 12; ecc[0] = 12;
ecc[2] = 23; ecc[2] = 23;
/* Add single-errors */
SUPERVISOR->dram_ecc_mask = 0x01; SUPERVISOR->dram_ecc_mask = 0x01;
ecc[1] = 56; ecc[1] = 56;
ecc[3] = 78; ecc[3] = 78;
/* Do not add errors anymore! */
SUPERVISOR->dram_ecc_mask = 0x00; SUPERVISOR->dram_ecc_mask = 0x00;
next_test = TEST_DRAM_SE; next_test = TEST_DRAM_SE;
/* Order is important! */ /* Order is important! */
asm volatile (""); asm volatile ("");
/* Trigger a single error */
v = ecc[0]; v = ecc[0];
unreachable(); unreachable();
break; break;
...@@ -199,6 +204,7 @@ main (void) ...@@ -199,6 +204,7 @@ main (void)
case TEST_DRAM_SE: case TEST_DRAM_SE:
if (SUPERVISOR->dram_ecc_se != 0) if (SUPERVISOR->dram_ecc_se != 0)
unreachable(); unreachable();
/* Trigger a single error */
v = ecc[1]; v = ecc[1];
if (SUPERVISOR->dram_ecc_se != 1) if (SUPERVISOR->dram_ecc_se != 1)
unreachable(); unreachable();
...@@ -206,12 +212,38 @@ main (void) ...@@ -206,12 +212,38 @@ main (void)
/* Fallthrough */ /* Fallthrough */
case TEST_IRAM_DE: case TEST_IRAM_DE:
next_test = TEST_IRAM_SE; next_test = TEST_DRAM_SCRUB;
/* Generate a fatal error */ /* Generate a fatal error */
v = *(volatile unsigned *)0xfffc; v = *(volatile unsigned *)0xfffc;
unreachable(); unreachable();
break; break;
case TEST_DRAM_SCRUB:
if (SUPERVISOR->dram_scrub_se != 0
|| SUPERVISOR->dram_scrub_de != 0)
unreachable();
uart_puts("Start DRAM scrubber");
SUPERVISOR->scrub_cfg = HYDRA_SUPERVISOR_REGS_SCRUB_CFG_DRAM_EN;
next_test = TEST_IRAM_SE;
do {
v = SUPERVISOR->dram_scrub_de;
SUPERVISOR->wd_key = WD_KEY;
} while (v == 0);
/* Because the scrubber is always running, the counter is always
incrementing. So the original value is kept. */
uart_putc('\n');
if (SUPERVISOR->dram_scrub_se != 1 || v > 2) {
uart_puts ("se:");
uart_put_hex8 (SUPERVISOR->dram_scrub_se);
uart_puts (", de:");
uart_put_hex8 (v);
unreachable();
}
/* Remove the errors */
ecc[0] = 0;
ecc[2] = 0;
/* Fallthrough */
case TEST_IRAM_SE: case TEST_IRAM_SE:
/* Generate a single error */ /* Generate a single error */
v = *(volatile unsigned *)0xfff8; v = *(volatile unsigned *)0xfff8;
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment