1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/* SPDX-License-Identifier: GPL-2.0-only */
/* This file is part of the coreboot project. */
#include <stdint.h>
#include <lib.h>
#include <console/console.h>
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;
}
|