ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/uboot/board/Marvell/common/ddr_test.c b/marvell/uboot/board/Marvell/common/ddr_test.c
new file mode 100644
index 0000000..71a0657
--- /dev/null
+++ b/marvell/uboot/board/Marvell/common/ddr_test.c
@@ -0,0 +1,1598 @@
+#include <common.h>
+#include <malloc.h>
+#include <asm/io.h>
+
+#include "tim.h"
+#include "asr_common.h"
+#include "obm2osl.h"
+#include "asr_flag.h"
+#include "asr_flash.h"
+
+
+#ifndef CONFIG_BOOT_LOG_ADDR
+#define CONFIG_BOOT_LOG_ADDR (0x1f00000)
+#endif
+
+#define CONFIG_DDR_ADDR_END (0xFEDCBA98)
+#define CONFIG_SEC_DDR_ADDR_BEGIN (0xFEDCBA99)
+#define CONFIG_SEC_DDR_ADDR_END (0xFEDCBA9A)
+
+#define DDR_TEST_PASS (0)
+#define DDR_TEST_FAIL (1)
+
+#define MALLOC_BUFF_RESERVE_SZ (0x400000)
+
+#define NR_TEST_PATTERN 16
+
+#ifndef data_write32
+#define data_write32(ptrReg, value) \
+ (*((u32 *)(ptrReg)) = value)
+#endif
+
+#ifndef data_read32
+#define data_read32(ptrReg) \
+ (*((u32 *)(ptrReg)))
+#endif
+
+struct mtest_buf_desc {
+ u32 ddr_mtest_begin;
+ u32 ddr_mtest_end;
+};
+
+static struct asr_firmware_flag *p_asr_flag;
+
+#ifdef CONFIG_TEE_OS
+static struct mtest_buf_desc ddr_test_ranges[] = {
+ [0] = {
+ .ddr_mtest_begin = 0x0,
+ .ddr_mtest_end = CONFIG_SYS_TEXT_BASE - 0x8000,
+ },
+ [1] = {
+ .ddr_mtest_begin = CONFIG_SYS_LONG_RELOC_END + 0x8000,
+ .ddr_mtest_end = CONFIG_BOOT_LOG_ADDR,
+ },
+ [2] = {
+ .ddr_mtest_begin = CONFIG_BOOT_LOG_ADDR + 0x10000, /* reserve 64KB */
+ .ddr_mtest_end = CONFIG_SEC_DDR_ADDR_BEGIN,
+ },
+ [3] = {
+ .ddr_mtest_begin = CONFIG_SEC_DDR_ADDR_END,
+ .ddr_mtest_end = CONFIG_DDR_ADDR_END,
+ },
+};
+#else
+static struct mtest_buf_desc ddr_test_ranges[] = {
+ [0] = {
+ .ddr_mtest_begin = 0x0,
+ .ddr_mtest_end = CONFIG_SYS_TEXT_BASE - 0x8000,
+ },
+ [1] = {
+ .ddr_mtest_begin = CONFIG_SYS_LONG_RELOC_END + 0x8000,
+ .ddr_mtest_end = CONFIG_BOOT_LOG_ADDR,
+ },
+ [2] = {
+ .ddr_mtest_begin = CONFIG_BOOT_LOG_ADDR + 0x10000, /* reserve 64KB */
+ .ddr_mtest_end = CONFIG_DDR_ADDR_END,
+ },
+};
+#endif
+
+
+#ifdef CONFIG_USE_DDR_ALL_PATTERN
+static int giBitFails[32], giByteLaneFails[4], giPatternFails[22], giPatternRuns[22],giPatternNumOfFails[22];
+#define ANALOG 1
+#define CONSTANT 2
+#define COMPLEMENT 3
+#define DECREMENT 4
+#define INCREMENT 5
+#define INCREMENTB 6
+#define MILLER_EFFECT 7
+#define ZERO_ROR_INVERT 8
+#define ONE_ROL_INVERT 9
+#define ZERO_ROR 10
+#define ONE_ROL 11
+#define WALKING_ONES 12
+#define WALKING_ZEROS 13
+#define SSTAILGATE_0101XXXX 14
+#define SSTAILGATE_01010000 15
+#define SSTAILGATE_01011111 16
+#define SSTAILGATE_01011010 17
+#define MSTAILGATE 18
+#define FREQ_SWEEP 19
+#define VERT_INCREMENT 20
+#define HORZ_INCREMENT 21
+
+#define read_data_u32(reg) (*((volatile u32 *)(reg)))
+
+#define WORD_SIZE (4)
+
+static u32 rol32_mcu(u32 val)
+{
+ u32 msb = val >> 31;
+
+ val = val << 1;
+
+ msb &= 0x00000001;
+ val |= msb;
+
+ return val;
+}
+
+static u32 ror32_mcu(u32 val)
+{
+ u32 lsb = val << 31;
+
+ val = val >> 1;
+
+ val &= 0x7FFFFFFF;
+ val |= lsb;
+
+ return val;
+}
+
+static int test_write_ANALOG(u32* start, int count)
+{
+ u32* p = (u32*)start;
+ while (p < (start + count))
+ {
+#define DOIT1(i) p[i]=0xffffffff;
+#define DOIT2(i) p[i]=0x0;
+
+ DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
+ DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
+ DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
+ DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
+ p += 32;
+
+ DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
+ DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
+ DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
+ DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
+ p += 32;
+ }
+ return 0;
+}
+#undef DOIT1
+#undef DOIT2
+
+static int test_write_CONSTANT(u32* start, int count)
+{
+ u32* p = (u32*)start;
+ while (p < (start + count))
+ {
+#define DOIT1(i) p[i]=0xffffffff;
+
+ DOIT1(0) DOIT1(1) DOIT1(2) DOIT1(3) DOIT1(4) DOIT1(5) DOIT1(6) DOIT1(7)
+ DOIT1(8) DOIT1(9) DOIT1(10) DOIT1(11) DOIT1(12) DOIT1(13) DOIT1(14) DOIT1(15)
+ DOIT1(16) DOIT1(17) DOIT1(18) DOIT1(19) DOIT1(20) DOIT1(21) DOIT1(22) DOIT1(23)
+ DOIT1(24) DOIT1(25) DOIT1(26) DOIT1(27) DOIT1(28) DOIT1(29) DOIT1(30) DOIT1(31)
+ p += 32;
+ DOIT1(0) DOIT1(1) DOIT1(2) DOIT1(3) DOIT1(4) DOIT1(5) DOIT1(6) DOIT1(7)
+ DOIT1(8) DOIT1(9) DOIT1(10) DOIT1(11) DOIT1(12) DOIT1(13) DOIT1(14) DOIT1(15)
+ DOIT1(16) DOIT1(17) DOIT1(18) DOIT1(19) DOIT1(20) DOIT1(21) DOIT1(22) DOIT1(23)
+ DOIT1(24) DOIT1(25) DOIT1(26) DOIT1(27) DOIT1(28) DOIT1(29) DOIT1(30) DOIT1(31)
+ p += 32;
+ }
+ return 0;
+}
+#undef DOIT1
+
+static int test_write_COMPLETEMENT(u32* start, int count, u32 uiStartVal)
+{
+ u32* p = (u32*)start;
+ while (p < (start + count))
+ {
+#define DOIT1(i) p[i]=uiStartVal;
+#define DOIT2(i) p[i]=(~uiStartVal);
+
+ DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
+ DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
+ DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
+ DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
+ p += 32;
+
+ DOIT1(0) DOIT2(1) DOIT1(2) DOIT2(3) DOIT1(4) DOIT2(5) DOIT1(6) DOIT2(7)
+ DOIT1(8) DOIT2(9) DOIT1(10) DOIT2(11) DOIT1(12) DOIT2(13) DOIT1(14) DOIT2(15)
+ DOIT1(16) DOIT2(17) DOIT1(18) DOIT2(19) DOIT1(20) DOIT2(21) DOIT1(22) DOIT2(23)
+ DOIT1(24) DOIT2(25) DOIT1(26) DOIT2(27) DOIT1(28) DOIT2(29) DOIT1(30) DOIT2(31)
+ p += 32;
+ }
+ return 0;
+}
+#undef DOIT1
+#undef DOIT2
+
+static u32 allp_mcuGenerateWordPattern(unsigned long uiSourceAddress, u32 uiPattern, u32 size_in_word, u32 uiStartVal, u32 bCheck)
+{
+ const u32 c_zero = 0x00000000;
+ u32 test_signal = 0x00000001;
+ u32 c_pattern;
+ u32 c_pattern_or_signal;
+ u32 i = 0, j = 0, k = 0, uiTemp = 0, uiFails = 0, expected;
+ u32 value = 0;
+
+ u32* Tmp_Address32 = (u32*)(long)uiSourceAddress;
+
+ giPatternRuns[uiPattern]++;
+
+ switch (uiPattern)
+ {
+
+ case ANALOG:
+ //printf("Generating ANALOG Pattern\n");
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+ if (Tmp_Address32[i++] != 0xffffffff)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0xffffffff, (uiTemp ^ 0xffffffff));
+ }
+ //else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], 0xffffffff);
+
+ if (Tmp_Address32[i++] != 0)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
+ }
+ //else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], ~(0xffffffff));
+ }
+ }
+ else
+ {
+ test_write_ANALOG((u32*)(long)uiSourceAddress, size_in_word);
+ }
+ break;
+
+ case CONSTANT:
+ uiStartVal = 0xffffffff;
+ //printf("Generating CONSTANT Pattern 0x%X\n", uiStartVal);
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+
+ if (Tmp_Address32[i++] != uiStartVal)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+ }
+ //else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
+ }
+ }
+ else
+ {
+ test_write_CONSTANT((u32*)(long)uiSourceAddress, size_in_word);
+ }
+ break;
+
+ case COMPLEMENT:
+ //printf("Generating COMPLEMENT Pattern - uiStartVal=%08X\n", uiStartVal);
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ if (Tmp_Address32[i++] != (uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)));
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
+
+ if (Tmp_Address32[i++] != (~uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (~uiStartVal), (uiTemp ^ (~uiStartVal)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~uiStartVal));
+ }
+ }
+ else
+ {
+ test_write_COMPLETEMENT((u32*)(long)uiSourceAddress, size_in_word, uiStartVal);
+ }
+ break;
+
+ case DECREMENT:
+ //printf("Generating DECREMENT Pattern - uiStartVal=%08X\n", uiStartVal);
+ if (uiStartVal == 0) uiStartVal = 0xF0F0F0F0;
+ c_pattern = uiStartVal;
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+ }
+ //else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+
+
+ if (Tmp_Address32[i++] != 0xFFFFFFFF)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0xFFFFFFFF, (uiTemp ^ 0xFFFFFFFF));
+ }
+ //else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], 0xFFFFFFFF);
+
+ if (c_pattern == 0)
+ c_pattern = uiStartVal;
+ else
+ c_pattern--;
+
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = c_pattern;
+ Tmp_Address32[i++] = 0xFFFFFFFF;
+ if (c_pattern == 0)
+ c_pattern = uiStartVal;
+ else
+ c_pattern--;
+ }
+ }
+ break;
+
+ case INCREMENT:
+ //printf("Generating INCREMENT Pattern - uiStartVal=%08X\n", uiStartVal);
+ if (uiStartVal == 0xFFFFFFFF) uiStartVal = 0;
+ c_pattern = uiStartVal;
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+
+ if (Tmp_Address32[i++] != 0)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
+ }
+ //else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], 0);
+
+ if (c_pattern == 0xFFFFFFFF)
+ c_pattern = 0;
+ else
+ c_pattern++;
+
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = c_pattern;
+ Tmp_Address32[i++] = 0;
+
+
+ if (c_pattern == 0xFFFFFFFF)
+ c_pattern = 0;
+ else
+ c_pattern++;
+ }
+ }
+
+ break;
+
+ case INCREMENTB:
+ //printf("Generating INCREMENTB Pattern - uiStartVal=%08X\n", c_zero);
+ c_pattern = uiStartVal;
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+ expected = c_pattern;
+#if 0
+ process_fail(expected, uiTemp);
+#endif
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+
+ c_pattern += 0x04040404;
+ if ((c_pattern & 0xFF) == 0) c_pattern = uiStartVal;
+
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = c_pattern;
+ c_pattern += 0x04040404;
+ if ((c_pattern & 0xFF) == 0) c_pattern = uiStartVal;
+
+ }
+ }
+ break;
+
+ case MILLER_EFFECT:
+ //printf("Generating MILLER_EFFECT ");
+ c_pattern = 0x55555555;
+ //printf("Generating MILLER_EFFECT Pattern - uiStartVal=%08X\n", c_pattern);
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ if (Tmp_Address32[i++] != (c_pattern))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (c_pattern));
+
+ if (Tmp_Address32[i++] != (~c_pattern))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+
+ }
+ //else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~c_pattern));
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = (c_pattern);
+ Tmp_Address32[i++] = (~c_pattern);
+ }
+ }
+ break;
+
+ case ZERO_ROR_INVERT:
+ //printf("Generating ZERO_ROR_INVERT Pattern\n");
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ if (Tmp_Address32[i++] != (uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
+
+ if (Tmp_Address32[i++] != (~uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (~uiStartVal), (uiTemp ^ (~uiStartVal)));
+
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~uiStartVal));
+
+ uiStartVal = ror32_mcu(uiStartVal);
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = (uiStartVal);
+ Tmp_Address32[i++] = (~uiStartVal);
+ uiStartVal = ror32_mcu(uiStartVal);
+ }
+ }
+ break;
+
+ case ONE_ROL_INVERT:
+ //printf("Generating ONE_ROL_INVERT Pattern\n");
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ if (Tmp_Address32[i++] != (uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (uiStartVal), (uiTemp ^ (uiStartVal)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
+
+ if (Tmp_Address32[i++] != (~uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), uiTemp, (~uiStartVal), (uiTemp ^ (~uiStartVal)));
+
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (~uiStartVal));
+
+ uiStartVal = rol32_mcu(uiStartVal);
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = (uiStartVal);
+ Tmp_Address32[i++] = (~uiStartVal);
+ uiStartVal = rol32_mcu(uiStartVal);
+ }
+ }
+
+ break;
+
+ case ZERO_ROR:
+ //printf("Generating ZERO_ROR Pattern\n");
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+ if (Tmp_Address32[i++] != (uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + (i * 4)), Tmp_Address32[i - 1], (uiStartVal));
+
+ uiStartVal = ror32_mcu(uiStartVal);
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = (uiStartVal);
+ uiStartVal = ror32_mcu(uiStartVal);
+ }
+ }
+ break;
+
+ case ONE_ROL:
+ //printf("Generating ONE_ROL Pattern\n");
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+ if (Tmp_Address32[i++] != (uiStartVal))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], (uiStartVal));
+
+ uiStartVal = rol32_mcu(uiStartVal);
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = (uiStartVal);
+ uiStartVal = rol32_mcu(uiStartVal);
+ }
+ }
+ break;
+
+ case WALKING_ONES:
+ //printf("Generating WALKING_ONES Pattern\n");
+ i = 0;
+ if (bCheck)
+ {
+ for (j = 0; j < size_in_word;)
+ {
+ if (Tmp_Address32[j++] != (1 << i))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], ~(1 << i));
+
+ if (Tmp_Address32[j++] != 0xFFFFFFFF)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0xFFFFFFFF, (uiTemp ^ 0xFFFFFFFF));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0xFFFFFFFF);
+
+
+ i++;
+ if (i >= 32) i = 0;
+ }
+ }
+ else
+ {
+ for (j = 0; j < size_in_word; )
+ {
+ Tmp_Address32[j++] = (u32)(1 << i);
+ Tmp_Address32[j++] = 0xFFFFFFFF;
+
+ i++;
+ if (i >= 32) i = 0;
+ }
+ }
+ break;
+
+ case WALKING_ZEROS:
+ //printf("Generating WALKING_ZEROS Pattern\n");
+ i = 0;
+ if (bCheck)
+ {
+ for (j = 0; j < size_in_word;)
+ {
+ if (Tmp_Address32[j++] != ~(1 << i))
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], ~(1 << i));
+
+ if (Tmp_Address32[j++] != 0)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0);
+
+
+ i++;
+ if (i >= 32) i = 0;
+ }
+ }
+ else
+ {
+ for (j = 0; j < size_in_word; )
+ {
+ Tmp_Address32[j++] = (u32)~(1 << i);
+ Tmp_Address32[j++] = 0;
+
+ i++;
+ if (i >= 32) i = 0;
+ }
+ }
+ break;
+
+ case SSTAILGATE_0101XXXX: //SSTAILGATE 0101XXXX
+ value = 0xFFFEFFFE;
+ //printf("Generating WALKING_ZEROS Pattern\n");
+ i = 0;
+ if (bCheck)
+ {
+ for (j = 0; j < size_in_word;)
+ {
+ if (Tmp_Address32[j++] != value)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, value, (uiTemp ^ value));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], value);
+
+ if (Tmp_Address32[j++] != 0)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0);
+
+ value = ror32_mcu(value);
+ }
+ }
+ else
+ {
+ for (j = 0; j < size_in_word; )
+ {
+ Tmp_Address32[j++] = value;
+ Tmp_Address32[j++] = 0;
+ value = ror32_mcu(value);
+ }
+ }
+ break;
+
+ case SSTAILGATE_01010000: //SSTAILGATE 0101XXXX
+ value = 0xFEFEFEFE;
+ //printf("Generating WALKING_ZEROS Pattern\n");
+ i = 0;
+ if (bCheck)
+ {
+ for (j = 0; j < size_in_word;)
+ {
+ if (Tmp_Address32[j++] != value)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, value, (uiTemp ^ value));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], value);
+
+ if (Tmp_Address32[j++] != 0)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[j - 1];
+ printf( "FAIL! pa%d:[@0x%08lx]=0x%08X Exp=0x%08X - Dif=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), uiTemp, 0, (uiTemp ^ 0));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((j - 1) * 4)), Tmp_Address32[j - 1], 0);
+
+ value = ror32_mcu(value);
+ }
+ }
+ else
+ {
+ for (j = 0; j < size_in_word; )
+ {
+ Tmp_Address32[j++] = value;
+ Tmp_Address32[j++] = 0;
+ value = ror32_mcu(value);
+ }
+ }
+ break;
+
+ case SSTAILGATE_01011111: //SSTAILGATE 0101XXXX
+ case MSTAILGATE:
+ //printf("Generating SSTAILGATE_0101 Pattern\n");
+ if (uiPattern == SSTAILGATE_01011111)
+ uiStartVal = 0x00000001;
+ else if (uiPattern == MSTAILGATE)
+ uiStartVal = 0xFFFFFFFF;
+
+ c_pattern = (uiStartVal);
+ c_pattern_or_signal = (uiStartVal | test_signal);
+
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern_or_signal)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern_or_signal)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ // else
+ // printf("PASS - pa%d all data\n", uiPattern);
+
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ Tmp_Address32[i++] = c_zero;
+ Tmp_Address32[i++] = c_pattern_or_signal;
+ Tmp_Address32[i++] = c_zero;
+ Tmp_Address32[i++] = c_pattern_or_signal;
+ Tmp_Address32[i++] = c_pattern;
+ Tmp_Address32[i++] = c_pattern;
+ Tmp_Address32[i++] = c_pattern;
+ Tmp_Address32[i++] = c_pattern;
+ }
+ }
+ break;
+
+ case SSTAILGATE_01011010: //SSTAILGATE 01011010
+ //printf("Generating SSTAILGATE_1100 Pattern\n");
+ uiStartVal = 0x00000001;
+ c_pattern = (uiStartVal);
+ c_pattern_or_signal = (uiStartVal | test_signal);
+
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern_or_signal)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern_or_signal)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ else if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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));
+
+ }
+ // else
+ // printf("PASS - pa%d all data\n", uiPattern);
+
+ uiStartVal = rol32_mcu(uiStartVal);
+ test_signal = rol32_mcu(test_signal);
+
+ c_pattern = (uiStartVal);
+ c_pattern_or_signal = (uiStartVal | test_signal);
+
+
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;)
+ {
+ Tmp_Address32[i++] = c_zero;
+ Tmp_Address32[i++] = c_pattern_or_signal;
+ Tmp_Address32[i++] = c_zero;
+ Tmp_Address32[i++] = c_pattern_or_signal;
+ Tmp_Address32[i++] = c_pattern;
+ Tmp_Address32[i++] = c_zero;
+ Tmp_Address32[i++] = c_pattern;
+ Tmp_Address32[i++] = c_zero;
+
+ uiStartVal = rol32_mcu(uiStartVal);
+ test_signal = rol32_mcu(test_signal);
+
+ c_pattern = (uiStartVal);
+ c_pattern_or_signal = (uiStartVal | test_signal);
+ }
+ }
+ break;
+
+ case FREQ_SWEEP:
+ //printf("Generating FREQ_SWEEP Pattern\n");
+ i = 0;
+ c_pattern = (c_zero);
+ c_pattern_or_signal = (~c_zero);
+ for (j = 1; j < size_in_word / 2; j++)
+ {
+ k = 0;
+ while (k < j)
+ {
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_pattern;
+ }
+ k++;
+ if (i >= size_in_word)
+ break;
+ }
+ if (i >= size_in_word)
+ break;
+
+ k = 0;
+ while (k < j)
+ {
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_pattern_or_signal)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // 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);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_pattern_or_signal;
+ }
+ k++;
+ if (i >= size_in_word)
+ break;
+ }
+ if (i >= size_in_word)
+ break;
+ }
+ break;
+
+ case VERT_INCREMENT:
+ //printf("Generating VERT_INCREMENT Pattern\n");
+ c_pattern = (uiStartVal);
+ if (bCheck)
+ {
+ for (i = 0; i < size_in_word;) {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+
+ c_pattern++;
+ }
+ }
+ else
+ {
+ for (i = 0; i < size_in_word;) {
+ Tmp_Address32[i++] = c_pattern;
+ c_pattern++;
+ }
+ }
+ break;
+
+ case HORZ_INCREMENT:
+ //printf("Generating HORZ_INCREMENT Pattern\n");
+ c_pattern = 0x00000001;
+ i = 0;
+ for (k = 0; k < (size_in_word / 16); k++)
+ {
+ for (j = 0; j < 16; j++)
+ {
+ if ((j % 2) == 1) { // ODD
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_pattern;
+ }
+ }
+ else { // EVEN
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_zero;
+ }
+ }
+ if (i >= size_in_word)
+ break;
+ if (((j % 4) / 2) == 1) { // {2,3,6,7,10,11,14,15}
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_pattern;
+ }
+ }
+ else { // {0,1,4,5,8,9,12,13}
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_zero;
+ }
+ }
+ if (i >= size_in_word)
+ break;
+ if (((j % 8) / 4) == 1) { // {4,5,6,7,12,13,14,15}
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_pattern;
+ //printf("i(%d) - j(%d) = %08X\n",i,j,c_pattern);
+ }
+ }
+ else { // {0,1,2,3,8,9,10,11}
+ if (bCheck)
+ {
+
+ if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_zero;
+ //printf("i(%d) - j(%d) = %08X\n",i,j,c_zero);
+ }
+ }
+ if (i >= size_in_word)
+ break;
+ if ((j / 8) == 1) { // {8 - 15}
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_pattern)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_pattern);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_pattern;
+ //printf("i(%d) - j(%d) = %08X\n",i,j,c_pattern);
+ }
+ }
+ else { // {0 - 7}
+ if (bCheck)
+ {
+ if (Tmp_Address32[i++] != c_zero)
+ {
+ uiFails++;
+ uiTemp = Tmp_Address32[i - 1];
+ 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)));
+
+ }
+ // else
+ // printf("PASS - pa%d:[@0x%08lx]=0x%08X Exp=0x%08X\n", uiPattern, (uiSourceAddress + ((i - 1) * 4)), Tmp_Address32[i - 1], c_zero);
+ }
+ else
+ {
+ Tmp_Address32[i++] = c_zero;
+ }
+ }
+ if (i >= size_in_word)
+ break;
+ }
+ if (i >= size_in_word)
+ break;
+
+ c_pattern = rol32_mcu(c_pattern);
+ }
+ break;
+
+ default:
+ printf("No option with uipat[%d ]\n", uiPattern);
+ break;
+
+ }
+
+ if (uiFails)
+ {
+ giPatternNumOfFails[uiPattern] += uiFails;
+ giPatternFails[uiPattern]++;
+ }
+ return uiFails;
+}
+
+static u32 mem_all_pattern_test(u32 uiStartBase, u32 uiSize)
+{
+ u32 fail_cnt = 0, total_fail = 0, pattern = 0;
+ u32 bResult = DDR_TEST_FAIL;
+ u32 uiStartVal[10] = { 0xa5a5a5a5, 0xA5A50000, 0x2d2d2d2d, 0x5a5a5a5a, 0x89abcdef,
+ 0xD2D2D2D2, 0x01010101, 0xECA86420, 0x00000000, 0xFFFFFFFF };
+ unsigned long uiSource = 0;
+ int trace_print_level = 0;
+ // only test width with 32b and 64b as the limited size of SQU
+ for (pattern = ANALOG; pattern <= HORZ_INCREMENT; pattern++)
+ // for(pattern = 8; pattern <= HORZ_INCREMENT; pattern++)
+ {
+ //temp = (pattern - ANALOG);
+ //uiSource = uiStartBase + temp*uiSize;
+ uiSource = uiStartBase;
+
+ printf( "[0x%08lx: 0x%X %d] D[0x%08X]", uiSource, uiSize, pattern, uiStartVal[pattern % 10]);
+ allp_mcuGenerateWordPattern(uiSource, pattern, (uiSize / WORD_SIZE), uiStartVal[pattern % 10], 0);
+ fail_cnt += allp_mcuGenerateWordPattern(uiSource, pattern, (uiSize / WORD_SIZE), uiStartVal[pattern % 10], 1);
+
+ if (fail_cnt)
+ 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);
+ else
+ printf("-P\n");
+
+ total_fail += fail_cnt;
+
+ if (total_fail) //break on any fail
+ break;
+ }
+
+ if (total_fail == 0)
+ {
+ bResult = DDR_TEST_PASS;
+ printf( "===OK=== all pattern tests ok - Address[0x%08lx], Size=[0x%x]B\n\n", uiSource, uiSize);
+ }
+ else
+ {
+ bResult = DDR_TEST_FAIL;
+ printf( "===FAIL=== all pattern tests failed - total_fail=%d, Address[0x%08lx], Size=[0x%x]B\n\n", total_fail, uiSource, uiSize);
+ }
+
+ return bResult;
+}
+
+#else //CONFIG_USE_DDR_ALL_PATTERN
+
+static u32 mem_data16_pattern_test(u32 uiStartBase, u32 uiSize)
+{
+ u32 i=0,j=0,k=0;
+ u32 data=0;
+ u32 err=0;
+ u32 start_addr=0x7e000000;
+ u32 len=0x400000;
+ u32 bResult = DDR_TEST_FAIL;
+ static u32 test_pattern[NR_TEST_PATTERN] = {
+ 0x01010101,0x02020202,0x04040404,0x08080808,
+ 0x10101010,0x20202020,0x40404040,0x80808080,
+ 0xFEFEFEFE,0xFDFDFDFD,0xFBFBFBFB,0xF7F7F7F7,
+ 0xEFEFEFEF,0xDFDFDFDF,0xBFBFBFBF,0x7F7F7F7F,
+ };
+ //u32 local_test_pattern[NR_TEST_PATTERN];
+
+ printf("mem_data16_pattern_test [0x%08x-->0x%08x]!!!\n",
+ uiStartBase, uiStartBase + uiSize);
+
+ start_addr = uiStartBase;
+ len = uiSize;
+ len &= (~(sizeof(test_pattern) - 1));
+ printf("len: %x\n", len);
+
+#if 1
+ for(j = 0; j <= 15; j++)
+ {
+ for(i = 0; i< len/4; i++)
+ {
+ data_write32(start_addr + i*4, test_pattern[j]);
+ }
+ flush_dcache_all();
+
+ for(i = 0; i < len/4; i++)
+ {
+ data = data_read32(start_addr + i*4);
+ if(data != test_pattern[j])
+ {
+ 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]));
+ err++;
+ }
+ }
+ }
+#else
+ for (i = 0; i < NR_TEST_PATTERN; i++) {
+ /* prepare pattern data */
+ for (j = 0; j < NR_TEST_PATTERN; j++) {
+ local_test_pattern[j] = test_pattern[i];
+ }
+
+ for (j = 0; j < len; j += sizeof(local_test_pattern)) {
+ memcpy((void *)(start_addr + j), (void *)local_test_pattern, sizeof(local_test_pattern));
+ }
+ flush_dcache_all();
+
+ for (j = 0; j < len; j += sizeof(local_test_pattern)) {
+ memcpy(local_test_pattern, (void *)(start_addr + j), sizeof(local_test_pattern));
+ for (k = 0; k < NR_TEST_PATTERN; k++) {
+ if (local_test_pattern[k] != test_pattern[i]) {
+ err++;
+ printf("mem err: wr 0x%08x rd 0x%08x @0x%08x\n",
+ test_pattern[i], local_test_pattern[k],
+ (start_addr + j + k));
+ }
+ }
+ }
+ }
+#endif
+ if (err == 0)
+ {
+ bResult = DDR_TEST_PASS;
+ printf("===PASS=== all data tests passed - StartAddress[0x%08lx], Size=[0x%x]B\n\n",start_addr,len);
+ }
+ else
+ {
+ bResult = DDR_TEST_FAIL;
+ printf("===FAIL=== all data tests passed - total_fail=%d, StartAddress[0x%08lx], Size=[0x%x]B\n\n",err, start_addr, len);
+ }
+
+ return bResult;
+}
+#endif
+
+u32 asr_ddr_pattern_test(u32 uiStartBase, u32 uiSize)
+{
+ u32 ret;
+
+#ifdef CONFIG_USE_DDR_ALL_PATTERN
+ ret = mem_all_pattern_test(uiStartBase, uiSize);
+#else
+ ret = mem_data16_pattern_test(uiStartBase, uiSize);
+#endif
+ return ret;
+}
+
+#define SINGLE_MALLOC_LEN (1024 * 1024)
+#define LOW_PP_TEST_SIZE (10 * 1024 *1024)
+
+__weak int switch_low_pp_and_dvc(bool set_low, bool restore, u32 target_dop) {return 0;}
+extern int hold_cpdsp_in_reset(void);
+/*
+* NOTE: should be very careful about the ddr test ranges
+*/
+int do_uboot_mem_test(u32 ddr_end_addr, u32 sec_ddr_start, u32 sec_ddr_end)
+{
+ int i, ret = DDR_TEST_PASS;
+ u32 malloc_bufs[CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN];
+ u32 reg_sp = 0x100000;
+ u32 nr_test_array = ARRAY_SIZE(ddr_test_ranges);
+ u32 obm_test_res;
+
+ p_asr_flag = get_asr_flag();
+
+ printf("mem test: asr flag header: %x\n", p_asr_flag->header);
+ if(p_asr_flag->header != ASRFLAG_HEADER) {
+ printf("!!!! asr flag error\n");
+ return 1;
+ }
+
+ printf("asr flag ddrt_state: %x\n", p_asr_flag->ddrt_state.value);
+
+ if (p_asr_flag->ddrt_state.bits.test_proc != 1)
+ return 1;
+
+ if (ddr_test_is_done_obm(&obm_test_res)) {
+ if (obm_test_res == DDR_TEST_FAIL) {
+ printf("DDR test in OBM failed\n");
+ p_asr_flag->ddrt_state.bits.total_times++;
+ p_asr_flag->ddrt_state.bits.fail_times++;
+ ret = DDR_TEST_FAIL;
+ goto finalize_result;
+ } else {
+ printf("DDR test in OBM PASS\n");
+ }
+ } else {
+ printf("No ddr test in OBM\n");
+ }
+
+ /* hold cp/dsp in reset to stop running in ddr */
+ hold_cpdsp_in_reset();
+
+ /* initially set fail res to avoid sw panic during test */
+ p_asr_flag->ddrt_state.bits.total_times++;
+ p_asr_flag->ddrt_state.bits.fail_times++;
+ p_asr_flag->ddrt_state.bits.test_proc = 0; /* to avoid endless reboot */
+ p_asr_flag->ddrt_state.bits.last_res = 1; /* fail */
+ asr_flag_update();
+
+#ifdef CONFIG_TEE_OS
+ for (i = 0; i < ARRAY_SIZE(ddr_test_ranges); i++) {
+ if (ddr_test_ranges[i].ddr_mtest_end == CONFIG_SEC_DDR_ADDR_BEGIN)
+ ddr_test_ranges[i].ddr_mtest_end = sec_ddr_start;
+
+ if (ddr_test_ranges[i].ddr_mtest_end == CONFIG_DDR_ADDR_END)
+ ddr_test_ranges[i].ddr_mtest_end = ddr_end_addr;
+
+ if (ddr_test_ranges[i].ddr_mtest_begin == CONFIG_SEC_DDR_ADDR_END)
+ ddr_test_ranges[i].ddr_mtest_begin = sec_ddr_end;
+ }
+#else
+ for (i = 0; i < ARRAY_SIZE(ddr_test_ranges); i++) {
+ if (ddr_test_ranges[i].ddr_mtest_end == CONFIG_DDR_ADDR_END)
+ ddr_test_ranges[i].ddr_mtest_end = ddr_end_addr;
+ }
+#endif
+
+ for (i = 0; i < ARRAY_SIZE(ddr_test_ranges); i++) {
+ ret = asr_ddr_pattern_test(ddr_test_ranges[i].ddr_mtest_begin,
+ ddr_test_ranges[i].ddr_mtest_end - ddr_test_ranges[i].ddr_mtest_begin);
+ if (DDR_TEST_FAIL == ret) {
+ break;
+ }
+ }
+
+ if (i == ARRAY_SIZE(ddr_test_ranges) && (ret == DDR_TEST_PASS)) {
+
+ for (i = 0; i < (CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN); i++)
+ malloc_bufs[i] = 0;
+
+ for (i = 0; i < (CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN); i++) {
+ malloc_bufs[i] = memalign(4, SINGLE_MALLOC_LEN);
+ printf("malloc_buf[%d]: 0x%08x, size: 0x%08x\n", i, malloc_bufs[i], SINGLE_MALLOC_LEN);
+ if (malloc_bufs[i]) {
+ ret = asr_ddr_pattern_test(malloc_bufs[i], SINGLE_MALLOC_LEN);
+ if (DDR_TEST_FAIL == ret) {
+ printf("!!!%s: ddr test failed in mallc buffer\n", __func__);
+ break;
+ }
+ } else {
+ ret = DDR_TEST_PASS;
+ printf("%s: no malloc buffer available now\n", __func__);
+ break;
+ }
+ }
+
+ for (i = 0; i < (CONFIG_SYS_LONG_MALLOC_LEN / SINGLE_MALLOC_LEN); i++) {
+ if (malloc_bufs[i]) {
+ printf("free buf[%d]: 0x%08x\n", i, malloc_bufs[i]);
+ free(malloc_bufs[i]);
+ }
+ }
+
+ } else {
+ ret = DDR_TEST_FAIL;
+ }
+
+ /* cpu low + ddr 266 */
+ if (DDR_TEST_PASS == ret) {
+ switch_low_pp_and_dvc(1, 0, 0);
+ ret = asr_ddr_pattern_test(ddr_test_ranges[nr_test_array - 1].ddr_mtest_end - LOW_PP_TEST_SIZE, LOW_PP_TEST_SIZE);
+ if (DDR_TEST_FAIL == ret) {
+ printf("!!!%s: low ddr-266 test failed\n", __func__);
+ } else {
+ ret = DDR_TEST_PASS;
+ }
+ switch_low_pp_and_dvc(0, 1, 0);
+ }
+
+ /* cpu low + ddr 533 */
+ if (DDR_TEST_PASS == ret) {
+ switch_low_pp_and_dvc(1, 0, 1);
+ ret = asr_ddr_pattern_test(ddr_test_ranges[nr_test_array - 1].ddr_mtest_end - LOW_PP_TEST_SIZE, LOW_PP_TEST_SIZE);
+ if (DDR_TEST_FAIL == ret) {
+ printf("!!!%s: low ddr-533 test failed\n", __func__);
+ } else {
+ ret = DDR_TEST_PASS;
+ }
+ switch_low_pp_and_dvc(0, 1, 1);
+ }
+
+ if (DDR_TEST_PASS == ret) {
+ __asm__ __volatile__("mov %0, sp":"=r"(reg_sp)::"memory");
+ printf("cpu sp: 0x%x\n", reg_sp);
+ reg_sp -= 0x8000; /* leave 32KB gap */
+ reg_sp &= ~(0x8000 - 1);
+ printf("cpu sp: 0x%x\n", reg_sp);
+ if (((CONFIG_SYS_TEXT_BASE - 0x8000) < reg_sp) && (reg_sp < CONFIG_SYS_LONG_RELOC_END)) {
+ ret = asr_ddr_pattern_test((CONFIG_SYS_TEXT_BASE - 0x8000), reg_sp - (CONFIG_SYS_TEXT_BASE - 0x8000));
+ if (DDR_TEST_FAIL == ret) {
+ printf("!!!%s: ddr test failed in stack area\n", __func__);
+ } else {
+ ret = DDR_TEST_PASS;
+ }
+ }
+ }
+
+finalize_result:
+ if (DDR_TEST_FAIL == ret) {
+ printf("!!!%s: total test FAIL\n", __func__);
+ p_asr_flag->ddrt_state.bits.last_res = 1; /* fail */
+ p_asr_flag->ddrt_state.bits.test_proc = 0; /* clear */
+ } else {
+ printf("$$$%s: total test PASS\n", __func__);
+ p_asr_flag->ddrt_state.bits.last_res = 0; /* pass */
+ p_asr_flag->ddrt_state.bits.test_proc = 0; /* clear */
+ p_asr_flag->ddrt_state.bits.fail_times--;
+ }
+ printf("asr flag ddrt_state: %x\n", p_asr_flag->ddrt_state.value);
+ asr_flag_update();
+ printf("reset cpu\n");
+ run_command("reset", 0);
+ udelay(1000 * 1000);
+ printf("error: sys reset failed\n");
+}
+
+static int do_devtest(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ ulong addr, ddr_len, count, i, ret;
+
+ if ((argc < 3) || (argc > 5))
+ return CMD_RET_USAGE;
+
+ addr = simple_strtoul(argv[1], NULL, 16);
+
+ /* Get the length to test.
+ */
+ ddr_len = simple_strtoul(argv[2], NULL, 16);
+
+ /* loop Count */
+ if (argc == 4) {
+ count = simple_strtoul(argv[3], NULL, 16);
+ } else {
+ count = 1;
+ }
+
+ for (i = 0; i < count; i++) {
+ ret = asr_ddr_pattern_test(addr, ddr_len);
+ if (DDR_TEST_FAIL == ret) {
+ printf("ddr test FAIL\n");
+ break;
+ }
+ }
+ return 0;
+}
+
+U_BOOT_CMD(
+ devtest, 4, 0, do_devtest,
+ "ddr device test cmd\n",
+ "devtest addr len loops"
+);
+