/* * This file is part of the coreboot project. * * Copyright 2014 Google Inc. * * 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; version 2 of the License. * * 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. */ #include #include #include int primitive_memtest(uintptr_t base, uintptr_t size) { uintptr_t *p; uintptr_t i; int bad = 0; printk(BIOS_SPEW, "Performing primitive memory test.\n"); printk(BIOS_SPEW, "DRAM start: 0x%08x, DRAM size: 0x%08x", base, size); for (i = base; i < base + (size - 1) - sizeof(p); i += sizeof(p)) { if (i % 0x100000 == 0) { if ((i % 0x800000) == 0) printk(BIOS_SPEW, "\n"); else if (i != 0) printk(BIOS_SPEW, " "); printk(BIOS_SPEW, "0x%08x", i); } p = (uintptr_t *)i; *p = i; } printk(BIOS_SPEW, "\n\nReading back DRAM content"); for (i = base; i < base + (size - 1) - sizeof(p); i += sizeof(p)) { if (i % 0x100000 == 0) { if ((i % 0x800000) == 0) printk(BIOS_SPEW, "\n"); else if (i != 0) printk(BIOS_SPEW, " "); printk(BIOS_SPEW, "0x%08x", i); } p = (uintptr_t *)i; if (*p != i) { printk(BIOS_SPEW, "\n0x%08zx: got 0x%zx\n", i, *p); bad++; } } printk(BIOS_SPEW, "\n"); printk(BIOS_SPEW, "%d errors\n", bad); return bad; }