/* SPDX-License-Identifier: GPL-2.0-only */ #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; }