forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/arch/mips/sgi-ip27/ip27-memory.c
....@@ -18,7 +18,6 @@
1818 #include <linux/export.h>
1919 #include <linux/nodemask.h>
2020 #include <linux/swap.h>
21
-#include <linux/bootmem.h>
2221 #include <linux/pfn.h>
2322 #include <linux/highmem.h>
2423 #include <asm/page.h>
....@@ -26,43 +25,30 @@
2625 #include <asm/sections.h>
2726
2827 #include <asm/sn/arch.h>
29
-#include <asm/sn/hub.h>
28
+#include <asm/sn/agent.h>
3029 #include <asm/sn/klconfig.h>
31
-#include <asm/sn/sn_private.h>
3230
31
+#include "ip27-common.h"
3332
3433 #define SLOT_PFNSHIFT (SLOT_SHIFT - PAGE_SHIFT)
3534 #define PFN_NASIDSHFT (NASID_SHFT - PAGE_SHIFT)
3635
37
-struct node_data *__node_data[MAX_COMPACT_NODES];
36
+struct node_data *__node_data[MAX_NUMNODES];
3837
3938 EXPORT_SYMBOL(__node_data);
4039
41
-static int fine_mode;
42
-
43
-static int is_fine_dirmode(void)
40
+static u64 gen_region_mask(void)
4441 {
45
- return ((LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_REGIONSIZE_MASK) >> NSRI_REGIONSIZE_SHFT) & REGIONSIZE_FINE;
46
-}
42
+ int region_shift;
43
+ u64 region_mask;
44
+ nasid_t nasid;
4745
48
-static hubreg_t get_region(cnodeid_t cnode)
49
-{
50
- if (fine_mode)
51
- return COMPACT_TO_NASID_NODEID(cnode) >> NASID_TO_FINEREG_SHFT;
52
- else
53
- return COMPACT_TO_NASID_NODEID(cnode) >> NASID_TO_COARSEREG_SHFT;
54
-}
46
+ region_shift = get_region_shift();
47
+ region_mask = 0;
48
+ for_each_online_node(nasid)
49
+ region_mask |= BIT_ULL(nasid >> region_shift);
5550
56
-static hubreg_t region_mask;
57
-
58
-static void gen_region_mask(hubreg_t *region_mask)
59
-{
60
- cnodeid_t cnode;
61
-
62
- (*region_mask) = 0;
63
- for_each_online_node(cnode) {
64
- (*region_mask) |= 1ULL << get_region(cnode);
65
- }
51
+ return region_mask;
6652 }
6753
6854 #define rou_rflag rou_flags
....@@ -105,23 +91,18 @@
10591 router_a->rou_rflag = 0;
10692 }
10793
108
-unsigned char __node_distances[MAX_COMPACT_NODES][MAX_COMPACT_NODES];
94
+unsigned char __node_distances[MAX_NUMNODES][MAX_NUMNODES];
10995 EXPORT_SYMBOL(__node_distances);
11096
11197 static int __init compute_node_distance(nasid_t nasid_a, nasid_t nasid_b)
11298 {
11399 klrou_t *router, *router_a = NULL, *router_b = NULL;
114100 lboard_t *brd, *dest_brd;
115
- cnodeid_t cnode;
116101 nasid_t nasid;
117102 int port;
118103
119104 /* Figure out which routers nodes in question are connected to */
120
- for_each_online_node(cnode) {
121
- nasid = COMPACT_TO_NASID_NODEID(cnode);
122
-
123
- if (nasid == -1) continue;
124
-
105
+ for_each_online_node(nasid) {
125106 brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid),
126107 KLTYPE_ROUTER);
127108
....@@ -154,42 +135,39 @@
154135 } while ((brd = find_lboard_class(KLCF_NEXT(brd), KLTYPE_ROUTER)));
155136 }
156137
157
- if (router_a == NULL) {
158
- printk("node_distance: router_a NULL\n");
159
- return -1;
160
- }
161
- if (router_b == NULL) {
162
- printk("node_distance: router_b NULL\n");
163
- return -1;
164
- }
165
-
166138 if (nasid_a == nasid_b)
167
- return 0;
139
+ return LOCAL_DISTANCE;
168140
169141 if (router_a == router_b)
170
- return 1;
142
+ return LOCAL_DISTANCE + 1;
143
+
144
+ if (router_a == NULL) {
145
+ pr_info("node_distance: router_a NULL\n");
146
+ return 255;
147
+ }
148
+ if (router_b == NULL) {
149
+ pr_info("node_distance: router_b NULL\n");
150
+ return 255;
151
+ }
171152
172153 router_distance = 100;
173154 router_recurse(router_a, router_b, 2);
174155
175
- return router_distance;
156
+ return LOCAL_DISTANCE + router_distance;
176157 }
177158
178159 static void __init init_topology_matrix(void)
179160 {
180
- nasid_t nasid, nasid2;
181
- cnodeid_t row, col;
161
+ nasid_t row, col;
182162
183
- for (row = 0; row < MAX_COMPACT_NODES; row++)
184
- for (col = 0; col < MAX_COMPACT_NODES; col++)
163
+ for (row = 0; row < MAX_NUMNODES; row++)
164
+ for (col = 0; col < MAX_NUMNODES; col++)
185165 __node_distances[row][col] = -1;
186166
187167 for_each_online_node(row) {
188
- nasid = COMPACT_TO_NASID_NODEID(row);
189168 for_each_online_node(col) {
190
- nasid2 = COMPACT_TO_NASID_NODEID(col);
191169 __node_distances[row][col] =
192
- compute_node_distance(nasid, nasid2);
170
+ compute_node_distance(row, col);
193171 }
194172 }
195173 }
....@@ -197,31 +175,26 @@
197175 static void __init dump_topology(void)
198176 {
199177 nasid_t nasid;
200
- cnodeid_t cnode;
201178 lboard_t *brd, *dest_brd;
202179 int port;
203180 int router_num = 0;
204181 klrou_t *router;
205
- cnodeid_t row, col;
182
+ nasid_t row, col;
206183
207
- printk("************** Topology ********************\n");
184
+ pr_info("************** Topology ********************\n");
208185
209
- printk(" ");
186
+ pr_info(" ");
210187 for_each_online_node(col)
211
- printk("%02d ", col);
212
- printk("\n");
188
+ pr_cont("%02d ", col);
189
+ pr_cont("\n");
213190 for_each_online_node(row) {
214
- printk("%02d ", row);
191
+ pr_info("%02d ", row);
215192 for_each_online_node(col)
216
- printk("%2d ", node_distance(row, col));
217
- printk("\n");
193
+ pr_cont("%2d ", node_distance(row, col));
194
+ pr_cont("\n");
218195 }
219196
220
- for_each_online_node(cnode) {
221
- nasid = COMPACT_TO_NASID_NODEID(cnode);
222
-
223
- if (nasid == -1) continue;
224
-
197
+ for_each_online_node(nasid) {
225198 brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid),
226199 KLTYPE_ROUTER);
227200
....@@ -231,7 +204,7 @@
231204 do {
232205 if (brd->brd_flags & DUPLICATE_BOARD)
233206 continue;
234
- printk("Router %d:", router_num);
207
+ pr_cont("Router %d:", router_num);
235208 router_num++;
236209
237210 router = (klrou_t *)NODE_OFFSET_TO_K0(NASID_GET(brd), brd->brd_compts[0]);
....@@ -245,31 +218,27 @@
245218 router->rou_port[port].port_offset);
246219
247220 if (dest_brd->brd_type == KLTYPE_IP27)
248
- printk(" %d", dest_brd->brd_nasid);
221
+ pr_cont(" %d", dest_brd->brd_nasid);
249222 if (dest_brd->brd_type == KLTYPE_ROUTER)
250
- printk(" r");
223
+ pr_cont(" r");
251224 }
252
- printk("\n");
225
+ pr_cont("\n");
253226
254227 } while ( (brd = find_lboard_class(KLCF_NEXT(brd), KLTYPE_ROUTER)) );
255228 }
256229 }
257230
258
-static unsigned long __init slot_getbasepfn(cnodeid_t cnode, int slot)
231
+static unsigned long __init slot_getbasepfn(nasid_t nasid, int slot)
259232 {
260
- nasid_t nasid = COMPACT_TO_NASID_NODEID(cnode);
261
-
262233 return ((unsigned long)nasid << PFN_NASIDSHFT) | (slot << SLOT_PFNSHIFT);
263234 }
264235
265
-static unsigned long __init slot_psize_compute(cnodeid_t node, int slot)
236
+static unsigned long __init slot_psize_compute(nasid_t nasid, int slot)
266237 {
267
- nasid_t nasid;
268238 lboard_t *brd;
269239 klmembnk_t *banks;
270240 unsigned long size;
271241
272
- nasid = COMPACT_TO_NASID_NODEID(node);
273242 /* Find the node board */
274243 brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27);
275244 if (!brd)
....@@ -299,10 +268,10 @@
299268
300269 static void __init mlreset(void)
301270 {
302
- int i;
271
+ u64 region_mask;
272
+ nasid_t nasid;
303273
304274 master_nasid = get_nasid();
305
- fine_mode = is_fine_dirmode();
306275
307276 /*
308277 * Probe for all CPUs - this creates the cpumask and sets up the
....@@ -315,29 +284,21 @@
315284 init_topology_matrix();
316285 dump_topology();
317286
318
- gen_region_mask(&region_mask);
287
+ region_mask = gen_region_mask();
319288
320289 setup_replication_mask();
321290
322291 /*
323292 * Set all nodes' calias sizes to 8k
324293 */
325
- for_each_online_node(i) {
326
- nasid_t nasid;
327
-
328
- nasid = COMPACT_TO_NASID_NODEID(i);
329
-
294
+ for_each_online_node(nasid) {
330295 /*
331296 * Always have node 0 in the region mask, otherwise
332297 * CALIAS accesses get exceptions since the hub
333298 * thinks it is a node 0 address.
334299 */
335300 REMOTE_HUB_S(nasid, PI_REGION_PRESENT, (region_mask | 1));
336
-#ifdef CONFIG_REPLICATE_EXHANDLERS
337
- REMOTE_HUB_S(nasid, PI_CALIAS_SIZE, PI_CALIAS_SIZE_8K);
338
-#else
339301 REMOTE_HUB_S(nasid, PI_CALIAS_SIZE, PI_CALIAS_SIZE_0);
340
-#endif
341302
342303 #ifdef LATER
343304 /*
....@@ -355,7 +316,7 @@
355316 {
356317 unsigned long slot_psize, slot0sz = 0, nodebytes; /* Hack to detect problem configs */
357318 int slot;
358
- cnodeid_t node;
319
+ nasid_t node;
359320
360321 for_each_online_node(node) {
361322 nodebytes = 0;
....@@ -374,7 +335,7 @@
374335
375336 if ((nodebytes >> PAGE_SHIFT) * (sizeof(struct page)) >
376337 (slot0sz << PAGE_SHIFT)) {
377
- printk("Ignoring slot %d onwards on node %d\n",
338
+ pr_info("Ignoring slot %d onwards on node %d\n",
378339 slot, node);
379340 slot = MAX_MEM_SLOTS;
380341 continue;
....@@ -385,11 +346,10 @@
385346 }
386347 }
387348
388
-static void __init node_mem_init(cnodeid_t node)
349
+static void __init node_mem_init(nasid_t node)
389350 {
390351 unsigned long slot_firstpfn = slot_getbasepfn(node, 0);
391352 unsigned long slot_freepfn = node_getfirstfree(node);
392
- unsigned long bootmap_size;
393353 unsigned long start_pfn, end_pfn;
394354
395355 get_pfn_range_for_nid(node, &start_pfn, &end_pfn);
....@@ -400,7 +360,6 @@
400360 __node_data[node] = __va(slot_freepfn << PAGE_SHIFT);
401361 memset(__node_data[node], 0, PAGE_SIZE);
402362
403
- NODE_DATA(node)->bdata = &bootmem_node_data[node];
404363 NODE_DATA(node)->node_start_pfn = start_pfn;
405364 NODE_DATA(node)->node_spanned_pages = end_pfn - start_pfn;
406365
....@@ -409,13 +368,8 @@
409368 slot_freepfn += PFN_UP(sizeof(struct pglist_data) +
410369 sizeof(struct hub_data));
411370
412
- bootmap_size = init_bootmem_node(NODE_DATA(node), slot_freepfn,
413
- start_pfn, end_pfn);
414
- free_bootmem_with_active_regions(node, end_pfn);
415
- reserve_bootmem_node(NODE_DATA(node), slot_firstpfn << PAGE_SHIFT,
416
- ((slot_freepfn - slot_firstpfn) << PAGE_SHIFT) + bootmap_size,
417
- BOOTMEM_DEFAULT);
418
- sparse_memory_present_with_active_regions(node);
371
+ memblock_reserve(slot_firstpfn << PAGE_SHIFT,
372
+ ((slot_freepfn - slot_firstpfn) << PAGE_SHIFT));
419373 }
420374
421375 /*
....@@ -435,12 +389,13 @@
435389 */
436390 void __init prom_meminit(void)
437391 {
438
- cnodeid_t node;
392
+ nasid_t node;
439393
440394 mlreset();
441395 szmem();
396
+ max_low_pfn = PHYS_PFN(memblock_end_of_DRAM());
442397
443
- for (node = 0; node < MAX_COMPACT_NODES; node++) {
398
+ for (node = 0; node < MAX_NUMNODES; node++) {
444399 if (node_online(node)) {
445400 node_mem_init(node);
446401 continue;
....@@ -459,26 +414,16 @@
459414 void __init paging_init(void)
460415 {
461416 unsigned long zones_size[MAX_NR_ZONES] = {0, };
462
- unsigned node;
463417
464418 pagetable_init();
465
-
466
- for_each_online_node(node) {
467
- unsigned long start_pfn, end_pfn;
468
-
469
- get_pfn_range_for_nid(node, &start_pfn, &end_pfn);
470
-
471
- if (end_pfn > max_low_pfn)
472
- max_low_pfn = end_pfn;
473
- }
474419 zones_size[ZONE_NORMAL] = max_low_pfn;
475
- free_area_init_nodes(zones_size);
420
+ free_area_init(zones_size);
476421 }
477422
478423 void __init mem_init(void)
479424 {
480425 high_memory = (void *) __va(get_num_physpages() << PAGE_SHIFT);
481
- free_all_bootmem();
426
+ memblock_free_all();
482427 setup_zero_pages(); /* This comes from node 0 */
483428 mem_init_print_info(NULL);
484429 }