<p>Tristan Hsieh has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/28436">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mediatek: Refactor memory test code among similar SoCs<br><br>Refactor memory test code which will be reused among similar SoCs.<br><br>BUG=b:80501386<br>BRANCH=none<br>TEST=Boots correctly on Elm<br><br>Change-Id: I800aa9a73f0b4588f46a98c964e2794bdf04f09d<br>Signed-off-by: Tristan Shieh <tristan.shieh@mediatek.com><br>---<br>A src/soc/mediatek/common/memory_test.c<br>M src/soc/mediatek/mt8173/Makefile.inc<br>M src/soc/mediatek/mt8173/include/soc/addressmap.h<br>M src/soc/mediatek/mt8173/include/soc/emi.h<br>M src/soc/mediatek/mt8173/memory.c<br>5 files changed, 314 insertions(+), 312 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/36/28436/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/soc/mediatek/common/memory_test.c b/src/soc/mediatek/common/memory_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..7e22601</span><br><span>--- /dev/null</span><br><span>+++ b/src/soc/mediatek/common/memory_test.c</span><br><span>@@ -0,0 +1,310 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2018 MediaTek Inc.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <soc/emi.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* test patterns */</span><br><span style="color: hsl(120, 100%, 40%);">+   PATTERN0 = 0x00000000,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN1 = 0x5A5A5A5A,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN2 = 0xA5A5A5A5,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN3 = 0xA5A5A500,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN4 = 0xA500A500,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN5 = 0xA5000000,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN6 = 0xFFFF0000,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN7 = 0x0000FFFF,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN8 = 0x00000012,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERN9 = 0x00000034,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERNA = 0x00000056,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERNB = 0x00000078,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERNC = 0x00001234,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERND = 0x00005678,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERNE = 0x12345678,</span><br><span style="color: hsl(120, 100%, 40%);">+        PATTERNF = 0xFFFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int complex_mem_test(u8 *start, unsigned int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned char *mem8_base = (unsigned char *)start;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned short *mem16_base = (unsigned short *)start;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int *mem32_base = (unsigned int *)start;</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int *mem_base = (unsigned int *)start;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned char pattern8;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned short pattern16;</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int i, j, size, pattern32;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int value;</span><br><span style="color: hsl(120, 100%, 40%);">+   uintptr_t p;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        size = len >> 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /*  verify the tied bits (tied high)  */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < size; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+         mem32_base[i] = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERN0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          mem32_base[i] = PATTERNF;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify the tied bits (tied low)  */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERNF)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -2;</span><br><span style="color: hsl(120, 100%, 40%);">+            mem32_base[i] = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify pattern 1 (0x00~0xff)  */</span><br><span style="color: hsl(120, 100%, 40%);">+  pattern8 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+          mem8_base[i] = pattern8++;</span><br><span style="color: hsl(120, 100%, 40%);">+    pattern8 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (mem8_base[i] != pattern8++)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -3;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify pattern 2 (0x00~0xff)  */</span><br><span style="color: hsl(120, 100%, 40%);">+  pattern8 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = j = 0; i < len; i += 2, j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (mem8_base[i] == pattern8)</span><br><span style="color: hsl(120, 100%, 40%);">+                 mem16_base[j] = pattern8;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mem16_base[j] != pattern8)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          pattern8 += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify pattern 3 (0x00~0xffff)  */</span><br><span style="color: hsl(120, 100%, 40%);">+        pattern16 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < (len >> 1); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+             mem16_base[i] = pattern16++;</span><br><span style="color: hsl(120, 100%, 40%);">+  pattern16 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < (len >> 1); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (mem16_base[i] != pattern16++)</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -5;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify pattern 4 (0x00~0xffffffff)  */</span><br><span style="color: hsl(120, 100%, 40%);">+    pattern32 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < (len >> 2); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+             mem32_base[i] = pattern32++;</span><br><span style="color: hsl(120, 100%, 40%);">+  pattern32 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < (len >> 2); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (mem32_base[i] != pattern32++)</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -6;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  pattern 5: filling memory range with 0x12345678  */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < size; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+         mem32_base[i] = PATTERNE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  read check then fill memory with a5a5a5a5 pattern  */</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERNE)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -7;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          mem32_base[i] = PATTERN2;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* read check then fill memory with 00 byte pattern at offset 0h */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERN2)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          mem8_base[i * 4] = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* read check then fill memory with 00 byte pattern at offset 2h */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERN3)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -9;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          mem8_base[i * 4 + 2] = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  read check then fill memory with 00 byte pattern at offset 1h  */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERN4)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -10;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem8_base[i * 4 + 1] = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  read check then fill memory with 00 byte pattern at offset 3h  */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERN5)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -11;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem8_base[i * 4 + 3] = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  read check then fill memory with ffff word pattern at offset 1h */</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERN0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -12;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem16_base[i * 2 + 1] = PATTERN7;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  read check then fill memory with ffff word pattern at offset 0h */</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERN6)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -13;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem16_base[i * 2] = PATTERN7;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  read check  */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mem32_base[i] != PATTERNF)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -14;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  stage 1 => write 0  */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < size; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+         mem_base[i] = PATTERN1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /*  stage 2 => read 0, write 0xf  */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               value = mem_base[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (value != PATTERN1)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -15;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem_base[i] = PATTERN2;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  stage 3 => read 0xf, write 0  */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               value = mem_base[i];</span><br><span style="color: hsl(120, 100%, 40%);">+          if (value != PATTERN2)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -16;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem_base[i] = PATTERN1;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  stage 4 => read 0, write 0xf  */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               value = mem_base[i];</span><br><span style="color: hsl(120, 100%, 40%);">+          if (value != PATTERN1)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -17;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem_base[i] = PATTERN2;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  stage 5 => read 0xf, write 0  */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               value = mem_base[i];</span><br><span style="color: hsl(120, 100%, 40%);">+          if (value != PATTERN2)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -18;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         mem_base[i] = PATTERN1;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  stage 6 => read 0  */</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               value = mem_base[i];</span><br><span style="color: hsl(120, 100%, 40%);">+          if (value != PATTERN1)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -19;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  1/2/4-byte combination test  */</span><br><span style="color: hsl(120, 100%, 40%);">+   p = (uintptr_t)mem_base;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    while (p < (uintptr_t)mem_base + (size << 2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              *((unsigned char *)p) = PATTERNB;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned char *)p) = PATTERNA;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned short *)p) = PATTERNC;</span><br><span style="color: hsl(120, 100%, 40%);">+            p += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned int *)p) = PATTERNE;</span><br><span style="color: hsl(120, 100%, 40%);">+              p += 4;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned short *)p) = PATTERND;</span><br><span style="color: hsl(120, 100%, 40%);">+            p += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned char *)p) = PATTERN9;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned char *)p) = PATTERN8;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned int *)p) = PATTERNE;</span><br><span style="color: hsl(120, 100%, 40%);">+              p += 4;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned char *)p) = PATTERNB;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned char *)p) = PATTERNA;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned short *)p) = PATTERNC;</span><br><span style="color: hsl(120, 100%, 40%);">+            p += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned int *)p) = PATTERNE;</span><br><span style="color: hsl(120, 100%, 40%);">+              p += 4;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned short *)p) = PATTERND;</span><br><span style="color: hsl(120, 100%, 40%);">+            p += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned char *)p) = PATTERN9;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned char *)p) = PATTERN8;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *((unsigned int *)p) = PATTERNE;</span><br><span style="color: hsl(120, 100%, 40%);">+              p += 4;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               value = mem_base[i];</span><br><span style="color: hsl(120, 100%, 40%);">+          if (value != PATTERNE)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -20;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify pattern 1 (0x00~0xff)  */</span><br><span style="color: hsl(120, 100%, 40%);">+  pattern8 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+  mem8_base[0] = pattern8;</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < size * 4; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           unsigned char waddr8, raddr8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               waddr8 = i + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               raddr8 = i;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (i < size * 4 - 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                      mem8_base[waddr8] = pattern8 + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mem8_base[raddr8] != pattern8)</span><br><span style="color: hsl(120, 100%, 40%);">+                    return -21;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         pattern8++;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify pattern 2 (0x00~0xffff)  */</span><br><span style="color: hsl(120, 100%, 40%);">+        pattern16 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+ mem16_base[0] = pattern16;</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < size * 2; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (i < size * 2 - 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                      mem16_base[i + 1] = pattern16 + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (mem16_base[i] != pattern16)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -22;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         pattern16++;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /*  verify pattern 3 (0x00~0xffffffff)  */</span><br><span style="color: hsl(120, 100%, 40%);">+    pattern32 = PATTERN0;</span><br><span style="color: hsl(120, 100%, 40%);">+ mem32_base[0] = pattern32;</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < size; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (i < size - 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  mem32_base[i + 1] = pattern32 + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (mem32_base[i] != pattern32)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -23;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         pattern32++;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/soc/mediatek/mt8173/Makefile.inc b/src/soc/mediatek/mt8173/Makefile.inc</span><br><span>index 20ca610..73048f4 100644</span><br><span>--- a/src/soc/mediatek/mt8173/Makefile.inc</span><br><span>+++ b/src/soc/mediatek/mt8173/Makefile.inc</span><br><span>@@ -59,6 +59,7 @@</span><br><span> romstage-y += pmic_wrap.c mt6391.c</span><br><span> romstage-y += memory.c</span><br><span> romstage-y += emi.c dramc_pi_basic_api.c dramc_pi_calibration_api.c</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-$(CONFIG_MEMORY_TEST) += ../common/memory_test.c</span><br><span> romstage-y += ../common/mmu_operations.c mmu_operations.c</span><br><span> romstage-y += rtc.c</span><br><span> </span><br><span>diff --git a/src/soc/mediatek/mt8173/include/soc/addressmap.h b/src/soc/mediatek/mt8173/include/soc/addressmap.h</span><br><span>index cc1b39d..0ebe3d1 100644</span><br><span>--- a/src/soc/mediatek/mt8173/include/soc/addressmap.h</span><br><span>+++ b/src/soc/mediatek/mt8173/include/soc/addressmap.h</span><br><span>@@ -22,7 +22,6 @@</span><br><span> enum {</span><br><span>   VER_BASE        = 0x08000000,</span><br><span>        IO_PHYS         = 0x10000000,</span><br><span style="color: hsl(0, 100%, 40%);">-   DDR_BASE        = 0x40000000</span><br><span> };</span><br><span> </span><br><span> enum {</span><br><span>diff --git a/src/soc/mediatek/mt8173/include/soc/emi.h b/src/soc/mediatek/mt8173/include/soc/emi.h</span><br><span>index 959e1c9..e3da2e6 100644</span><br><span>--- a/src/soc/mediatek/mt8173/include/soc/emi.h</span><br><span>+++ b/src/soc/mediatek/mt8173/include/soc/emi.h</span><br><span>@@ -145,6 +145,7 @@</span><br><span>      unsigned int dram_freq;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int complex_mem_test(u8 *start, unsigned int len);</span><br><span> void mt_set_emi(const struct mt8173_sdram_params *sdram_params);</span><br><span> void mt_mem_init(const struct mt8173_sdram_params *sdram_params);</span><br><span> const struct mt8173_sdram_params *get_sdram_config(void);</span><br><span>diff --git a/src/soc/mediatek/mt8173/memory.c b/src/soc/mediatek/mt8173/memory.c</span><br><span>index 3897f8b..a02e75e 100644</span><br><span>--- a/src/soc/mediatek/mt8173/memory.c</span><br><span>+++ b/src/soc/mediatek/mt8173/memory.c</span><br><span>@@ -21,316 +21,7 @@</span><br><span> #include <soc/dramc_pi_api.h></span><br><span> #include <soc/emi.h></span><br><span> #include <soc/pll.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">- /* test patterns */</span><br><span style="color: hsl(0, 100%, 40%);">-     PATTERN0 = 0x00000000,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN1 = 0x5A5A5A5A,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN2 = 0xA5A5A5A5,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN3 = 0xA5A5A500,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN4 = 0xA500A500,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN5 = 0xA5000000,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN6 = 0xFFFF0000,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN7 = 0x0000FFFF,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN8 = 0x00000012,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERN9 = 0x00000034,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERNA = 0x00000056,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERNB = 0x00000078,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERNC = 0x00001234,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERND = 0x00005678,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERNE = 0x12345678,</span><br><span style="color: hsl(0, 100%, 40%);">-  PATTERNF = 0xFFFFFFFF</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int complex_mem_test(unsigned int start, unsigned int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned char *mem8_base = (unsigned char *)(uintptr_t)start;</span><br><span style="color: hsl(0, 100%, 40%);">-   unsigned short *mem16_base = (unsigned short *)(uintptr_t)start;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int *mem32_base = (unsigned int *)(uintptr_t)start;</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int *mem_base = (unsigned int *)(uintptr_t)start;</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned char pattern8;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned short pattern16;</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int i, j, size, pattern32;</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int value;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     size = len >> 2;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /*  verify the tied bits (tied high)  */</span><br><span style="color: hsl(0, 100%, 40%);">-        for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         mem32_base[i] = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERN0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem32_base[i] = PATTERNF;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify the tied bits (tied low)  */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERNF) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -2;</span><br><span style="color: hsl(0, 100%, 40%);">-              } else</span><br><span style="color: hsl(0, 100%, 40%);">-                  mem32_base[i] = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify pattern 1 (0x00~0xff)  */</span><br><span style="color: hsl(0, 100%, 40%);">-    pattern8 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < len; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-            mem8_base[i] = pattern8++;</span><br><span style="color: hsl(0, 100%, 40%);">-      pattern8 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (mem8_base[i] != pattern8++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       return -3;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify pattern 2 (0x00~0xff)  */</span><br><span style="color: hsl(0, 100%, 40%);">-    pattern8 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = j = 0; i < len; i += 2, j++) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (mem8_base[i] == pattern8)</span><br><span style="color: hsl(0, 100%, 40%);">-                   mem16_base[j] = pattern8;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (mem16_base[j] != pattern8) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -4;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               pattern8 += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify pattern 3 (0x00~0xffff)  */</span><br><span style="color: hsl(0, 100%, 40%);">-  pattern16 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < (len >> 1); i++)</span><br><span style="color: hsl(0, 100%, 40%);">-               mem16_base[i] = pattern16++;</span><br><span style="color: hsl(0, 100%, 40%);">-    pattern16 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < (len >> 1); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (mem16_base[i] != pattern16++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     return -5;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify pattern 4 (0x00~0xffffffff)  */</span><br><span style="color: hsl(0, 100%, 40%);">-      pattern32 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < (len >> 2); i++)</span><br><span style="color: hsl(0, 100%, 40%);">-               mem32_base[i] = pattern32++;</span><br><span style="color: hsl(0, 100%, 40%);">-    pattern32 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < (len >> 2); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (mem32_base[i] != pattern32++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     return -6;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  pattern 5: filling memory range with 0x12345678  */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < size; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-           mem32_base[i] = PATTERNE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  read check then fill memory with a5a5a5a5 pattern  */</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERNE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -7;</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem32_base[i] = PATTERN2;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* read check then fill memory with 00 byte pattern at offset 0h */</span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERN2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -8;</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem8_base[i * 4] = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* read check then fill memory with 00 byte pattern at offset 2h */</span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERN3) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -9;</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem8_base[i * 4 + 2] = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  read check then fill memory with 00 byte pattern at offset 1h  */</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERN4) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -10;</span><br><span style="color: hsl(0, 100%, 40%);">-             } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem8_base[i * 4 + 1] = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  read check then fill memory with 00 byte pattern at offset 3h  */</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERN5) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -11;</span><br><span style="color: hsl(0, 100%, 40%);">-             } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem8_base[i * 4 + 3] = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  read check then fill memory with ffff word pattern at offset 1h */</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERN0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -12;</span><br><span style="color: hsl(0, 100%, 40%);">-             } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem16_base[i * 2 + 1] = PATTERN7;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  read check then fill memory with ffff word pattern at offset 0h */</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERN6) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -13;</span><br><span style="color: hsl(0, 100%, 40%);">-             } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem16_base[i * 2] = PATTERN7;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  read check  */</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (mem32_base[i] != PATTERNF) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -14;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  stage 1 => write 0  */</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         mem_base[i] = PATTERN1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  stage 2 => read 0, write 0xf  */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         value = mem_base[i];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (value != PATTERN1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -15;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               mem_base[i] = PATTERN2;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  stage 3 => read 0xf, write 0  */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         value = mem_base[i];</span><br><span style="color: hsl(0, 100%, 40%);">-            if (value != PATTERN2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -16;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               mem_base[i] = PATTERN1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  stage 4 => read 0, write 0xf  */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         value = mem_base[i];</span><br><span style="color: hsl(0, 100%, 40%);">-            if (value != PATTERN1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -17;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               mem_base[i] = PATTERN2;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  stage 5 => read 0xf, write 0  */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         value = mem_base[i];</span><br><span style="color: hsl(0, 100%, 40%);">-            if (value != PATTERN2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -18;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               mem_base[i] = PATTERN1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  stage 6 => read 0  */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         value = mem_base[i];</span><br><span style="color: hsl(0, 100%, 40%);">-            if (value != PATTERN1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -19;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  1/2/4-byte combination test  */</span><br><span style="color: hsl(0, 100%, 40%);">-     i = (unsigned int)(uintptr_t)mem_base;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  while (i < (unsigned int)(uintptr_t)mem_base + (size << 2)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          *((unsigned char *)(uintptr_t)i) = PATTERNB;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned char *)(uintptr_t)i) = PATTERNA;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned short *)(uintptr_t)i) = PATTERNC;</span><br><span style="color: hsl(0, 100%, 40%);">-           i += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned int *)(uintptr_t)i) = PATTERNE;</span><br><span style="color: hsl(0, 100%, 40%);">-             i += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned short *)(uintptr_t)i) = PATTERND;</span><br><span style="color: hsl(0, 100%, 40%);">-           i += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned char *)(uintptr_t)i) = PATTERN9;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned char *)(uintptr_t)i) = PATTERN8;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned int *)(uintptr_t)i) = PATTERNE;</span><br><span style="color: hsl(0, 100%, 40%);">-             i += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned char *)(uintptr_t)i) = PATTERNB;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned char *)(uintptr_t)i) = PATTERNA;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned short *)(uintptr_t)i) = PATTERNC;</span><br><span style="color: hsl(0, 100%, 40%);">-           i += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned int *)(uintptr_t)i) = PATTERNE;</span><br><span style="color: hsl(0, 100%, 40%);">-             i += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned short *)(uintptr_t)i) = PATTERND;</span><br><span style="color: hsl(0, 100%, 40%);">-           i += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned char *)(uintptr_t)i) = PATTERN9;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned char *)(uintptr_t)i) = PATTERN8;</span><br><span style="color: hsl(0, 100%, 40%);">-            i += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         *((unsigned int *)(uintptr_t)i) = PATTERNE;</span><br><span style="color: hsl(0, 100%, 40%);">-             i += 4;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         value = mem_base[i];</span><br><span style="color: hsl(0, 100%, 40%);">-            if (value != PATTERNE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -20;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify pattern 1 (0x00~0xff)  */</span><br><span style="color: hsl(0, 100%, 40%);">-    pattern8 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-    mem8_base[0] = pattern8;</span><br><span style="color: hsl(0, 100%, 40%);">-        for (i = 0; i < size * 4; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-             unsigned char waddr8, raddr8;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           waddr8 = i + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         raddr8 = i;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (i < size * 4 - 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem8_base[waddr8] = pattern8 + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (mem8_base[raddr8] != pattern8) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    return -21;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               pattern8++;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify pattern 2 (0x00~0xffff)  */</span><br><span style="color: hsl(0, 100%, 40%);">-  pattern16 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-   mem16_base[0] = pattern16;</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < size * 2; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (i < size * 2 - 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                        mem16_base[i + 1] = pattern16 + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (mem16_base[i] != pattern16) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       return -22;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               pattern16++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  verify pattern 3 (0x00~0xffffffff)  */</span><br><span style="color: hsl(0, 100%, 40%);">-      pattern32 = PATTERN0;</span><br><span style="color: hsl(0, 100%, 40%);">-   mem32_base[0] = pattern32;</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (i < size - 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                    mem32_base[i + 1] = pattern32 + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (mem32_base[i] != pattern32) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       return -23;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               pattern32++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+#include <symbols.h></span><br><span> </span><br><span> void mt_mem_init(const struct mt8173_sdram_params *sdram_params)</span><br><span> {</span><br><span>@@ -348,7 +39,7 @@</span><br><span>              * set memory scan range 0x2000</span><br><span>               * larger test length, longer system boot up time</span><br><span>             */</span><br><span style="color: hsl(0, 100%, 40%);">-             i = complex_mem_test(DDR_BASE, 0x2000);</span><br><span style="color: hsl(120, 100%, 40%);">+               i = complex_mem_test(_dram, 0x2000);</span><br><span> </span><br><span>             printk(BIOS_DEBUG, "[MEM] complex R/W mem test %s : %d\n",</span><br><span>                        (i == 0) ? "pass" : "fail", i);</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/28436">change 28436</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/28436"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I800aa9a73f0b4588f46a98c964e2794bdf04f09d </div>
<div style="display:none"> Gerrit-Change-Number: 28436 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Tristan Hsieh <tristan.shieh@mediatek.com> </div>