blob: 71a06573b88f689cc86a0066be6a14cbfaff725f [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#include <common.h>
2#include <malloc.h>
3#include <asm/io.h>
4
5#include "tim.h"
6#include "asr_common.h"
7#include "obm2osl.h"
8#include "asr_flag.h"
9#include "asr_flash.h"
10
11
12#ifndef CONFIG_BOOT_LOG_ADDR
13#define CONFIG_BOOT_LOG_ADDR (0x1f00000)
14#endif
15
16#define CONFIG_DDR_ADDR_END (0xFEDCBA98)
17#define CONFIG_SEC_DDR_ADDR_BEGIN (0xFEDCBA99)
18#define CONFIG_SEC_DDR_ADDR_END (0xFEDCBA9A)
19
20#define DDR_TEST_PASS (0)
21#define DDR_TEST_FAIL (1)
22
23#define MALLOC_BUFF_RESERVE_SZ (0x400000)
24
25#define NR_TEST_PATTERN 16
26
27#ifndef data_write32
28#define data_write32(ptrReg, value) \
29 (*((u32 *)(ptrReg)) = value)
30#endif
31
32#ifndef data_read32
33#define data_read32(ptrReg) \
34 (*((u32 *)(ptrReg)))
35#endif
36
37struct mtest_buf_desc {
38 u32 ddr_mtest_begin;
39 u32 ddr_mtest_end;
40};
41
42static struct asr_firmware_flag *p_asr_flag;
43
44#ifdef CONFIG_TEE_OS
45static struct mtest_buf_desc ddr_test_ranges[] = {
46 [0] = {
47 .ddr_mtest_begin = 0x0,
48 .ddr_mtest_end = CONFIG_SYS_TEXT_BASE - 0x8000,
49 },
50 [1] = {
51 .ddr_mtest_begin = CONFIG_SYS_LONG_RELOC_END + 0x8000,
52 .ddr_mtest_end = CONFIG_BOOT_LOG_ADDR,
53 },
54 [2] = {
55 .ddr_mtest_begin = CONFIG_BOOT_LOG_ADDR + 0x10000, /* reserve 64KB */
56 .ddr_mtest_end = CONFIG_SEC_DDR_ADDR_BEGIN,
57 },
58 [3] = {
59 .ddr_mtest_begin = CONFIG_SEC_DDR_ADDR_END,
60 .ddr_mtest_end = CONFIG_DDR_ADDR_END,
61 },
62};
63#else
64static struct mtest_buf_desc ddr_test_ranges[] = {
65 [0] = {
66 .ddr_mtest_begin = 0x0,
67 .ddr_mtest_end = CONFIG_SYS_TEXT_BASE - 0x8000,
68 },
69 [1] = {
70 .ddr_mtest_begin = CONFIG_SYS_LONG_RELOC_END + 0x8000,
71 .ddr_mtest_end = CONFIG_BOOT_LOG_ADDR,
72 },
73 [2] = {
74 .ddr_mtest_begin = CONFIG_BOOT_LOG_ADDR + 0x10000, /* reserve 64KB */
75 .ddr_mtest_end = CONFIG_DDR_ADDR_END,
76 },
77};
78#endif
79
80
81#ifdef CONFIG_USE_DDR_ALL_PATTERN
82static int giBitFails[32], giByteLaneFails[4], giPatternFails[22], giPatternRuns[22],giPatternNumOfFails[22];
83#define ANALOG 1
84#define CONSTANT 2
85#define COMPLEMENT 3
86#define DECREMENT 4
87#define INCREMENT 5
88#define INCREMENTB 6
89#define MILLER_EFFECT 7
90#define ZERO_ROR_INVERT 8
91#define ONE_ROL_INVERT 9
92#define ZERO_ROR 10
93#define ONE_ROL 11
94#define WALKING_ONES 12
95#define WALKING_ZEROS 13
96#define SSTAILGATE_0101XXXX 14
97#define SSTAILGATE_01010000 15
98#define SSTAILGATE_01011111 16
99#define SSTAILGATE_01011010 17
100#define MSTAILGATE 18
101#define FREQ_SWEEP 19
102#define VERT_INCREMENT 20
103#define HORZ_INCREMENT 21
104
105#define read_data_u32(reg) (*((volatile u32 *)(reg)))
106
107#define WORD_SIZE (4)
108
109static u32 rol32_mcu(u32 val)
110{
111 u32 msb = val >> 31;
112
113 val = val << 1;
114
115 msb &= 0x00000001;
116 val |= msb;
117
118 return val;
119}
120
121static u32 ror32_mcu(u32 val)
122{
123 u32 lsb = val << 31;
124
125 val = val >> 1;
126
127 val &= 0x7FFFFFFF;
128 val |= lsb;
129
130 return val;
131}
132
133static int test_write_ANALOG(u32* start, int count)
134{
135 u32* p = (u32*)start;
136 while (p < (start + count))
137 {
138#define DOIT1(i) p[i]=0xffffffff;
139#define DOIT2(i) p[i]=0x0;
140
141 DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
142 DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
143 DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
144 DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
145 p += 32;
146
147 DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
148 DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
149 DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
150 DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
151 p += 32;
152 }
153 return 0;
154}
155#undef DOIT1
156#undef DOIT2
157
158static int test_write_CONSTANT(u32* start, int count)
159{
160 u32* p = (u32*)start;
161 while (p < (start + count))
162 {
163#define DOIT1(i) p[i]=0xffffffff;
164
165 DOIT1(0) DOIT1(1) DOIT1(2) DOIT1(3) DOIT1(4) DOIT1(5) DOIT1(6) DOIT1(7)
166 DOIT1(8) DOIT1(9) DOIT1(10) DOIT1(11) DOIT1(12) DOIT1(13) DOIT1(14) DOIT1(15)
167 DOIT1(16) DOIT1(17) DOIT1(18) DOIT1(19) DOIT1(20) DOIT1(21) DOIT1(22) DOIT1(23)
168 DOIT1(24) DOIT1(25) DOIT1(26) DOIT1(27) DOIT1(28) DOIT1(29) DOIT1(30) DOIT1(31)
169 p += 32;
170 DOIT1(0) DOIT1(1) DOIT1(2) DOIT1(3) DOIT1(4) DOIT1(5) DOIT1(6) DOIT1(7)
171 DOIT1(8) DOIT1(9) DOIT1(10) DOIT1(11) DOIT1(12) DOIT1(13) DOIT1(14) DOIT1(15)
172 DOIT1(16) DOIT1(17) DOIT1(18) DOIT1(19) DOIT1(20) DOIT1(21) DOIT1(22) DOIT1(23)
173 DOIT1(24) DOIT1(25) DOIT1(26) DOIT1(27) DOIT1(28) DOIT1(29) DOIT1(30) DOIT1(31)
174 p += 32;
175 }
176 return 0;
177}
178#undef DOIT1
179
180static int test_write_COMPLETEMENT(u32* start, int count, u32 uiStartVal)
181{
182 u32* p = (u32*)start;
183 while (p < (start + count))
184 {
185#define DOIT1(i) p[i]=uiStartVal;
186#define DOIT2(i) p[i]=(~uiStartVal);
187
188 DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
189 DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
190 DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
191 DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
192 p += 32;
193
194 DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
195 DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
196 DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
197 DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
198 p += 32;
199 }
200 return 0;
201}
202#undef DOIT1
203#undef DOIT2
204
205static u32 allp_mcuGenerateWordPattern(unsigned long uiSourceAddress, u32 uiPattern, u32 size_in_word, u32 uiStartVal, u32 bCheck)
206{
207 const u32 c_zero = 0x00000000;
208 u32 test_signal = 0x00000001;
209 u32 c_pattern;
210 u32 c_pattern_or_signal;
211 u32 i = 0, j = 0, k = 0, uiTemp = 0, uiFails = 0, expected;
212 u32 value = 0;
213
214 u32* Tmp_Address32 = (u32*)(long)uiSourceAddress;
215
216 giPatternRuns[uiPattern]++;
217
218 switch (uiPattern)
219 {
220
221 case ANALOG:
222 //printf("Generating ANALOG Pattern\n");
223 if (bCheck)
224 {
225 for (i = 0; i < size_in_word;) {
226 if (Tmp_Address32[i++] != 0xffffffff)
227 {
228 uiFails++;
229 uiTemp = Tmp_Address32[i - 1];
230 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0xffffffff, (uiTemp ^ 0xffffffff));
231 }
232 //else
233 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], 0xffffffff);
234
235 if (Tmp_Address32[i++] != 0)
236 {
237 uiFails++;
238 uiTemp = Tmp_Address32[i - 1];
239 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
240 }
241 //else
242 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], ~(0xffffffff));
243 }
244 }
245 else
246 {
247 test_write_ANALOG((u32*)(long)uiSourceAddress, size_in_word);
248 }
249 break;
250
251 case CONSTANT:
252 uiStartVal = 0xffffffff;
253 //printf("Generating CONSTANT Pattern 0x%X\n", uiStartVal);
254 if (bCheck)
255 {
256 for (i = 0; i < size_in_word;) {
257
258 if (Tmp_Address32[i++] != uiStartVal)
259 {
260 uiFails++;
261 uiTemp = Tmp_Address32[i - 1];
262 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ uiStartVal), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
263 }
264 //else
265 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
266 }
267 }
268 else
269 {
270 test_write_CONSTANT((u32*)(long)uiSourceAddress, size_in_word);
271 }
272 break;
273
274 case COMPLEMENT:
275 //printf("Generating COMPLEMENT Pattern - uiStartVal=%08X\n", uiStartVal);
276 if (bCheck)
277 {
278 for (i = 0; i < size_in_word;)
279 {
280 if (Tmp_Address32[i++] != (uiStartVal))
281 {
282 uiFails++;
283 uiTemp = Tmp_Address32[i - 1];
284 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)));
285 }
286 // else
287 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
288
289 if (Tmp_Address32[i++] != (~uiStartVal))
290 {
291 uiFails++;
292 uiTemp = Tmp_Address32[i - 1];
293 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (~uiStartVal), (uiTemp ^ (~uiStartVal)));
294
295 }
296 // else
297 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~uiStartVal));
298 }
299 }
300 else
301 {
302 test_write_COMPLETEMENT((u32*)(long)uiSourceAddress, size_in_word, uiStartVal);
303 }
304 break;
305
306 case DECREMENT:
307 //printf("Generating DECREMENT Pattern - uiStartVal=%08X\n", uiStartVal);
308 if (uiStartVal == 0) uiStartVal = 0xF0F0F0F0;
309 c_pattern = uiStartVal;
310 if (bCheck)
311 {
312 for (i = 0; i < size_in_word;) {
313 if (Tmp_Address32[i++] != c_pattern)
314 {
315 uiFails++;
316 uiTemp = Tmp_Address32[i - 1];
317 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
318 }
319 //else
320 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
321
322
323 if (Tmp_Address32[i++] != 0xFFFFFFFF)
324 {
325 uiFails++;
326 uiTemp = Tmp_Address32[i - 1];
327 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0xFFFFFFFF, (uiTemp ^ 0xFFFFFFFF));
328 }
329 //else
330 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], 0xFFFFFFFF);
331
332 if (c_pattern == 0)
333 c_pattern = uiStartVal;
334 else
335 c_pattern--;
336
337 }
338 }
339 else
340 {
341 for (i = 0; i < size_in_word;) {
342 Tmp_Address32[i++] = c_pattern;
343 Tmp_Address32[i++] = 0xFFFFFFFF;
344 if (c_pattern == 0)
345 c_pattern = uiStartVal;
346 else
347 c_pattern--;
348 }
349 }
350 break;
351
352 case INCREMENT:
353 //printf("Generating INCREMENT Pattern - uiStartVal=%08X\n", uiStartVal);
354 if (uiStartVal == 0xFFFFFFFF) uiStartVal = 0;
355 c_pattern = uiStartVal;
356 if (bCheck)
357 {
358 for (i = 0; i < size_in_word;) {
359 if (Tmp_Address32[i++] != c_pattern)
360 {
361 uiFails++;
362 uiTemp = Tmp_Address32[i - 1];
363 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
364 }
365 // else
366 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
367
368 if (Tmp_Address32[i++] != 0)
369 {
370 uiFails++;
371 uiTemp = Tmp_Address32[i - 1];
372 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
373 }
374 //else
375 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], 0);
376
377 if (c_pattern == 0xFFFFFFFF)
378 c_pattern = 0;
379 else
380 c_pattern++;
381
382 }
383 }
384 else
385 {
386 for (i = 0; i < size_in_word;) {
387 Tmp_Address32[i++] = c_pattern;
388 Tmp_Address32[i++] = 0;
389
390
391 if (c_pattern == 0xFFFFFFFF)
392 c_pattern = 0;
393 else
394 c_pattern++;
395 }
396 }
397
398 break;
399
400 case INCREMENTB:
401 //printf("Generating INCREMENTB Pattern - uiStartVal=%08X\n", c_zero);
402 c_pattern = uiStartVal;
403 if (bCheck)
404 {
405 for (i = 0; i < size_in_word;) {
406 if (Tmp_Address32[i++] != c_pattern)
407 {
408 uiFails++;
409 uiTemp = Tmp_Address32[i - 1];
410 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
411 expected = c_pattern;
412#if 0
413 process_fail(expected, uiTemp);
414#endif
415 }
416 // else
417 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
418
419 c_pattern += 0x04040404;
420 if ((c_pattern & 0xFF) == 0) c_pattern = uiStartVal;
421
422 }
423 }
424 else
425 {
426 for (i = 0; i < size_in_word;) {
427 Tmp_Address32[i++] = c_pattern;
428 c_pattern += 0x04040404;
429 if ((c_pattern & 0xFF) == 0) c_pattern = uiStartVal;
430
431 }
432 }
433 break;
434
435 case MILLER_EFFECT:
436 //printf("Generating MILLER_EFFECT ");
437 c_pattern = 0x55555555;
438 //printf("Generating MILLER_EFFECT Pattern - uiStartVal=%08X\n", c_pattern);
439 if (bCheck)
440 {
441 for (i = 0; i < size_in_word;)
442 {
443 if (Tmp_Address32[i++] != (c_pattern))
444 {
445 uiFails++;
446 uiTemp = Tmp_Address32[i - 1];
447 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (c_pattern), (uiTemp ^ (c_pattern)));
448
449 }
450 // else
451 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (c_pattern));
452
453 if (Tmp_Address32[i++] != (~c_pattern))
454 {
455 uiFails++;
456 uiTemp = Tmp_Address32[i - 1];
457 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (~c_pattern), (uiTemp ^ (~c_pattern)));
458
459
460 }
461 //else
462 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~c_pattern));
463 }
464 }
465 else
466 {
467 for (i = 0; i < size_in_word;) {
468 Tmp_Address32[i++] = (c_pattern);
469 Tmp_Address32[i++] = (~c_pattern);
470 }
471 }
472 break;
473
474 case ZERO_ROR_INVERT:
475 //printf("Generating ZERO_ROR_INVERT Pattern\n");
476 if (bCheck)
477 {
478 for (i = 0; i < size_in_word;)
479 {
480 if (Tmp_Address32[i++] != (uiStartVal))
481 {
482 uiFails++;
483 uiTemp = Tmp_Address32[i - 1];
484 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)));
485
486 }
487 // else
488 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
489
490 if (Tmp_Address32[i++] != (~uiStartVal))
491 {
492 uiFails++;
493 uiTemp = Tmp_Address32[i - 1];
494 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (~uiStartVal), (uiTemp ^ (~uiStartVal)));
495
496
497 }
498 // else
499 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~uiStartVal));
500
501 uiStartVal = ror32_mcu(uiStartVal);
502 }
503 }
504 else
505 {
506 for (i = 0; i < size_in_word;) {
507 Tmp_Address32[i++] = (uiStartVal);
508 Tmp_Address32[i++] = (~uiStartVal);
509 uiStartVal = ror32_mcu(uiStartVal);
510 }
511 }
512 break;
513
514 case ONE_ROL_INVERT:
515 //printf("Generating ONE_ROL_INVERT Pattern\n");
516 if (bCheck)
517 {
518 for (i = 0; i < size_in_word;)
519 {
520 if (Tmp_Address32[i++] != (uiStartVal))
521 {
522 uiFails++;
523 uiTemp = Tmp_Address32[i - 1];
524 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)));
525
526 }
527 // else
528 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
529
530 if (Tmp_Address32[i++] != (~uiStartVal))
531 {
532 uiFails++;
533 uiTemp = Tmp_Address32[i - 1];
534 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (~uiStartVal), (uiTemp ^ (~uiStartVal)));
535
536
537 }
538 // else
539 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~uiStartVal));
540
541 uiStartVal = rol32_mcu(uiStartVal);
542 }
543 }
544 else
545 {
546 for (i = 0; i < size_in_word;) {
547 Tmp_Address32[i++] = (uiStartVal);
548 Tmp_Address32[i++] = (~uiStartVal);
549 uiStartVal = rol32_mcu(uiStartVal);
550 }
551 }
552
553 break;
554
555 case ZERO_ROR:
556 //printf("Generating ZERO_ROR Pattern\n");
557 if (bCheck)
558 {
559 for (i = 0; i < size_in_word;) {
560 if (Tmp_Address32[i++] != (uiStartVal))
561 {
562 uiFails++;
563 uiTemp = Tmp_Address32[i - 1];
564 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
565
566 }
567 // else
568 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + (i * 4)), Tmp_Address32[i - 1], (uiStartVal));
569
570 uiStartVal = ror32_mcu(uiStartVal);
571 }
572 }
573 else
574 {
575 for (i = 0; i < size_in_word;) {
576 Tmp_Address32[i++] = (uiStartVal);
577 uiStartVal = ror32_mcu(uiStartVal);
578 }
579 }
580 break;
581
582 case ONE_ROL:
583 //printf("Generating ONE_ROL Pattern\n");
584 if (bCheck)
585 {
586 for (i = 0; i < size_in_word;) {
587 if (Tmp_Address32[i++] != (uiStartVal))
588 {
589 uiFails++;
590 uiTemp = Tmp_Address32[i - 1];
591 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
592
593 }
594 // else
595 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
596
597 uiStartVal = rol32_mcu(uiStartVal);
598 }
599 }
600 else
601 {
602 for (i = 0; i < size_in_word;) {
603 Tmp_Address32[i++] = (uiStartVal);
604 uiStartVal = rol32_mcu(uiStartVal);
605 }
606 }
607 break;
608
609 case WALKING_ONES:
610 //printf("Generating WALKING_ONES Pattern\n");
611 i = 0;
612 if (bCheck)
613 {
614 for (j = 0; j < size_in_word;)
615 {
616 if (Tmp_Address32[j++] != (1 << i))
617 {
618 uiFails++;
619 uiTemp = Tmp_Address32[j - 1];
620 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, (1 << i), (uiTemp ^ (1 << i)));
621
622 }
623 // else
624 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], ~(1 << i));
625
626 if (Tmp_Address32[j++] != 0xFFFFFFFF)
627 {
628 uiFails++;
629 uiTemp = Tmp_Address32[j - 1];
630 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0xFFFFFFFF, (uiTemp ^ 0xFFFFFFFF));
631
632 }
633 // else
634 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0xFFFFFFFF);
635
636
637 i++;
638 if (i >= 32) i = 0;
639 }
640 }
641 else
642 {
643 for (j = 0; j < size_in_word; )
644 {
645 Tmp_Address32[j++] = (u32)(1 << i);
646 Tmp_Address32[j++] = 0xFFFFFFFF;
647
648 i++;
649 if (i >= 32) i = 0;
650 }
651 }
652 break;
653
654 case WALKING_ZEROS:
655 //printf("Generating WALKING_ZEROS Pattern\n");
656 i = 0;
657 if (bCheck)
658 {
659 for (j = 0; j < size_in_word;)
660 {
661 if (Tmp_Address32[j++] != ~(1 << i))
662 {
663 uiFails++;
664 uiTemp = Tmp_Address32[j - 1];
665 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, ~(1 << i), (uiTemp ^ ~(1 << i)));
666
667 }
668 // else
669 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], ~(1 << i));
670
671 if (Tmp_Address32[j++] != 0)
672 {
673 uiFails++;
674 uiTemp = Tmp_Address32[j - 1];
675 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
676
677 }
678 // else
679 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0);
680
681
682 i++;
683 if (i >= 32) i = 0;
684 }
685 }
686 else
687 {
688 for (j = 0; j < size_in_word; )
689 {
690 Tmp_Address32[j++] = (u32)~(1 << i);
691 Tmp_Address32[j++] = 0;
692
693 i++;
694 if (i >= 32) i = 0;
695 }
696 }
697 break;
698
699 case SSTAILGATE_0101XXXX: //SSTAILGATE 0101XXXX
700 value = 0xFFFEFFFE;
701 //printf("Generating WALKING_ZEROS Pattern\n");
702 i = 0;
703 if (bCheck)
704 {
705 for (j = 0; j < size_in_word;)
706 {
707 if (Tmp_Address32[j++] != value)
708 {
709 uiFails++;
710 uiTemp = Tmp_Address32[j - 1];
711 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, value, (uiTemp ^ value));
712
713 }
714 // else
715 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], value);
716
717 if (Tmp_Address32[j++] != 0)
718 {
719 uiFails++;
720 uiTemp = Tmp_Address32[j - 1];
721 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
722
723 }
724 // else
725 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0);
726
727 value = ror32_mcu(value);
728 }
729 }
730 else
731 {
732 for (j = 0; j < size_in_word; )
733 {
734 Tmp_Address32[j++] = value;
735 Tmp_Address32[j++] = 0;
736 value = ror32_mcu(value);
737 }
738 }
739 break;
740
741 case SSTAILGATE_01010000: //SSTAILGATE 0101XXXX
742 value = 0xFEFEFEFE;
743 //printf("Generating WALKING_ZEROS Pattern\n");
744 i = 0;
745 if (bCheck)
746 {
747 for (j = 0; j < size_in_word;)
748 {
749 if (Tmp_Address32[j++] != value)
750 {
751 uiFails++;
752 uiTemp = Tmp_Address32[j - 1];
753 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, value, (uiTemp ^ value));
754
755 }
756 // else
757 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], value);
758
759 if (Tmp_Address32[j++] != 0)
760 {
761 uiFails++;
762 uiTemp = Tmp_Address32[j - 1];
763 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
764
765 }
766 // else
767 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0);
768
769 value = ror32_mcu(value);
770 }
771 }
772 else
773 {
774 for (j = 0; j < size_in_word; )
775 {
776 Tmp_Address32[j++] = value;
777 Tmp_Address32[j++] = 0;
778 value = ror32_mcu(value);
779 }
780 }
781 break;
782
783 case SSTAILGATE_01011111: //SSTAILGATE 0101XXXX
784 case MSTAILGATE:
785 //printf("Generating SSTAILGATE_0101 Pattern\n");
786 if (uiPattern == SSTAILGATE_01011111)
787 uiStartVal = 0x00000001;
788 else if (uiPattern == MSTAILGATE)
789 uiStartVal = 0xFFFFFFFF;
790
791 c_pattern = (uiStartVal);
792 c_pattern_or_signal = (uiStartVal | test_signal);
793
794 if (bCheck)
795 {
796 for (i = 0; i < size_in_word;)
797 {
798 if (Tmp_Address32[i++] != c_zero)
799 {
800 uiFails++;
801 uiTemp = Tmp_Address32[i - 1];
802 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero));
803
804
805 }
806 else if (Tmp_Address32[i++] != c_pattern_or_signal)
807 {
808 uiFails++;
809 uiTemp = Tmp_Address32[i - 1];
810 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern_or_signal, (uiTemp ^ c_pattern_or_signal));
811
812 }
813 else if (Tmp_Address32[i++] != c_zero)
814 {
815 uiFails++;
816 uiTemp = Tmp_Address32[i - 1];
817 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero));
818
819 }
820 else if (Tmp_Address32[i++] != c_pattern_or_signal)
821 {
822 uiFails++;
823 uiTemp = Tmp_Address32[i - 1];
824 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern_or_signal, (uiTemp ^ c_pattern_or_signal));
825
826 }
827 else if (Tmp_Address32[i++] != c_pattern)
828 {
829 uiFails++;
830 uiTemp = Tmp_Address32[i - 1];
831 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
832
833 }
834 else if (Tmp_Address32[i++] != c_pattern)
835 {
836 uiFails++;
837 uiTemp = Tmp_Address32[i - 1];
838 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
839
840 }
841 else if (Tmp_Address32[i++] != c_pattern)
842 {
843 uiFails++;
844 uiTemp = Tmp_Address32[i - 1];
845 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
846
847 }
848 else if (Tmp_Address32[i++] != c_pattern)
849 {
850 uiFails++;
851 uiTemp = Tmp_Address32[i - 1];
852 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
853
854 }
855 // else
856 // printf("PASS - pa%d all data\n", uiPattern);
857
858 }
859 }
860 else
861 {
862 for (i = 0; i < size_in_word;)
863 {
864 Tmp_Address32[i++] = c_zero;
865 Tmp_Address32[i++] = c_pattern_or_signal;
866 Tmp_Address32[i++] = c_zero;
867 Tmp_Address32[i++] = c_pattern_or_signal;
868 Tmp_Address32[i++] = c_pattern;
869 Tmp_Address32[i++] = c_pattern;
870 Tmp_Address32[i++] = c_pattern;
871 Tmp_Address32[i++] = c_pattern;
872 }
873 }
874 break;
875
876 case SSTAILGATE_01011010: //SSTAILGATE 01011010
877 //printf("Generating SSTAILGATE_1100 Pattern\n");
878 uiStartVal = 0x00000001;
879 c_pattern = (uiStartVal);
880 c_pattern_or_signal = (uiStartVal | test_signal);
881
882 if (bCheck)
883 {
884 for (i = 0; i < size_in_word;)
885 {
886 if (Tmp_Address32[i++] != c_zero)
887 {
888 uiFails++;
889 uiTemp = Tmp_Address32[i - 1];
890 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero));
891
892
893 }
894 else if (Tmp_Address32[i++] != c_pattern_or_signal)
895 {
896 uiFails++;
897 uiTemp = Tmp_Address32[i - 1];
898 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern_or_signal, (uiTemp ^ c_pattern_or_signal));
899
900 }
901 else if (Tmp_Address32[i++] != c_zero)
902 {
903 uiFails++;
904 uiTemp = Tmp_Address32[i - 1];
905 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero));
906
907 }
908 else if (Tmp_Address32[i++] != c_pattern_or_signal)
909 {
910 uiFails++;
911 uiTemp = Tmp_Address32[i - 1];
912 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern_or_signal, (uiTemp ^ c_pattern_or_signal));
913
914 }
915 else if (Tmp_Address32[i++] != c_pattern)
916 {
917 uiFails++;
918 uiTemp = Tmp_Address32[i - 1];
919 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
920
921 }
922 else if (Tmp_Address32[i++] != c_zero)
923 {
924 uiFails++;
925 uiTemp = Tmp_Address32[i - 1];
926 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero));
927
928 }
929 else if (Tmp_Address32[i++] != c_pattern)
930 {
931 uiFails++;
932 uiTemp = Tmp_Address32[i - 1];
933 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern));
934
935 }
936 else if (Tmp_Address32[i++] != c_zero)
937 {
938 uiFails++;
939 uiTemp = Tmp_Address32[i - 1];
940 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero));
941
942 }
943 // else
944 // printf("PASS - pa%d all data\n", uiPattern);
945
946 uiStartVal = rol32_mcu(uiStartVal);
947 test_signal = rol32_mcu(test_signal);
948
949 c_pattern = (uiStartVal);
950 c_pattern_or_signal = (uiStartVal | test_signal);
951
952
953 }
954 }
955 else
956 {
957 for (i = 0; i < size_in_word;)
958 {
959 Tmp_Address32[i++] = c_zero;
960 Tmp_Address32[i++] = c_pattern_or_signal;
961 Tmp_Address32[i++] = c_zero;
962 Tmp_Address32[i++] = c_pattern_or_signal;
963 Tmp_Address32[i++] = c_pattern;
964 Tmp_Address32[i++] = c_zero;
965 Tmp_Address32[i++] = c_pattern;
966 Tmp_Address32[i++] = c_zero;
967
968 uiStartVal = rol32_mcu(uiStartVal);
969 test_signal = rol32_mcu(test_signal);
970
971 c_pattern = (uiStartVal);
972 c_pattern_or_signal = (uiStartVal | test_signal);
973 }
974 }
975 break;
976
977 case FREQ_SWEEP:
978 //printf("Generating FREQ_SWEEP Pattern\n");
979 i = 0;
980 c_pattern = (c_zero);
981 c_pattern_or_signal = (~c_zero);
982 for (j = 1; j < size_in_word / 2; j++)
983 {
984 k = 0;
985 while (k < j)
986 {
987 if (bCheck)
988 {
989 if (Tmp_Address32[i++] != c_pattern)
990 {
991 uiFails++;
992 uiTemp = Tmp_Address32[i - 1];
993 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
994
995 }
996 // else
997 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
998 }
999 else
1000 {
1001 Tmp_Address32[i++] = c_pattern;
1002 }
1003 k++;
1004 if (i >= size_in_word)
1005 break;
1006 }
1007 if (i >= size_in_word)
1008 break;
1009
1010 k = 0;
1011 while (k < j)
1012 {
1013 if (bCheck)
1014 {
1015 if (Tmp_Address32[i++] != c_pattern_or_signal)
1016 {
1017 uiFails++;
1018 uiTemp = Tmp_Address32[i - 1];
1019 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern_or_signal, (uiTemp ^ c_pattern_or_signal), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1020
1021 }
1022 // else
1023 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern_or_signal);
1024 }
1025 else
1026 {
1027 Tmp_Address32[i++] = c_pattern_or_signal;
1028 }
1029 k++;
1030 if (i >= size_in_word)
1031 break;
1032 }
1033 if (i >= size_in_word)
1034 break;
1035 }
1036 break;
1037
1038 case VERT_INCREMENT:
1039 //printf("Generating VERT_INCREMENT Pattern\n");
1040 c_pattern = (uiStartVal);
1041 if (bCheck)
1042 {
1043 for (i = 0; i < size_in_word;) {
1044 if (Tmp_Address32[i++] != c_pattern)
1045 {
1046 uiFails++;
1047 uiTemp = Tmp_Address32[i - 1];
1048 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1049
1050 }
1051 // else
1052 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
1053
1054 c_pattern++;
1055 }
1056 }
1057 else
1058 {
1059 for (i = 0; i < size_in_word;) {
1060 Tmp_Address32[i++] = c_pattern;
1061 c_pattern++;
1062 }
1063 }
1064 break;
1065
1066 case HORZ_INCREMENT:
1067 //printf("Generating HORZ_INCREMENT Pattern\n");
1068 c_pattern = 0x00000001;
1069 i = 0;
1070 for (k = 0; k < (size_in_word / 16); k++)
1071 {
1072 for (j = 0; j < 16; j++)
1073 {
1074 if ((j % 2) == 1) { // ODD
1075 if (bCheck)
1076 {
1077 if (Tmp_Address32[i++] != c_pattern)
1078 {
1079 uiFails++;
1080 uiTemp = Tmp_Address32[i - 1];
1081 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1082
1083 }
1084 // else
1085 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
1086 }
1087 else
1088 {
1089 Tmp_Address32[i++] = c_pattern;
1090 }
1091 }
1092 else { // EVEN
1093 if (bCheck)
1094 {
1095 if (Tmp_Address32[i++] != c_zero)
1096 {
1097 uiFails++;
1098 uiTemp = Tmp_Address32[i - 1];
1099 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1100 }
1101 // else
1102 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
1103 }
1104 else
1105 {
1106 Tmp_Address32[i++] = c_zero;
1107 }
1108 }
1109 if (i >= size_in_word)
1110 break;
1111 if (((j % 4) / 2) == 1) { // {2,3,6,7,10,11,14,15}
1112 if (bCheck)
1113 {
1114 if (Tmp_Address32[i++] != c_pattern)
1115 {
1116 uiFails++;
1117 uiTemp = Tmp_Address32[i - 1];
1118 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1119
1120 }
1121 // else
1122 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
1123 }
1124 else
1125 {
1126 Tmp_Address32[i++] = c_pattern;
1127 }
1128 }
1129 else { // {0,1,4,5,8,9,12,13}
1130 if (bCheck)
1131 {
1132 if (Tmp_Address32[i++] != c_zero)
1133 {
1134 uiFails++;
1135 uiTemp = Tmp_Address32[i - 1];
1136 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1137
1138 }
1139 // else
1140 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
1141 }
1142 else
1143 {
1144 Tmp_Address32[i++] = c_zero;
1145 }
1146 }
1147 if (i >= size_in_word)
1148 break;
1149 if (((j % 8) / 4) == 1) { // {4,5,6,7,12,13,14,15}
1150 if (bCheck)
1151 {
1152 if (Tmp_Address32[i++] != c_pattern)
1153 {
1154 uiFails++;
1155 uiTemp = Tmp_Address32[i - 1];
1156 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1157
1158 }
1159 // else
1160 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
1161 }
1162 else
1163 {
1164 Tmp_Address32[i++] = c_pattern;
1165 //printf("i(%d) - j(%d) = %08X\n",i,j,c_pattern);
1166 }
1167 }
1168 else { // {0,1,2,3,8,9,10,11}
1169 if (bCheck)
1170 {
1171
1172 if (Tmp_Address32[i++] != c_zero)
1173 {
1174 uiFails++;
1175 uiTemp = Tmp_Address32[i - 1];
1176 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1177
1178 }
1179 // else
1180 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
1181 }
1182 else
1183 {
1184 Tmp_Address32[i++] = c_zero;
1185 //printf("i(%d) - j(%d) = %08X\n",i,j,c_zero);
1186 }
1187 }
1188 if (i >= size_in_word)
1189 break;
1190 if ((j / 8) == 1) { // {8 - 15}
1191 if (bCheck)
1192 {
1193 if (Tmp_Address32[i++] != c_pattern)
1194 {
1195 uiFails++;
1196 uiTemp = Tmp_Address32[i - 1];
1197 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_pattern, (uiTemp ^ c_pattern), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1198
1199 }
1200 // else
1201 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
1202 }
1203 else
1204 {
1205 Tmp_Address32[i++] = c_pattern;
1206 //printf("i(%d) - j(%d) = %08X\n",i,j,c_pattern);
1207 }
1208 }
1209 else { // {0 - 7}
1210 if (bCheck)
1211 {
1212 if (Tmp_Address32[i++] != c_zero)
1213 {
1214 uiFails++;
1215 uiTemp = Tmp_Address32[i - 1];
1216 printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X - DB=0x%08X - DA=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, c_zero, (uiTemp ^ c_zero), read_data_u32(uiSourceAddress + ((i - 1) * 4)), read_data_u32(uiSourceAddress + ((i + 1) * 4)));
1217
1218 }
1219 // else
1220 // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
1221 }
1222 else
1223 {
1224 Tmp_Address32[i++] = c_zero;
1225 }
1226 }
1227 if (i >= size_in_word)
1228 break;
1229 }
1230 if (i >= size_in_word)
1231 break;
1232
1233 c_pattern = rol32_mcu(c_pattern);
1234 }
1235 break;
1236
1237 default:
1238 printf("No option with uipat[%d ]\n", uiPattern);
1239 break;
1240
1241 }
1242
1243 if (uiFails)
1244 {
1245 giPatternNumOfFails[uiPattern] += uiFails;
1246 giPatternFails[uiPattern]++;
1247 }
1248 return uiFails;
1249}
1250
1251static u32 mem_all_pattern_test(u32 uiStartBase, u32 uiSize)
1252{
1253 u32 fail_cnt = 0, total_fail = 0, pattern = 0;
1254 u32 bResult = DDR_TEST_FAIL;
1255 u32 uiStartVal[10] = { 0xa5a5a5a5, 0xA5A50000, 0x2d2d2d2d, 0x5a5a5a5a, 0x89abcdef,
1256 0xD2D2D2D2, 0x01010101, 0xECA86420, 0x00000000, 0xFFFFFFFF };
1257 unsigned long uiSource = 0;
1258 int trace_print_level = 0;
1259 // only test width with 32b and 64b as the limited size of SQU
1260 for (pattern = ANALOG; pattern <= HORZ_INCREMENT; pattern++)
1261 // for(pattern = 8; pattern <= HORZ_INCREMENT; pattern++)
1262 {
1263 //temp = (pattern - ANALOG);
1264 //uiSource = uiStartBase + temp*uiSize;
1265 uiSource = uiStartBase;
1266
1267 printf( "[0x%08lx: 0x%X %d] D[0x%08X]", uiSource, uiSize, pattern, uiStartVal[pattern % 10]);
1268 allp_mcuGenerateWordPattern(uiSource, pattern, (uiSize / WORD_SIZE), uiStartVal[pattern % 10], 0);
1269 fail_cnt += allp_mcuGenerateWordPattern(uiSource, pattern, (uiSize / WORD_SIZE), uiStartVal[pattern % 10], 1);
1270
1271 if (fail_cnt)
1272 printf( "\n***FAIL*** pattern test failed=%d times - Address[0x%08lx] - Pattern[%d] - Start Value[0x%08X], Size=[0x%x]B\n", fail_cnt, uiSource, pattern, uiStartVal[pattern % 10], uiSize);
1273 else
1274 printf("-P\n");
1275
1276 total_fail += fail_cnt;
1277
1278 if (total_fail) //break on any fail
1279 break;
1280 }
1281
1282 if (total_fail == 0)
1283 {
1284 bResult = DDR_TEST_PASS;
1285 printf( "===OK=== all pattern tests ok - Address[0x%08lx], Size=[0x%x]B\n\n", uiSource, uiSize);
1286 }
1287 else
1288 {
1289 bResult = DDR_TEST_FAIL;
1290 printf( "===FAIL=== all pattern tests failed - total_fail=%d, Address[0x%08lx], Size=[0x%x]B\n\n", total_fail, uiSource, uiSize);
1291 }
1292
1293 return bResult;
1294}
1295
1296#else //CONFIG_USE_DDR_ALL_PATTERN
1297
1298static u32 mem_data16_pattern_test(u32 uiStartBase, u32 uiSize)
1299{
1300 u32 i=0,j=0,k=0;
1301 u32 data=0;
1302 u32 err=0;
1303 u32 start_addr=0x7e000000;
1304 u32 len=0x400000;
1305 u32 bResult = DDR_TEST_FAIL;
1306 static u32 test_pattern[NR_TEST_PATTERN] = {
1307 0x01010101,0x02020202,0x04040404,0x08080808,
1308 0x10101010,0x20202020,0x40404040,0x80808080,
1309 0xFEFEFEFE,0xFDFDFDFD,0xFBFBFBFB,0xF7F7F7F7,
1310 0xEFEFEFEF,0xDFDFDFDF,0xBFBFBFBF,0x7F7F7F7F,
1311 };
1312 //u32 local_test_pattern[NR_TEST_PATTERN];
1313
1314 printf("mem_data16_pattern_test [0x%08x-->0x%08x]!!!\n",
1315 uiStartBase, uiStartBase + uiSize);
1316
1317 start_addr = uiStartBase;
1318 len = uiSize;
1319 len &= (~(sizeof(test_pattern) - 1));
1320 printf("len: %x\n", len);
1321
1322#if 1
1323 for(j = 0; j <= 15; j++)
1324 {
1325 for(i = 0; i< len/4; i++)
1326 {
1327 data_write32(start_addr + i*4, test_pattern[j]);
1328 }
1329 flush_dcache_all();
1330
1331 for(i = 0; i < len/4; i++)
1332 {
1333 data = data_read32(start_addr + i*4);
1334 if(data != test_pattern[j])
1335 {
1336 printf("FAIL! data%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n",j,start_addr+i*4,data,test_pattern[j],(data^test_pattern[j]));
1337 err++;
1338 }
1339 }
1340 }
1341#else
1342 for (i = 0; i < NR_TEST_PATTERN; i++) {
1343 /* prepare pattern data */
1344 for (j = 0; j < NR_TEST_PATTERN; j++) {
1345 local_test_pattern[j] = test_pattern[i];
1346 }
1347
1348 for (j = 0; j < len; j += sizeof(local_test_pattern)) {
1349 memcpy((void *)(start_addr + j), (void *)local_test_pattern, sizeof(local_test_pattern));
1350 }
1351 flush_dcache_all();
1352
1353 for (j = 0; j < len; j += sizeof(local_test_pattern)) {
1354 memcpy(local_test_pattern, (void *)(start_addr + j), sizeof(local_test_pattern));
1355 for (k = 0; k < NR_TEST_PATTERN; k++) {
1356 if (local_test_pattern[k] != test_pattern[i]) {
1357 err++;
1358 printf("mem err: wr 0x%08x rd 0x%08x @0x%08x\n",
1359 test_pattern[i], local_test_pattern[k],
1360 (start_addr + j + k));
1361 }
1362 }
1363 }
1364 }
1365#endif
1366 if (err == 0)
1367 {
1368 bResult = DDR_TEST_PASS;
1369 printf("===PASS=== all data tests passed - StartAddress[0x%08lx], Size=[0x%x]B\n\n",start_addr,len);
1370 }
1371 else
1372 {
1373 bResult = DDR_TEST_FAIL;
1374 printf("===FAIL=== all data tests passed - total_fail=%d, StartAddress[0x%08lx], Size=[0x%x]B\n\n",err, start_addr, len);
1375 }
1376
1377 return bResult;
1378}
1379#endif
1380
1381u32 asr_ddr_pattern_test(u32 uiStartBase, u32 uiSize)
1382{
1383 u32 ret;
1384
1385#ifdef CONFIG_USE_DDR_ALL_PATTERN
1386 ret = mem_all_pattern_test(uiStartBase, uiSize);
1387#else
1388 ret = mem_data16_pattern_test(uiStartBase, uiSize);
1389#endif
1390 return ret;
1391}
1392
1393#define SINGLE_MALLOC_LEN (1024 * 1024)
1394#define LOW_PP_TEST_SIZE (10 * 1024 *1024)
1395
1396__weak int switch_low_pp_and_dvc(bool set_low, bool restore, u32 target_dop) {return 0;}
1397extern int hold_cpdsp_in_reset(void);
1398/*
1399* NOTE: should be very careful about the ddr test ranges
1400*/
1401int do_uboot_mem_test(u32 ddr_end_addr, u32 sec_ddr_start, u32 sec_ddr_end)
1402{
1403 int i, ret = DDR_TEST_PASS;
1404 u32 malloc_bufs[CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN];
1405 u32 reg_sp = 0x100000;
1406 u32 nr_test_array = ARRAY_SIZE(ddr_test_ranges);
1407 u32 obm_test_res;
1408
1409 p_asr_flag = get_asr_flag();
1410
1411 printf("mem test: asr flag header: %x\n", p_asr_flag->header);
1412 if(p_asr_flag->header != ASRFLAG_HEADER) {
1413 printf("!!!! asr flag error\n");
1414 return 1;
1415 }
1416
1417 printf("asr flag ddrt_state: %x\n", p_asr_flag->ddrt_state.value);
1418
1419 if (p_asr_flag->ddrt_state.bits.test_proc != 1)
1420 return 1;
1421
1422 if (ddr_test_is_done_obm(&obm_test_res)) {
1423 if (obm_test_res == DDR_TEST_FAIL) {
1424 printf("DDR test in OBM failed\n");
1425 p_asr_flag->ddrt_state.bits.total_times++;
1426 p_asr_flag->ddrt_state.bits.fail_times++;
1427 ret = DDR_TEST_FAIL;
1428 goto finalize_result;
1429 } else {
1430 printf("DDR test in OBM PASS\n");
1431 }
1432 } else {
1433 printf("No ddr test in OBM\n");
1434 }
1435
1436 /* hold cp/dsp in reset to stop running in ddr */
1437 hold_cpdsp_in_reset();
1438
1439 /* initially set fail res to avoid sw panic during test */
1440 p_asr_flag->ddrt_state.bits.total_times++;
1441 p_asr_flag->ddrt_state.bits.fail_times++;
1442 p_asr_flag->ddrt_state.bits.test_proc = 0; /* to avoid endless reboot */
1443 p_asr_flag->ddrt_state.bits.last_res = 1; /* fail */
1444 asr_flag_update();
1445
1446#ifdef CONFIG_TEE_OS
1447 for (i = 0; i < ARRAY_SIZE(ddr_test_ranges); i++) {
1448 if (ddr_test_ranges[i].ddr_mtest_end == CONFIG_SEC_DDR_ADDR_BEGIN)
1449 ddr_test_ranges[i].ddr_mtest_end = sec_ddr_start;
1450
1451 if (ddr_test_ranges[i].ddr_mtest_end == CONFIG_DDR_ADDR_END)
1452 ddr_test_ranges[i].ddr_mtest_end = ddr_end_addr;
1453
1454 if (ddr_test_ranges[i].ddr_mtest_begin == CONFIG_SEC_DDR_ADDR_END)
1455 ddr_test_ranges[i].ddr_mtest_begin = sec_ddr_end;
1456 }
1457#else
1458 for (i = 0; i < ARRAY_SIZE(ddr_test_ranges); i++) {
1459 if (ddr_test_ranges[i].ddr_mtest_end == CONFIG_DDR_ADDR_END)
1460 ddr_test_ranges[i].ddr_mtest_end = ddr_end_addr;
1461 }
1462#endif
1463
1464 for (i = 0; i < ARRAY_SIZE(ddr_test_ranges); i++) {
1465 ret = asr_ddr_pattern_test(ddr_test_ranges[i].ddr_mtest_begin,
1466 ddr_test_ranges[i].ddr_mtest_end - ddr_test_ranges[i].ddr_mtest_begin);
1467 if (DDR_TEST_FAIL == ret) {
1468 break;
1469 }
1470 }
1471
1472 if (i == ARRAY_SIZE(ddr_test_ranges) && (ret == DDR_TEST_PASS)) {
1473
1474 for (i = 0; i < (CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN); i++)
1475 malloc_bufs[i] = 0;
1476
1477 for (i = 0; i < (CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN); i++) {
1478 malloc_bufs[i] = memalign(4, SINGLE_MALLOC_LEN);
1479 printf("malloc_buf[%d]: 0x%08x, size: 0x%08x\n", i, malloc_bufs[i], SINGLE_MALLOC_LEN);
1480 if (malloc_bufs[i]) {
1481 ret = asr_ddr_pattern_test(malloc_bufs[i], SINGLE_MALLOC_LEN);
1482 if (DDR_TEST_FAIL == ret) {
1483 printf("!!!%s: ddr test failed in mallc buffer\n", __func__);
1484 break;
1485 }
1486 } else {
1487 ret = DDR_TEST_PASS;
1488 printf("%s: no malloc buffer available now\n", __func__);
1489 break;
1490 }
1491 }
1492
1493 for (i = 0; i < (CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN); i++) {
1494 if (malloc_bufs[i]) {
1495 printf("free buf[%d]: 0x%08x\n", i, malloc_bufs[i]);
1496 free(malloc_bufs[i]);
1497 }
1498 }
1499
1500 } else {
1501 ret = DDR_TEST_FAIL;
1502 }
1503
1504 /* cpu low + ddr 266 */
1505 if (DDR_TEST_PASS == ret) {
1506 switch_low_pp_and_dvc(1, 0, 0);
1507 ret = asr_ddr_pattern_test(ddr_test_ranges[nr_test_array - 1].ddr_mtest_end - LOW_PP_TEST_SIZE, LOW_PP_TEST_SIZE);
1508 if (DDR_TEST_FAIL == ret) {
1509 printf("!!!%s: low ddr-266 test failed\n", __func__);
1510 } else {
1511 ret = DDR_TEST_PASS;
1512 }
1513 switch_low_pp_and_dvc(0, 1, 0);
1514 }
1515
1516 /* cpu low + ddr 533 */
1517 if (DDR_TEST_PASS == ret) {
1518 switch_low_pp_and_dvc(1, 0, 1);
1519 ret = asr_ddr_pattern_test(ddr_test_ranges[nr_test_array - 1].ddr_mtest_end - LOW_PP_TEST_SIZE, LOW_PP_TEST_SIZE);
1520 if (DDR_TEST_FAIL == ret) {
1521 printf("!!!%s: low ddr-533 test failed\n", __func__);
1522 } else {
1523 ret = DDR_TEST_PASS;
1524 }
1525 switch_low_pp_and_dvc(0, 1, 1);
1526 }
1527
1528 if (DDR_TEST_PASS == ret) {
1529 __asm__ __volatile__("mov %0, sp":"=r"(reg_sp)::"memory");
1530 printf("cpu sp: 0x%x\n", reg_sp);
1531 reg_sp -= 0x8000; /* leave 32KB gap */
1532 reg_sp &= ~(0x8000 - 1);
1533 printf("cpu sp: 0x%x\n", reg_sp);
1534 if (((CONFIG_SYS_TEXT_BASE - 0x8000) < reg_sp) && (reg_sp < CONFIG_SYS_LONG_RELOC_END)) {
1535 ret = asr_ddr_pattern_test((CONFIG_SYS_TEXT_BASE - 0x8000), reg_sp - (CONFIG_SYS_TEXT_BASE - 0x8000));
1536 if (DDR_TEST_FAIL == ret) {
1537 printf("!!!%s: ddr test failed in stack area\n", __func__);
1538 } else {
1539 ret = DDR_TEST_PASS;
1540 }
1541 }
1542 }
1543
1544finalize_result:
1545 if (DDR_TEST_FAIL == ret) {
1546 printf("!!!%s: total test FAIL\n", __func__);
1547 p_asr_flag->ddrt_state.bits.last_res = 1; /* fail */
1548 p_asr_flag->ddrt_state.bits.test_proc = 0; /* clear */
1549 } else {
1550 printf("$$$%s: total test PASS\n", __func__);
1551 p_asr_flag->ddrt_state.bits.last_res = 0; /* pass */
1552 p_asr_flag->ddrt_state.bits.test_proc = 0; /* clear */
1553 p_asr_flag->ddrt_state.bits.fail_times--;
1554 }
1555 printf("asr flag ddrt_state: %x\n", p_asr_flag->ddrt_state.value);
1556 asr_flag_update();
1557 printf("reset cpu\n");
1558 run_command("reset", 0);
1559 udelay(1000 * 1000);
1560 printf("error: sys reset failed\n");
1561}
1562
1563static int do_devtest(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
1564{
1565 ulong addr, ddr_len, count, i, ret;
1566
1567 if ((argc < 3) || (argc > 5))
1568 return CMD_RET_USAGE;
1569
1570 addr = simple_strtoul(argv[1], NULL, 16);
1571
1572 /* Get the length to test.
1573 */
1574 ddr_len = simple_strtoul(argv[2], NULL, 16);
1575
1576 /* loop Count */
1577 if (argc == 4) {
1578 count = simple_strtoul(argv[3], NULL, 16);
1579 } else {
1580 count = 1;
1581 }
1582
1583 for (i = 0; i < count; i++) {
1584 ret = asr_ddr_pattern_test(addr, ddr_len);
1585 if (DDR_TEST_FAIL == ret) {
1586 printf("ddr test FAIL\n");
1587 break;
1588 }
1589 }
1590 return 0;
1591}
1592
1593U_BOOT_CMD(
1594 devtest, 4, 0, do_devtest,
1595 "ddr device test cmd\n",
1596 "devtest addr len loops"
1597);
1598