summaryrefslogtreecommitdiff
path: root/src/lib/ramtest.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/ramtest.c')
-rw-r--r--src/lib/ramtest.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/lib/ramtest.c b/src/lib/ramtest.c
new file mode 100644
index 0000000000..9f329ef51b
--- /dev/null
+++ b/src/lib/ramtest.c
@@ -0,0 +1,161 @@
+static void write_phys(unsigned long addr, unsigned long value)
+{
+#if CONFIG_HAVE_MOVNTI
+ asm volatile(
+ "movnti %1, (%0)"
+ : /* outputs */
+ : "r" (addr), "r" (value) /* inputs */
+#ifndef __GNUC__
+ : /* clobbers */
+#endif
+ );
+#else
+ volatile unsigned long *ptr;
+ ptr = (void *)addr;
+ *ptr = value;
+#endif
+}
+
+static unsigned long read_phys(unsigned long addr)
+{
+ volatile unsigned long *ptr;
+ ptr = (void *)addr;
+ return *ptr;
+}
+
+static void ram_fill(unsigned long start, unsigned long stop)
+{
+ unsigned long addr;
+ /*
+ * Fill.
+ */
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("DRAM fill: 0x%08x-0x%08x\r\n", start, stop);
+#else
+ print_debug("DRAM fill: ");
+ print_debug_hex32(start);
+ print_debug("-");
+ print_debug_hex32(stop);
+ print_debug("\r\n");
+#endif
+ for(addr = start; addr < stop ; addr += 4) {
+ /* Display address being filled */
+ if (!(addr & 0xfffff)) {
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("%08x \r", addr);
+#else
+ print_debug_hex32(addr);
+ print_debug(" \r");
+#endif
+ }
+ write_phys(addr, addr);
+ };
+ /* Display final address */
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("%08x\r\nDRAM filled\r\n", addr);
+#else
+ print_debug_hex32(addr);
+ print_debug("\r\nDRAM filled\r\n");
+#endif
+}
+
+static void ram_verify(unsigned long start, unsigned long stop)
+{
+ unsigned long addr;
+ int i = 0;
+ /*
+ * Verify.
+ */
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("DRAM verify: 0x%08x-0x%08x\r\n", start, stop);
+#else
+ print_debug("DRAM verify: ");
+ print_debug_hex32(start);
+ print_debug_char('-');
+ print_debug_hex32(stop);
+ print_debug("\r\n");
+#endif
+ for(addr = start; addr < stop ; addr += 4) {
+ unsigned long value;
+ /* Display address being tested */
+ if (!(addr & 0xfffff)) {
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("%08x \r", addr);
+#else
+ print_debug_hex32(addr);
+ print_debug(" \r");
+#endif
+ }
+ value = read_phys(addr);
+ if (value != addr) {
+ /* Display address with error */
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_err("Fail: @0x%08x Read value=0x%08x\r\n", addr, value);
+#else
+ print_err("Fail: @0x");
+ print_err_hex32(addr);
+ print_err(" Read value=0x");
+ print_err_hex32(value);
+ print_err("\r\n");
+#endif
+ i++;
+ if(i>256) {
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("Aborting.\n\r");
+#else
+ print_debug("Aborting.\n\r");
+#endif
+ break;
+ }
+ }
+ }
+ /* Display final address */
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("%08x", addr);
+#else
+ print_debug_hex32(addr);
+#endif
+
+ if (i) {
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("\r\nDRAM did _NOT_ verify!\r\n");
+#else
+ print_debug("\r\nDRAM did _NOT_ verify!\r\n");
+#endif
+ die("DRAM ERROR");
+ }
+ else {
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("\r\nDRAM range verified.\r\n");
+#else
+ print_debug("\r\nDRAM range verified.\r\n");
+#endif
+ }
+}
+
+
+void ram_check(unsigned long start, unsigned long stop)
+{
+ /*
+ * 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 CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("Testing DRAM : %08x - %08x\r\n", start, stop);
+#else
+ print_debug("Testing DRAM : ");
+ print_debug_hex32(start);
+ print_debug("-");
+ print_debug_hex32(stop);
+ print_debug("\r\n");
+#endif
+ ram_fill(start, stop);
+ ram_verify(start, stop);
+#if CONFIG_USE_PRINTK_IN_CAR
+ printk_debug("Done.\r\n");
+#else
+ print_debug("Done.\r\n");
+#endif
+}
+