bios: print number of memory errors
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Sun, 24 Feb 2013 15:51:03 +0000 (16:51 +0100)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Sun, 24 Feb 2013 15:51:03 +0000 (16:51 +0100)
software/bios/sdram.c
software/bios/sdram.h

index b80637e52965de3b9d66727fc041db0031f3d87b..9b4d53213df6416db66bfb78e9b0dc3aa86ddd75 100644 (file)
@@ -174,6 +174,7 @@ int memtest_silent(void)
        volatile unsigned int *array = (unsigned int *)SDRAM_BASE;
        int i;
        unsigned int prv;
+       unsigned int error_cnt;
        
        prv = 0;
        for(i=0;i<TEST_SIZE/4;i++) {
@@ -182,20 +183,27 @@ int memtest_silent(void)
        }
        
        prv = 0;
+       error_cnt = 0;
        for(i=0;i<TEST_SIZE/4;i++) {
                prv = 1664525*prv + 1013904223;
                if(array[i] != prv)
-                       return 0;
+                       error_cnt++;
        }
-       return 1;
+       return error_cnt;
 }
 
-void memtest(void)
+int memtest(void)
 {
-       if(memtest_silent())
-               printf("OK\n");
-       else
-               printf("Failed\n");
+       unsigned int e;
+
+       e = memtest_silent();
+       if(e != 0) {
+               printf("Memtest failed: %d/%d words incorrect\n", e, TEST_SIZE/4);
+               return 0;
+       } else {
+               printf("Memtest OK\n");
+               return 1;
+       }
 }
 
 int ddrinit(void)
@@ -204,7 +212,7 @@ int ddrinit(void)
        
        init_sequence();
        CSR_DFII_CONTROL = DFII_CONTROL_SEL|DFII_CONTROL_CKE;
-       if(!memtest_silent())
+       if(!memtest())
                return 0;
        
        return 1;
index d48fcf934f1d8d9af116bde978200ee909066e49..807e2764d30edf9850dd07fe20c41f813cb476aa 100644 (file)
@@ -7,7 +7,7 @@ void ddrrow(char *_row);
 void ddrrd(char *startaddr);
 void ddrwr(char *startaddr);
 int memtest_silent(void);
-void memtest(void);
+int memtest(void);
 int ddrinit(void);
 
 void asmiprobe(void);