blob: 4f00030b893fbc018d6b2dd67da912ae1ca32181 [file] [log] [blame]
Eric Biederman8ca8d762003-04-22 19:02:15 +00001static void write_phys(unsigned long addr, unsigned long value)
2{
Stefan Reinauer08670622009-06-30 15:17:49 +00003#if CONFIG_HAVE_MOVNTI
Eric Biederman8d9c1232003-06-17 08:42:17 +00004 asm volatile(
5 "movnti %1, (%0)"
6 : /* outputs */
7 : "r" (addr), "r" (value) /* inputs */
Stefan Reinauer76712932004-05-27 11:13:24 +00008#ifndef __GNUC__
Eric Biederman8d9c1232003-06-17 08:42:17 +00009 : /* clobbers */
Stefan Reinauer76712932004-05-27 11:13:24 +000010#endif
Eric Biederman8d9c1232003-06-17 08:42:17 +000011 );
12#else
Eric Biederman52685572003-05-19 19:16:21 +000013 volatile unsigned long *ptr;
Eric Biederman8ca8d762003-04-22 19:02:15 +000014 ptr = (void *)addr;
15 *ptr = value;
Eric Biederman8d9c1232003-06-17 08:42:17 +000016#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000017}
18
19static unsigned long read_phys(unsigned long addr)
20{
Eric Biederman52685572003-05-19 19:16:21 +000021 volatile unsigned long *ptr;
Eric Biederman8ca8d762003-04-22 19:02:15 +000022 ptr = (void *)addr;
23 return *ptr;
24}
25
Eric Biederman8d9c1232003-06-17 08:42:17 +000026static void ram_fill(unsigned long start, unsigned long stop)
Eric Biederman8ca8d762003-04-22 19:02:15 +000027{
28 unsigned long addr;
29 /*
30 * Fill.
31 */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000032#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +000033 printk_debug("DRAM fill: 0x%08lx-0x%08lx\r\n", start, stop);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000034#else
Eric Biederman8ca8d762003-04-22 19:02:15 +000035 print_debug("DRAM fill: ");
36 print_debug_hex32(start);
37 print_debug("-");
38 print_debug_hex32(stop);
39 print_debug("\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000040#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000041 for(addr = start; addr < stop ; addr += 4) {
42 /* Display address being filled */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000043 if (!(addr & 0xfffff)) {
44#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +000045 printk_debug("%08lx \r", addr);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000046#else
Eric Biederman8ca8d762003-04-22 19:02:15 +000047 print_debug_hex32(addr);
Eric Biederman69afe282004-11-11 06:53:24 +000048 print_debug(" \r");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000049#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000050 }
51 write_phys(addr, addr);
52 };
53 /* Display final address */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000054#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +000055 printk_debug("%08lx\r\nDRAM filled\r\n", addr);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000056#else
Eric Biederman8ca8d762003-04-22 19:02:15 +000057 print_debug_hex32(addr);
58 print_debug("\r\nDRAM filled\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000059#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000060}
61
Eric Biederman8d9c1232003-06-17 08:42:17 +000062static void ram_verify(unsigned long start, unsigned long stop)
Eric Biederman8ca8d762003-04-22 19:02:15 +000063{
64 unsigned long addr;
Eric Biederman69afe282004-11-11 06:53:24 +000065 int i = 0;
Eric Biederman8ca8d762003-04-22 19:02:15 +000066 /*
67 * Verify.
68 */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000069#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +000070 printk_debug("DRAM verify: 0x%08lx-0x%08lx\r\n", start, stop);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000071#else
Eric Biederman8ca8d762003-04-22 19:02:15 +000072 print_debug("DRAM verify: ");
73 print_debug_hex32(start);
74 print_debug_char('-');
75 print_debug_hex32(stop);
76 print_debug("\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000077#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000078 for(addr = start; addr < stop ; addr += 4) {
79 unsigned long value;
80 /* Display address being tested */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000081 if (!(addr & 0xfffff)) {
82#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +000083 printk_debug("%08lx \r", addr);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000084#else
Eric Biederman8ca8d762003-04-22 19:02:15 +000085 print_debug_hex32(addr);
Eric Biederman69afe282004-11-11 06:53:24 +000086 print_debug(" \r");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000087#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +000088 }
89 value = read_phys(addr);
90 if (value != addr) {
91 /* Display address with error */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000092#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +000093 printk_err("Fail: @0x%08lx Read value=0x%08lx\r\n", addr, value);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +000094#else
Richard Smithffb7d8a2006-04-01 04:10:44 +000095 print_err("Fail: @0x");
Eric Biederman8ca8d762003-04-22 19:02:15 +000096 print_err_hex32(addr);
Richard Smithffb7d8a2006-04-01 04:10:44 +000097 print_err(" Read value=0x");
Eric Biederman8ca8d762003-04-22 19:02:15 +000098 print_err_hex32(value);
99 print_err("\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000100#endif
Eric Biederman69afe282004-11-11 06:53:24 +0000101 i++;
Richard Smithffb7d8a2006-04-01 04:10:44 +0000102 if(i>256) {
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000103#if CONFIG_USE_PRINTK_IN_CAR
104 printk_debug("Aborting.\n\r");
105#else
Richard Smithffb7d8a2006-04-01 04:10:44 +0000106 print_debug("Aborting.\n\r");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000107#endif
Richard Smithffb7d8a2006-04-01 04:10:44 +0000108 break;
109 }
Eric Biederman8ca8d762003-04-22 19:02:15 +0000110 }
111 }
112 /* Display final address */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000113#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +0000114 printk_debug("%08lx", addr);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000115#else
Eric Biederman8ca8d762003-04-22 19:02:15 +0000116 print_debug_hex32(addr);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000117#endif
118
Richard Smithffb7d8a2006-04-01 04:10:44 +0000119 if (i) {
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000120#if CONFIG_USE_PRINTK_IN_CAR
121 printk_debug("\r\nDRAM did _NOT_ verify!\r\n");
122#else
Richard Smithffb7d8a2006-04-01 04:10:44 +0000123 print_debug("\r\nDRAM did _NOT_ verify!\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000124#endif
125 die("DRAM ERROR");
Richard Smithffb7d8a2006-04-01 04:10:44 +0000126 }
127 else {
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000128#if CONFIG_USE_PRINTK_IN_CAR
129 printk_debug("\r\nDRAM range verified.\r\n");
130#else
Richard Smithffb7d8a2006-04-01 04:10:44 +0000131 print_debug("\r\nDRAM range verified.\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000132#endif
Richard Smithffb7d8a2006-04-01 04:10:44 +0000133 }
Eric Biederman8ca8d762003-04-22 19:02:15 +0000134}
135
136
Eric Biederman8d9c1232003-06-17 08:42:17 +0000137void ram_check(unsigned long start, unsigned long stop)
Eric Biederman8ca8d762003-04-22 19:02:15 +0000138{
Eric Biederman8ca8d762003-04-22 19:02:15 +0000139 /*
140 * This is much more of a "Is my DRAM properly configured?"
141 * test than a "Is my DRAM faulty?" test. Not all bits
142 * are tested. -Tyson
143 */
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000144#if CONFIG_USE_PRINTK_IN_CAR
Stefan Reinauerde3206a2010-02-22 06:09:43 +0000145 printk_debug("Testing DRAM : %08lx - %08lx\r\n", start, stop);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000146#else
Ronald G. Minnichbfdc5622004-03-22 04:24:29 +0000147 print_debug("Testing DRAM : ");
148 print_debug_hex32(start);
149 print_debug("-");
150 print_debug_hex32(stop);
151 print_debug("\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000152#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +0000153 ram_fill(start, stop);
154 ram_verify(start, stop);
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000155#if CONFIG_USE_PRINTK_IN_CAR
156 printk_debug("Done.\r\n");
157#else
Ronald G. Minnichbfdc5622004-03-22 04:24:29 +0000158 print_debug("Done.\r\n");
Stefan Reinauer48b85fc2008-08-01 12:12:37 +0000159#endif
Eric Biederman8ca8d762003-04-22 19:02:15 +0000160}
161