1 --- a/arch/mips/ralink/mt7621.c
2 +++ b/arch/mips/ralink/mt7621.c
4 #define MT7621_GPIO_MODE_SDHCI_SHIFT 18
5 #define MT7621_GPIO_MODE_SDHCI_GPIO 1
7 -static void *detect_magic __initdata = detect_memory_region;
8 +#define MT7621_MEM_TEST_PATTERN 0xaa5555aa
10 +static u32 detect_magic __initdata;
12 static struct rt2880_pmx_func uart1_grp[] = { FUNC("uart1", 0, 1, 2) };
13 static struct rt2880_pmx_func i2c_grp[] = { FUNC("i2c", 0, 3, 2) };
14 @@ -142,24 +144,32 @@ static struct clk *__init mt7621_add_sys
18 +static bool __init mt7621_addr_wraparound_test(phys_addr_t size)
20 + void *dm = (void *)KSEG1ADDR(&detect_magic);
21 + if (CPHYSADDR(dm + size) >= MT7621_LOWMEM_MAX_SIZE)
23 + __raw_writel(MT7621_MEM_TEST_PATTERN, dm);
24 + if (__raw_readl(dm) != __raw_readl(dm + size))
26 + __raw_writel(!MT7621_MEM_TEST_PATTERN, dm);
27 + return __raw_readl(dm) == __raw_readl(dm + size);
30 void __init mt7621_memory_detect(void)
32 - void *dm = &detect_magic;
35 - for (size = 32 * SZ_1M; size < 256 * SZ_1M; size <<= 1) {
36 - if (!__builtin_memcmp(dm, dm + size, sizeof(detect_magic)))
38 + for (size = 32 * SZ_1M; size <= 256 * SZ_1M; size <<= 1) {
39 + if (mt7621_addr_wraparound_test(size)) {
40 + memblock_add(MT7621_LOWMEM_BASE, size);
45 - if ((size == 256 * SZ_1M) &&
46 - (CPHYSADDR(dm + size) < MT7621_LOWMEM_MAX_SIZE) &&
47 - __builtin_memcmp(dm, dm + size, sizeof(detect_magic))) {
48 - memblock_add(MT7621_LOWMEM_BASE, MT7621_LOWMEM_MAX_SIZE);
49 - memblock_add(MT7621_HIGHMEM_BASE, MT7621_HIGHMEM_SIZE);
51 - memblock_add(MT7621_LOWMEM_BASE, size);
53 + /* addr doesn't wrap around at dm + 256M, assume 512M memory. */
54 + memblock_add(MT7621_LOWMEM_BASE, MT7621_LOWMEM_MAX_SIZE);
55 + memblock_add(MT7621_HIGHMEM_BASE, MT7621_HIGHMEM_SIZE);
58 void __init ralink_clk_init(void)