- To reduce confuse rename the parts of linuxbios bios that run from
[coreboot.git] / src / ram / ramtest.c
1 static void write_phys(unsigned long addr, unsigned long value)
2 {
3 #if HAVE_MOVNTI
4         asm volatile(
5                 "movnti %1, (%0)"
6                 : /* outputs */
7                 : "r" (addr), "r" (value) /* inputs */
8 #ifndef __GNUC__
9                 : /* clobbers */
10 #endif
11                 );
12 #else
13         volatile unsigned long *ptr;
14         ptr = (void *)addr;
15         *ptr = value;
16 #endif
17 }
18
19 static unsigned long read_phys(unsigned long addr)
20 {
21         volatile unsigned long *ptr;
22         ptr = (void *)addr;
23         return *ptr;
24 }
25
26 static void ram_fill(unsigned long start, unsigned long stop)
27 {
28         unsigned long addr;
29         /* 
30          * Fill.
31          */
32         print_debug("DRAM fill: ");
33         print_debug_hex32(start);
34         print_debug("-");
35         print_debug_hex32(stop);
36         print_debug("\r\n");
37         for(addr = start; addr < stop ; addr += 4) {
38                 /* Display address being filled */
39                 if (!(addr & 0xffff)) {
40                         print_debug_hex32(addr);
41                         print_debug("\r");
42                 }
43                 write_phys(addr, addr);
44         };
45         /* Display final address */
46         print_debug_hex32(addr);
47         print_debug("\r\nDRAM filled\r\n");
48 }
49
50 static void ram_verify(unsigned long start, unsigned long stop)
51 {
52         unsigned long addr;
53         /* 
54          * Verify.
55          */
56         print_debug("DRAM verify: ");
57         print_debug_hex32(start);
58         print_debug_char('-');
59         print_debug_hex32(stop);
60         print_debug("\r\n");
61         for(addr = start; addr < stop ; addr += 4) {
62                 unsigned long value;
63                 /* Display address being tested */
64                 if (!(addr & 0xffff)) {
65                         print_debug_hex32(addr);
66                         print_debug("\r");
67                 }
68                 value = read_phys(addr);
69                 if (value != addr) {
70                         /* Display address with error */
71                         print_err_hex32(addr);
72                         print_err_char(':');
73                         print_err_hex32(value);
74                         print_err("\r\n");
75                 }
76         }
77         /* Display final address */
78         print_debug_hex32(addr);
79         print_debug("\r\nDRAM verified\r\n");
80 }
81
82
83 void ram_check(unsigned long start, unsigned long stop)
84 {
85         int result;
86         /*
87          * This is much more of a "Is my DRAM properly configured?"
88          * test than a "Is my DRAM faulty?" test.  Not all bits
89          * are tested.   -Tyson
90          */
91         print_debug("Testing DRAM : ");
92         print_debug_hex32(start);
93         print_debug("-");       
94         print_debug_hex32(stop);
95         print_debug("\r\n");
96         ram_fill(start, stop);
97         ram_verify(start, stop);
98         print_debug("Done.\r\n");
99 }
100