1 #include <lib.h> /* Prototypes */
3 static void write_phys(unsigned long addr, u32 value)
5 // Assembler in lib/ is very ugly. But we properly guarded
6 // it so let's obey this one for now
11 : "r" (addr), "r" (value) /* inputs */
12 #ifndef __GNUC__ /* GCC does not like empty clobbers? */
17 volatile unsigned long *ptr;
23 static u32 read_phys(unsigned long addr)
25 volatile unsigned long *ptr;
30 static void phys_memory_barrier(void)
37 #ifdef __GNUC__ /* ROMCC does not like memory clobbers */
42 #ifdef __GNUC__ /* ROMCC does not like empty asm statements */
43 asm volatile ("" ::: "memory");
48 static void ram_fill(unsigned long start, unsigned long stop)
54 #if CONFIG_USE_PRINTK_IN_CAR
55 printk(BIOS_DEBUG, "DRAM fill: 0x%08lx-0x%08lx\n", start, stop);
57 print_debug("DRAM fill: ");
58 print_debug_hex32(start);
60 print_debug_hex32(stop);
63 for(addr = start; addr < stop ; addr += 4) {
64 /* Display address being filled */
65 if (!(addr & 0xfffff)) {
66 #if CONFIG_USE_PRINTK_IN_CAR
67 printk(BIOS_DEBUG, "%08lx \r", addr);
69 print_debug_hex32(addr);
73 write_phys(addr, (u32)addr);
75 /* Display final address */
76 #if CONFIG_USE_PRINTK_IN_CAR
77 printk(BIOS_DEBUG, "%08lx\nDRAM filled\n", addr);
79 print_debug_hex32(addr);
80 print_debug("\nDRAM filled\n");
84 static void ram_verify(unsigned long start, unsigned long stop)
91 #if CONFIG_USE_PRINTK_IN_CAR
92 printk(BIOS_DEBUG, "DRAM verify: 0x%08lx-0x%08lx\n", start, stop);
94 print_debug("DRAM verify: ");
95 print_debug_hex32(start);
96 print_debug_char('-');
97 print_debug_hex32(stop);
100 for(addr = start; addr < stop ; addr += 4) {
102 /* Display address being tested */
103 if (!(addr & 0xfffff)) {
104 #if CONFIG_USE_PRINTK_IN_CAR
105 printk(BIOS_DEBUG, "%08lx \r", addr);
107 print_debug_hex32(addr);
111 value = read_phys(addr);
113 /* Display address with error */
114 #if CONFIG_USE_PRINTK_IN_CAR
115 printk(BIOS_ERR, "Fail: @0x%08lx Read value=0x%08lx\n", addr, value);
117 print_err("Fail: @0x");
118 print_err_hex32(addr);
119 print_err(" Read value=0x");
120 print_err_hex32(value);
125 #if CONFIG_USE_PRINTK_IN_CAR
126 printk(BIOS_DEBUG, "Aborting.\n");
128 print_debug("Aborting.\n");
134 /* Display final address */
135 #if CONFIG_USE_PRINTK_IN_CAR
136 printk(BIOS_DEBUG, "%08lx", addr);
138 print_debug_hex32(addr);
142 #if CONFIG_USE_PRINTK_IN_CAR
143 printk(BIOS_DEBUG, "\nDRAM did _NOT_ verify!\n");
145 print_debug("\nDRAM did _NOT_ verify!\n");
150 #if CONFIG_USE_PRINTK_IN_CAR
151 printk(BIOS_DEBUG, "\nDRAM range verified.\n");
153 print_debug("\nDRAM range verified.\n");
159 void ram_check(unsigned long start, unsigned long stop)
162 * This is much more of a "Is my DRAM properly configured?"
163 * test than a "Is my DRAM faulty?" test. Not all bits
166 #if CONFIG_USE_PRINTK_IN_CAR
167 printk(BIOS_DEBUG, "Testing DRAM : %08lx - %08lx\n", start, stop);
169 print_debug("Testing DRAM : ");
170 print_debug_hex32(start);
172 print_debug_hex32(stop);
175 ram_fill(start, stop);
176 /* Make sure we don't read before we wrote */
177 phys_memory_barrier();
178 ram_verify(start, stop);
179 #if CONFIG_USE_PRINTK_IN_CAR
180 printk(BIOS_DEBUG, "Done.\n");
182 print_debug("Done.\n");
186 void quick_ram_check(void)
190 backup = read_phys(CONFIG_RAMBASE);
191 write_phys(CONFIG_RAMBASE, 0x55555555);
192 phys_memory_barrier();
193 if (read_phys(CONFIG_RAMBASE) != 0x55555555)
195 write_phys(CONFIG_RAMBASE, 0xaaaaaaaa);
196 phys_memory_barrier();
197 if (read_phys(CONFIG_RAMBASE) != 0xaaaaaaaa)
199 write_phys(CONFIG_RAMBASE, 0x00000000);
200 phys_memory_barrier();
201 if (read_phys(CONFIG_RAMBASE) != 0x00000000)
203 write_phys(CONFIG_RAMBASE, 0xffffffff);
204 phys_memory_barrier();
205 if (read_phys(CONFIG_RAMBASE) != 0xffffffff)
208 write_phys(CONFIG_RAMBASE, backup);
211 die("RAM INIT FAILURE!\n");
213 phys_memory_barrier();