]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - arch/mips/ralink/mt7621.c
MIPS: ralink: mt7621: do memory detection on KSEG1
[mirror_ubuntu-jammy-kernel.git] / arch / mips / ralink / mt7621.c
index bd71f5b1423839363e4a549c68e7d21300692141..fd9a872d571389391ebcc2bcf227866ec0c483f5 100644 (file)
 
 #include "common.h"
 
-static void *detect_magic __initdata = detect_memory_region;
+#define MT7621_MEM_TEST_PATTERN         0xaa5555aa
+
+static u32 detect_magic __initdata;
 
 phys_addr_t mips_cpc_default_phys_base(void)
 {
        panic("Cannot detect cpc address");
 }
 
+static bool __init mt7621_addr_wraparound_test(phys_addr_t size)
+{
+       void *dm = (void *)KSEG1ADDR(&detect_magic);
+
+       if (CPHYSADDR(dm + size) >= MT7621_LOWMEM_MAX_SIZE)
+               return true;
+       __raw_writel(MT7621_MEM_TEST_PATTERN, dm);
+       if (__raw_readl(dm) != __raw_readl(dm + size))
+               return false;
+       __raw_writel(!MT7621_MEM_TEST_PATTERN, dm);
+       return __raw_readl(dm) == __raw_readl(dm + size);
+}
+
 static void __init mt7621_memory_detect(void)
 {
-       void *dm = &detect_magic;
        phys_addr_t size;
 
-       for (size = 32 * SZ_1M; size < 256 * SZ_1M; size <<= 1) {
-               if (!__builtin_memcmp(dm, dm + size, sizeof(detect_magic)))
-                       break;
+       for (size = 32 * SZ_1M; size <= 256 * SZ_1M; size <<= 1) {
+               if (mt7621_addr_wraparound_test(size)) {
+                       memblock_add(MT7621_LOWMEM_BASE, size);
+                       return;
+               }
        }
 
-       if ((size == 256 * SZ_1M) &&
-           (CPHYSADDR(dm + size) < MT7621_LOWMEM_MAX_SIZE) &&
-           __builtin_memcmp(dm, dm + size, sizeof(detect_magic))) {
-               memblock_add(MT7621_LOWMEM_BASE, MT7621_LOWMEM_MAX_SIZE);
-               memblock_add(MT7621_HIGHMEM_BASE, MT7621_HIGHMEM_SIZE);
-       } else {
-               memblock_add(MT7621_LOWMEM_BASE, size);
-       }
+       memblock_add(MT7621_LOWMEM_BASE, MT7621_LOWMEM_MAX_SIZE);
+       memblock_add(MT7621_HIGHMEM_BASE, MT7621_HIGHMEM_SIZE);
 }
 
 void __init ralink_of_remap(void)