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