[coreboot] r633 - coreboot-v3/lib

svn at coreboot.org svn at coreboot.org
Thu Mar 6 17:35:44 CET 2008


Author: rminnich
Date: 2008-03-06 17:35:44 +0100 (Thu, 06 Mar 2008)
New Revision: 633

Added:
   coreboot-v3/lib/ramtest.c
Log:
Add ramtest for development.
Signed-off-by: Ronald G. Minnich <rminnich at gmail.com>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>



Added: coreboot-v3/lib/ramtest.c
===================================================================
--- coreboot-v3/lib/ramtest.c	                        (rev 0)
+++ coreboot-v3/lib/ramtest.c	2008-03-06 16:35:44 UTC (rev 633)
@@ -0,0 +1,108 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2001 Tyson Sawyer, irobot
+ * Copyright (C) 2008 Ronald G. Minnich
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#include <types.h>
+#include <lib.h>
+#include <console.h>
+
+
+static void write_phys(unsigned long addr, unsigned long value)
+{
+	volatile unsigned long *ptr;
+	ptr = (void *)addr;
+	*ptr = value;
+}
+
+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.
+	 */
+	printk(BIOS_DEBUG, "DRAM fill: %lx-%lx\n", start, stop);
+	for(addr = start; addr < stop ; addr += 4) {
+		/* Display address being filled */
+		if (!(addr & 0xffff)) {
+			printk(BIOS_DEBUG, "%lx\r", addr);
+		}
+		write_phys(addr, addr);
+	};
+	/* Display final address */
+	printk(BIOS_DEBUG, "%lx\nDRAM filled\n", addr);
+}
+
+static void ram_verify(unsigned long start, unsigned long stop)
+{
+	unsigned long addr;
+	int i = 0;
+	/* 
+	 * Verify.
+	 */
+	printk(BIOS_DEBUG, "DRAM verify: %lx-%lx\n", start, stop);
+	for(addr = start; addr < stop ; addr += 4) {
+		unsigned long value;
+		/* Display address being tested */
+		if (!(addr & 0xffff)) {
+			printk(BIOS_DEBUG, "%lx\r", addr);
+		}
+		value = read_phys(addr);
+		if (value != addr) {
+			/* Display address with error */
+			printk(BIOS_ERR, "Fail @%lx Read value=%lx\n", 
+				addr, value);
+			i++;
+			if(i>256) {
+				printk(BIOS_ERR, "Aborting.\n");
+				break;
+			}
+		}
+	}
+	/* Display final address */
+	printk(BIOS_DEBUG, "%lx\r", addr);
+	if (i) {
+		printk(BIOS_DEBUG, "\nDRAM did _NOT_ verify!\n");
+	}
+	else {
+		printk(BIOS_DEBUG, "\nDRAM range verified.\n");
+	}
+}
+
+
+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
+	 */
+	printk(BIOS_DEBUG, "Testing DRAM: %lx-%lx\n", start, stop);
+	ram_fill(start, stop);
+	ram_verify(start, stop);
+	printk(BIOS_DEBUG, "Done.\n");
+}
+





More information about the coreboot mailing list