mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 15:02:32 +00:00
59 lines
1.9 KiB
Diff
59 lines
1.9 KiB
Diff
|
--- a/arch/mips/ralink/mt7621.c
|
||
|
+++ b/arch/mips/ralink/mt7621.c
|
||
|
@@ -56,7 +56,9 @@
|
||
|
#define MT7621_GPIO_MODE_SDHCI_SHIFT 18
|
||
|
#define MT7621_GPIO_MODE_SDHCI_GPIO 1
|
||
|
|
||
|
-static void *detect_magic __initdata = detect_memory_region;
|
||
|
+#define MT7621_MEM_TEST_PATTERN 0xaa5555aa
|
||
|
+
|
||
|
+static u32 detect_magic __initdata;
|
||
|
|
||
|
static struct rt2880_pmx_func uart1_grp[] = { FUNC("uart1", 0, 1, 2) };
|
||
|
static struct rt2880_pmx_func i2c_grp[] = { FUNC("i2c", 0, 3, 2) };
|
||
|
@@ -142,24 +144,32 @@ static struct clk *__init mt7621_add_sys
|
||
|
return clk;
|
||
|
}
|
||
|
|
||
|
+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);
|
||
|
+}
|
||
|
+
|
||
|
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);
|
||
|
- }
|
||
|
+ /* addr doesn't wrap around at dm + 256M, assume 512M memory. */
|
||
|
+ memblock_add(MT7621_LOWMEM_BASE, MT7621_LOWMEM_MAX_SIZE);
|
||
|
+ memblock_add(MT7621_HIGHMEM_BASE, MT7621_HIGHMEM_SIZE);
|
||
|
}
|
||
|
|
||
|
void __init ralink_clk_init(void)
|