File: /usr/src/linux/arch/ia64/sn/sn1/discontig.c
1 /*
2 * Copyright 2000, Silicon Graphics, sprasad@engr.sgi.com
3 * Copyright 2000, Kanoj Sarcar, kanoj@sgi.com
4 */
5
6 /*
7 * Contains common definitions and globals for NUMA platform
8 * support. For now, SN-IA64 and SN-MIPS are the NUMA platforms.
9 */
10
11 #include <linux/config.h>
12 #include <linux/kernel.h>
13 #include <linux/mm.h>
14 #include <linux/bootmem.h>
15 #include <asm/sn/mmzone.h>
16 #include <asm/efi.h>
17
18 extern int numnodes ;
19
20 plat_pg_data_t plat_node_data[MAXNODES];
21 bootmem_data_t bdata[MAXNODES];
22 int chunktonid[MAXCHUNKS];
23 int nasid_map[MAXNASIDS];
24
25 void __init
26 init_chunktonid(void)
27 {
28 memset(chunktonid, -1, sizeof(chunktonid)) ;
29 }
30
31 void __init
32 init_nodeidmap(void)
33 {
34 memset(nasid_map, -1, sizeof(nasid_map)) ;
35 }
36
37 int cnodeid_map[MAXNODES] ;
38 void __init
39 init_cnodeidmap(void)
40 {
41 memset(cnodeid_map, -1, sizeof(cnodeid_map)) ;
42 }
43
44 int
45 numa_debug(void)
46 {
47 panic("NUMA debug\n");
48 return(0);
49 }
50
51 int __init
52 build_cnodeid_map(void)
53 {
54 int i,j ;
55
56 for (i=0,j=0;i<MAXNASIDS;i++) {
57 if (nasid_map[i] >= 0)
58 cnodeid_map[j++] = i ;
59 }
60 return j ;
61 }
62
63 /*
64 * Since efi_memmap_walk merges contiguous banks, this code will need
65 * to find all the nasids covered by the input memory descriptor.
66 */
67 static int __init
68 build_nasid_map(unsigned long start, unsigned long end, void *arg)
69 {
70 unsigned long vaddr = start;
71 int nasid = GetNasId(__pa(vaddr));
72
73 while (vaddr < end) {
74 if (nasid < MAXNASIDS)
75 nasid_map[nasid] = 0;
76 else
77 panic("build_nasid_map");
78 vaddr = (unsigned long)__va((unsigned long)(++nasid) <<
79 SN1_NODE_ADDR_SHIFT);
80 }
81 return 0;
82 }
83
84 void __init
85 fix_nasid_map(void)
86 {
87 int i ;
88 int j ;
89
90 /* For every nasid */
91 for (j=0;j<MAXNASIDS;j++) {
92 for (i=0;i<MAXNODES;i++) {
93 if (CNODEID_TO_NASID(i) == j)
94 break ;
95 }
96 if (i<MAXNODES)
97 nasid_map[j] = i ;
98 }
99 }
100
101 static void __init
102 dump_bootmem_info(void)
103 {
104 int i;
105 struct bootmem_data *bdata ;
106
107 printk("CNODE INFO ....\n") ;
108 for (i=0;i<numnodes;i++) {
109 printk("%d ", CNODEID_TO_NASID(i)) ;
110 }
111 printk("\n") ;
112
113 printk("BOOT MEM INFO ....\n") ;
114 printk("Node Start LowPfn BootmemMap\n") ;
115 for (i=0;i<numnodes;i++) {
116 bdata = NODE_DATA(i)->bdata ;
117 printk("%d 0x%016lx 0x%016lx 0x%016lx\n", i,
118 bdata->node_boot_start, bdata->node_low_pfn,
119 (unsigned long)bdata->node_bootmem_map) ;
120 }
121 }
122
123 void __init
124 discontig_mem_init(void)
125 {
126 extern void setup_sn1_bootmem(int);
127 int maxnodes ;
128
129 init_chunktonid() ;
130 init_nodeidmap() ;
131 init_cnodeidmap() ;
132 efi_memmap_walk(build_nasid_map, 0) ;
133 maxnodes = build_cnodeid_map() ;
134 fix_nasid_map() ;
135 #ifdef CONFIG_DISCONTIGMEM
136 setup_sn1_bootmem(maxnodes) ;
137 #endif
138 numnodes = maxnodes;
139 dump_bootmem_info() ;
140 }
141
142 void
143 dump_node_data(void)
144 {
145 int i;
146
147 printk("NODE DATA ....\n") ;
148 printk("Node, Start, Size, MemMap, BitMap, StartP, Mapnr, Size, Id\n") ;
149 for (i=0;i<numnodes;i++) {
150 printk("%d, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, %d\n",
151 CNODEID_TO_NASID(i), NODE_START(i), NODE_SIZE(i),
152 (long)NODE_MEM_MAP(i), (long)NODE_DATA(i)->valid_addr_bitmap,
153 NODE_DATA(i)->node_start_paddr,
154 NODE_DATA(i)->node_start_mapnr,
155 NODE_DATA(i)->node_size,
156 NODE_DATA(i)->node_id) ;
157 }
158 }
159
160