hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/arch/mips/sgi-ip22/ip22-mc.c
....@@ -11,6 +11,7 @@
1111 #include <linux/init.h>
1212 #include <linux/export.h>
1313 #include <linux/kernel.h>
14
+#include <linux/memblock.h>
1415 #include <linux/spinlock.h>
1516
1617 #include <asm/io.h>
....@@ -40,70 +41,36 @@
4041 return bank % 2 ? res & 0xffff : res >> 16;
4142 }
4243
43
-struct mem {
44
- unsigned long addr;
45
- unsigned long size;
46
-};
47
-
44
+#if defined(CONFIG_SGI_IP28) || defined(CONFIG_32BIT)
45
+static void __init probe_memory(void)
46
+{
47
+ /* prom detects all usable memory */
48
+}
49
+#else
4850 /*
49
- * Detect installed memory, do some sanity checks and notify kernel about it
51
+ * Detect installed memory, which PROM misses
5052 */
5153 static void __init probe_memory(void)
5254 {
53
- int i, j, found, cnt = 0;
54
- struct mem bank[4];
55
- struct mem space[2] = {{SGIMC_SEG0_BADDR, 0}, {SGIMC_SEG1_BADDR, 0}};
55
+ unsigned long addr, size;
56
+ int i;
5657
5758 printk(KERN_INFO "MC: Probing memory configuration:\n");
58
- for (i = 0; i < ARRAY_SIZE(bank); i++) {
59
+ for (i = 0; i < 4; i++) {
5960 unsigned int tmp = get_bank_config(i);
6061 if (!(tmp & SGIMC_MCONFIG_BVALID))
6162 continue;
6263
63
- bank[cnt].size = get_bank_size(tmp);
64
- bank[cnt].addr = get_bank_addr(tmp);
64
+ size = get_bank_size(tmp);
65
+ addr = get_bank_addr(tmp);
6566 printk(KERN_INFO " bank%d: %3ldM @ %08lx\n",
66
- i, bank[cnt].size / 1024 / 1024, bank[cnt].addr);
67
- cnt++;
67
+ i, size / 1024 / 1024, addr);
68
+
69
+ if (addr >= SGIMC_SEG1_BADDR)
70
+ memblock_add(addr, size);
6871 }
69
-
70
- /* And you thought bubble sort is dead algorithm... */
71
- do {
72
- unsigned long addr, size;
73
-
74
- found = 0;
75
- for (i = 1; i < cnt; i++)
76
- if (bank[i-1].addr > bank[i].addr) {
77
- addr = bank[i].addr;
78
- size = bank[i].size;
79
- bank[i].addr = bank[i-1].addr;
80
- bank[i].size = bank[i-1].size;
81
- bank[i-1].addr = addr;
82
- bank[i-1].size = size;
83
- found = 1;
84
- }
85
- } while (found);
86
-
87
- /* Figure out how are memory banks mapped into spaces */
88
- for (i = 0; i < cnt; i++) {
89
- found = 0;
90
- for (j = 0; j < ARRAY_SIZE(space) && !found; j++)
91
- if (space[j].addr + space[j].size == bank[i].addr) {
92
- space[j].size += bank[i].size;
93
- found = 1;
94
- }
95
- /* There is either hole or overlapping memory */
96
- if (!found)
97
- printk(KERN_CRIT "MC: Memory configuration mismatch "
98
- "(%08lx), expect Bus Error soon\n",
99
- bank[i].addr);
100
- }
101
-
102
- for (i = 0; i < ARRAY_SIZE(space); i++)
103
- if (space[i].size)
104
- add_memory_region(space[i].addr, space[i].size,
105
- BOOT_MEM_RAM);
10672 }
73
+#endif
10774
10875 void __init sgimc_init(void)
10976 {
....@@ -205,10 +172,9 @@
205172 probe_memory();
206173 }
207174
208
-void __init prom_meminit(void) {}
209
-void __init prom_free_prom_memory(void)
210
-{
211175 #ifdef CONFIG_SGI_IP28
176
+void __init prom_cleanup(void)
177
+{
212178 u32 mconfig1;
213179 unsigned long flags;
214180 spinlock_t lock;
....@@ -233,5 +199,5 @@
233199 sgimc->mconfig1 = mconfig1;
234200 iob();
235201 spin_unlock_irqrestore(&lock, flags);
236
-#endif
237202 }
203
+#endif