xref: /openbmc/linux/arch/ia64/kernel/topology.c (revision 87c2ce3b)
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * This file contains NUMA specific variables and functions which can
7  * be split away from DISCONTIGMEM and are used on NUMA machines with
8  * contiguous memory.
9  * 		2002/08/07 Erich Focht <efocht@ess.nec.de>
10  * Populate cpu entries in sysfs for non-numa systems as well
11  *  	Intel Corporation - Ashok Raj
12  */
13 
14 #include <linux/config.h>
15 #include <linux/cpu.h>
16 #include <linux/kernel.h>
17 #include <linux/mm.h>
18 #include <linux/node.h>
19 #include <linux/init.h>
20 #include <linux/bootmem.h>
21 #include <linux/nodemask.h>
22 #include <asm/mmzone.h>
23 #include <asm/numa.h>
24 #include <asm/cpu.h>
25 
26 #ifdef CONFIG_NUMA
27 static struct node *sysfs_nodes;
28 #endif
29 static struct ia64_cpu *sysfs_cpus;
30 
31 int arch_register_cpu(int num)
32 {
33 	struct node *parent = NULL;
34 
35 #ifdef CONFIG_NUMA
36 	parent = &sysfs_nodes[cpu_to_node(num)];
37 #endif /* CONFIG_NUMA */
38 
39 #ifdef CONFIG_ACPI
40 	/*
41 	 * If CPEI cannot be re-targetted, and this is
42 	 * CPEI target, then dont create the control file
43 	 */
44 	if (!can_cpei_retarget() && is_cpu_cpei_target(num))
45 		sysfs_cpus[num].cpu.no_control = 1;
46 #endif
47 
48 	return register_cpu(&sysfs_cpus[num].cpu, num, parent);
49 }
50 
51 #ifdef CONFIG_HOTPLUG_CPU
52 
53 void arch_unregister_cpu(int num)
54 {
55 	struct node *parent = NULL;
56 
57 #ifdef CONFIG_NUMA
58 	int node = cpu_to_node(num);
59 	parent = &sysfs_nodes[node];
60 #endif /* CONFIG_NUMA */
61 
62 	return unregister_cpu(&sysfs_cpus[num].cpu, parent);
63 }
64 EXPORT_SYMBOL(arch_register_cpu);
65 EXPORT_SYMBOL(arch_unregister_cpu);
66 #endif /*CONFIG_HOTPLUG_CPU*/
67 
68 
69 static int __init topology_init(void)
70 {
71 	int i, err = 0;
72 
73 #ifdef CONFIG_NUMA
74 	sysfs_nodes = kmalloc(sizeof(struct node) * MAX_NUMNODES, GFP_KERNEL);
75 	if (!sysfs_nodes) {
76 		err = -ENOMEM;
77 		goto out;
78 	}
79 	memset(sysfs_nodes, 0, sizeof(struct node) * MAX_NUMNODES);
80 
81 	/* MCD - Do we want to register all ONLINE nodes, or all POSSIBLE nodes? */
82 	for_each_online_node(i)
83 		if ((err = register_node(&sysfs_nodes[i], i, 0)))
84 			goto out;
85 #endif
86 
87 	sysfs_cpus = kmalloc(sizeof(struct ia64_cpu) * NR_CPUS, GFP_KERNEL);
88 	if (!sysfs_cpus) {
89 		err = -ENOMEM;
90 		goto out;
91 	}
92 	memset(sysfs_cpus, 0, sizeof(struct ia64_cpu) * NR_CPUS);
93 
94 	for_each_present_cpu(i)
95 		if((err = arch_register_cpu(i)))
96 			goto out;
97 out:
98 	return err;
99 }
100 
101 __initcall(topology_init);
102