xref: /aosp_15_r20/external/coreboot/src/lib/primitive_memtest.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <stdint.h>
4 #include <lib.h>
5 #include <console/console.h>
6 
primitive_memtest(uintptr_t base,uintptr_t size)7 int primitive_memtest(uintptr_t base, uintptr_t size)
8 {
9 	uintptr_t *p;
10 	uintptr_t i;
11 	int bad = 0;
12 
13 	printk(BIOS_SPEW, "Performing primitive memory test.\n");
14 	printk(BIOS_SPEW, "DRAM start: 0x%08x, DRAM size: 0x%08x", base, size);
15 	for (i = base; i < base + (size - 1) - sizeof(p); i += sizeof(p)) {
16 		if (i % 0x100000 == 0) {
17 			if ((i % 0x800000) == 0)
18 				printk(BIOS_SPEW, "\n");
19 			else if (i != 0)
20 				printk(BIOS_SPEW, " ");
21 			printk(BIOS_SPEW, "0x%08x", i);
22 		}
23 		p = (uintptr_t *)i;
24 		*p = i;
25 	}
26 
27 	printk(BIOS_SPEW, "\n\nReading back DRAM content");
28 	for (i = base; i < base + (size - 1) - sizeof(p); i += sizeof(p)) {
29 		if (i % 0x100000 == 0) {
30 			if ((i % 0x800000) == 0)
31 				printk(BIOS_SPEW, "\n");
32 			else if (i != 0)
33 				printk(BIOS_SPEW, " ");
34 			printk(BIOS_SPEW, "0x%08x", i);
35 		}
36 
37 		p = (uintptr_t *)i;
38 		if (*p != i) {
39 			printk(BIOS_SPEW, "\n0x%08zx: got 0x%zx\n", i, *p);
40 			bad++;
41 		}
42 	}
43 
44 	printk(BIOS_SPEW, "\n");
45 	printk(BIOS_SPEW, "%d errors\n", bad);
46 
47 	return bad;
48 }
49