|
22 | 22 |
|
23 | 23 | #include "common.h"
|
24 | 24 |
|
25 |
| -static void *detect_magic __initdata = detect_memory_region; |
| 25 | +#define MT7621_MEM_TEST_PATTERN 0xaa5555aa |
| 26 | + |
| 27 | +static u32 detect_magic __initdata; |
26 | 28 |
|
27 | 29 | int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
|
28 | 30 | {
|
@@ -58,24 +60,32 @@ phys_addr_t mips_cpc_default_phys_base(void)
|
58 | 60 | panic("Cannot detect cpc address");
|
59 | 61 | }
|
60 | 62 |
|
| 63 | +static bool __init mt7621_addr_wraparound_test(phys_addr_t size) |
| 64 | +{ |
| 65 | + void *dm = (void *)KSEG1ADDR(&detect_magic); |
| 66 | + |
| 67 | + if (CPHYSADDR(dm + size) >= MT7621_LOWMEM_MAX_SIZE) |
| 68 | + return true; |
| 69 | + __raw_writel(MT7621_MEM_TEST_PATTERN, dm); |
| 70 | + if (__raw_readl(dm) != __raw_readl(dm + size)) |
| 71 | + return false; |
| 72 | + __raw_writel(!MT7621_MEM_TEST_PATTERN, dm); |
| 73 | + return __raw_readl(dm) == __raw_readl(dm + size); |
| 74 | +} |
| 75 | + |
61 | 76 | static void __init mt7621_memory_detect(void)
|
62 | 77 | {
|
63 |
| - void *dm = &detect_magic; |
64 | 78 | phys_addr_t size;
|
65 | 79 |
|
66 |
| - for (size = 32 * SZ_1M; size < 256 * SZ_1M; size <<= 1) { |
67 |
| - if (!__builtin_memcmp(dm, dm + size, sizeof(detect_magic))) |
68 |
| - break; |
| 80 | + for (size = 32 * SZ_1M; size <= 256 * SZ_1M; size <<= 1) { |
| 81 | + if (mt7621_addr_wraparound_test(size)) { |
| 82 | + memblock_add(MT7621_LOWMEM_BASE, size); |
| 83 | + return; |
| 84 | + } |
69 | 85 | }
|
70 | 86 |
|
71 |
| - if ((size == 256 * SZ_1M) && |
72 |
| - (CPHYSADDR(dm + size) < MT7621_LOWMEM_MAX_SIZE) && |
73 |
| - __builtin_memcmp(dm, dm + size, sizeof(detect_magic))) { |
74 |
| - memblock_add(MT7621_LOWMEM_BASE, MT7621_LOWMEM_MAX_SIZE); |
75 |
| - memblock_add(MT7621_HIGHMEM_BASE, MT7621_HIGHMEM_SIZE); |
76 |
| - } else { |
77 |
| - memblock_add(MT7621_LOWMEM_BASE, size); |
78 |
| - } |
| 87 | + memblock_add(MT7621_LOWMEM_BASE, MT7621_LOWMEM_MAX_SIZE); |
| 88 | + memblock_add(MT7621_HIGHMEM_BASE, MT7621_HIGHMEM_SIZE); |
79 | 89 | }
|
80 | 90 |
|
81 | 91 | void __init ralink_of_remap(void)
|
|
0 commit comments