lib: add ram_check_nodie
authorSven Schnelle <svens@stackframe.org>
Fri, 2 Dec 2011 15:23:06 +0000 (16:23 +0100)
committerSven Schnelle <svens@stackframe.org>
Thu, 12 Jan 2012 12:26:29 +0000 (13:26 +0100)
The current implementation calls die() if memory checking fails.
This isn't always what we want: one might want to print error registers,
or do some other error handling. Introduce ram_check_nodie() for that
reason. It returns 0 if ram check succeeded, otherwise 1.

Change-Id: Ib9a9279120755cf63b5b3ba5e0646492c3c29ac2
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Reviewed-on: http://review.coreboot.org/532
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
src/include/lib.h
src/lib/ramtest.c

index ba9684a0c13ec31ee5a5d95f11fa03f649815667..bbe735f89a035d1eac14368ca1f3800d6f8a1c81 100644 (file)
@@ -37,6 +37,7 @@ void move_gdt(void);
 
 /* Defined in src/lib/ramtest.c */
 void ram_check(unsigned long start, unsigned long stop);
+int ram_check_nodie(unsigned long start, unsigned long stop);
 void quick_ram_check(void);
 
 /* Defined in romstage.c */
index b35c36d5621943d885b192ce2c4771edcb8dfd48..e118062c2617d2e2a8f6b63bd17e561a3aee599d 100644 (file)
@@ -83,7 +83,7 @@ static void ram_fill(unsigned long start, unsigned long stop)
 #endif
 }
 
-static void ram_verify(unsigned long start, unsigned long stop)
+static int ram_verify_nodie(unsigned long start, unsigned long stop)
 {
        unsigned long addr;
        int i = 0;
@@ -146,15 +146,17 @@ static void ram_verify(unsigned long start, unsigned long stop)
 #else
                print_debug("\nDRAM did _NOT_ verify!\n");
 #endif
-               die("DRAM ERROR");
+               return 1;
        }
        else {
 #if !defined(__ROMCC__)
                printk(BIOS_DEBUG, "\nDRAM range verified.\n");
 #else
                print_debug("\nDRAM range verified.\n");
+               return 0;
 #endif
        }
+       return 0;
 }
 
 
@@ -177,12 +179,44 @@ void ram_check(unsigned long start, unsigned long stop)
        ram_fill(start, stop);
        /* Make sure we don't read before we wrote */
        phys_memory_barrier();
-       ram_verify(start, stop);
+       if (ram_verify_nodie(start, stop))
+               die("DRAM ERROR");
+#if !defined(__ROMCC__)
+       printk(BIOS_DEBUG, "Done.\n");
+#else
+       print_debug("Done.\n");
+#endif
+}
+
+
+int ram_check_nodie(unsigned long start, unsigned long stop)
+{
+       int ret;
+       /*
+        * This is much more of a "Is my DRAM properly configured?"
+        * test than a "Is my DRAM faulty?" test.  Not all bits
+        * are tested.   -Tyson
+        */
+#if !defined(__ROMCC__)
+       printk(BIOS_DEBUG, "Testing DRAM : %08lx - %08lx\n", start, stop);
+#else
+       print_debug("Testing DRAM : ");
+       print_debug_hex32(start);
+       print_debug("-");
+       print_debug_hex32(stop);
+       print_debug("\n");
+#endif
+       ram_fill(start, stop);
+       /* Make sure we don't read before we wrote */
+       phys_memory_barrier();
+       ret = ram_verify_nodie(start, stop);
+
 #if !defined(__ROMCC__)
        printk(BIOS_DEBUG, "Done.\n");
 #else
        print_debug("Done.\n");
 #endif
+       return ret;
 }
 
 void quick_ram_check(void)