Line data Source code
1 : /*
2 : * Written by: Matthew Dobson, IBM Corporation
3 : *
4 : * Copyright (C) 2002, IBM Corp.
5 : *
6 : * All rights reserved.
7 : *
8 : * This program is free software; you can redistribute it and/or modify
9 : * it under the terms of the GNU General Public License as published by
10 : * the Free Software Foundation; either version 2 of the License, or
11 : * (at your option) any later version.
12 : *
13 : * This program is distributed in the hope that it will be useful, but
14 : * WITHOUT ANY WARRANTY; without even the implied warranty of
15 : * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
16 : * NON INFRINGEMENT. See the GNU General Public License for more
17 : * details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program; if not, write to the Free Software
21 : * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 : *
23 : * Send feedback to <colpatch@us.ibm.com>
24 : */
25 : #ifndef _ASM_X86_TOPOLOGY_H
26 : #define _ASM_X86_TOPOLOGY_H
27 :
28 : #ifdef CONFIG_X86_32
29 : # ifdef CONFIG_X86_HT
30 : # define ENABLE_TOPO_DEFINES
31 : # endif
32 : #else
33 : # ifdef CONFIG_SMP
34 : # define ENABLE_TOPO_DEFINES
35 : # endif
36 : #endif
37 :
38 : /*
39 : * to preserve the visibility of NUMA_NO_NODE definition,
40 : * moved to there from here. May be used independent of
41 : * CONFIG_NUMA.
42 : */
43 : #include <linux/numa.h>
44 :
45 : #ifdef CONFIG_NUMA
46 : #include <linux/cpumask.h>
47 :
48 : #include <asm/mpspec.h>
49 :
50 : #ifdef CONFIG_X86_32
51 :
52 : /* Mappings between logical cpu number and node number */
53 : extern int cpu_to_node_map[];
54 :
55 : /* Returns the number of the node containing CPU 'cpu' */
56 : static inline int cpu_to_node(int cpu)
57 : {
58 : return cpu_to_node_map[cpu];
59 : }
60 : #define early_cpu_to_node(cpu) cpu_to_node(cpu)
61 :
62 : #else /* CONFIG_X86_64 */
63 :
64 : /* Mappings between logical cpu number and node number */
65 : DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map);
66 :
67 : /* Returns the number of the current Node. */
68 : DECLARE_PER_CPU(int, node_number);
69 : #define numa_node_id() percpu_read(node_number)
70 :
71 : #ifdef CONFIG_DEBUG_PER_CPU_MAPS
72 : extern int cpu_to_node(int cpu);
73 : extern int early_cpu_to_node(int cpu);
74 :
75 : #else /* !CONFIG_DEBUG_PER_CPU_MAPS */
76 :
77 : /* Returns the number of the node containing CPU 'cpu' */
78 : static inline int cpu_to_node(int cpu)
79 : {
80 : return per_cpu(x86_cpu_to_node_map, cpu);
81 : }
82 :
83 : /* Same function but used if called before per_cpu areas are setup */
84 : static inline int early_cpu_to_node(int cpu)
85 : {
86 : return early_per_cpu(x86_cpu_to_node_map, cpu);
87 : }
88 :
89 : #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */
90 :
91 : #endif /* CONFIG_X86_64 */
92 :
93 : /* Mappings between node number and cpus on that node. */
94 : extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
95 :
96 : #ifdef CONFIG_DEBUG_PER_CPU_MAPS
97 : extern const struct cpumask *cpumask_of_node(int node);
98 : #else
99 : /* Returns a pointer to the cpumask of CPUs on Node 'node'. */
100 : static inline const struct cpumask *cpumask_of_node(int node)
101 : {
102 : return node_to_cpumask_map[node];
103 : }
104 : #endif
105 :
106 : extern void setup_node_to_cpumask_map(void);
107 :
108 : /*
109 : * Returns the number of the node containing Node 'node'. This
110 : * architecture is flat, so it is a pretty simple function!
111 : */
112 : #define parent_node(node) (node)
113 :
114 : #define pcibus_to_node(bus) __pcibus_to_node(bus)
115 :
116 : #ifdef CONFIG_X86_32
117 : extern unsigned long node_start_pfn[];
118 : extern unsigned long node_end_pfn[];
119 : extern unsigned long node_remap_size[];
120 : #define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid])
121 :
122 : # define SD_CACHE_NICE_TRIES 1
123 : # define SD_IDLE_IDX 1
124 :
125 : #else
126 :
127 : # define SD_CACHE_NICE_TRIES 2
128 : # define SD_IDLE_IDX 2
129 :
130 : #endif
131 :
132 : /* sched_domains SD_NODE_INIT for NUMA machines */
133 : #define SD_NODE_INIT (struct sched_domain) { \
134 : .min_interval = 8, \
135 : .max_interval = 32, \
136 : .busy_factor = 32, \
137 : .imbalance_pct = 125, \
138 : .cache_nice_tries = SD_CACHE_NICE_TRIES, \
139 : .busy_idx = 3, \
140 : .idle_idx = SD_IDLE_IDX, \
141 : .newidle_idx = 0, \
142 : .wake_idx = 0, \
143 : .forkexec_idx = 0, \
144 : \
145 : .flags = 1*SD_LOAD_BALANCE \
146 : | 1*SD_BALANCE_NEWIDLE \
147 : | 1*SD_BALANCE_EXEC \
148 : | 1*SD_BALANCE_FORK \
149 : | 0*SD_BALANCE_WAKE \
150 : | 1*SD_WAKE_AFFINE \
151 : | 0*SD_PREFER_LOCAL \
152 : | 0*SD_SHARE_CPUPOWER \
153 : | 0*SD_POWERSAVINGS_BALANCE \
154 : | 0*SD_SHARE_PKG_RESOURCES \
155 : | 1*SD_SERIALIZE \
156 : | 0*SD_PREFER_SIBLING \
157 : , \
158 : .last_balance = jiffies, \
159 : .balance_interval = 1, \
160 : }
161 :
162 : #ifdef CONFIG_X86_64_ACPI_NUMA
163 : extern int __node_distance(int, int);
164 : #define node_distance(a, b) __node_distance(a, b)
165 : #endif
166 :
167 : #else /* !CONFIG_NUMA */
168 :
169 : static inline int numa_node_id(void)
170 : {
171 : return 0;
172 : }
173 :
174 : static inline int early_cpu_to_node(int cpu)
175 : {
176 : return 0;
177 : }
178 :
179 : static inline void setup_node_to_cpumask_map(void) { }
180 :
181 : #endif
182 :
183 : #include <asm-generic/topology.h>
184 :
185 : extern const struct cpumask *cpu_coregroup_mask(int cpu);
186 :
187 : #ifdef ENABLE_TOPO_DEFINES
188 : #define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id)
189 : #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id)
190 : #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
191 : #define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
192 :
193 : /* indicates that pointers to the topology cpumask_t maps are valid */
194 : #define arch_provides_topology_pointers yes
195 : #endif
196 :
197 : static inline void arch_fix_phys_package_id(int num, u32 slot)
198 : {
199 : }
200 1 :
201 : struct pci_bus;
202 : void x86_pci_root_bus_res_quirks(struct pci_bus *b);
203 :
204 : #ifdef CONFIG_SMP
205 : #define mc_capable() ((boot_cpu_data.x86_max_cores > 1) && \
206 : (cpumask_weight(cpu_core_mask(0)) != nr_cpu_ids))
207 : #define smt_capable() (smp_num_siblings > 1)
208 : #endif
209 :
210 : #ifdef CONFIG_NUMA
211 : extern int get_mp_bus_to_node(int busnum);
212 : extern void set_mp_bus_to_node(int busnum, int node);
213 : #else
214 : static inline int get_mp_bus_to_node(int busnum)
215 : {
216 : return 0;
217 : }
218 : static inline void set_mp_bus_to_node(int busnum, int node)
219 : {
220 : }
221 : #endif
222 :
223 : #endif /* _ASM_X86_TOPOLOGY_H */
|