topology.h 5.8 KB
Newer Older
T
Thomas Gleixner 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * Written by: Matthew Dobson, IBM Corporation
 *
 * Copyright (C) 2002, IBM Corp.
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * Send feedback to <colpatch@us.ibm.com>
 */
H
H. Peter Anvin 已提交
25 26
#ifndef _ASM_X86_TOPOLOGY_H
#define _ASM_X86_TOPOLOGY_H
T
Thomas Gleixner 已提交
27

28 29 30 31 32 33 34 35 36 37
#ifdef CONFIG_X86_32
# ifdef CONFIG_X86_HT
#  define ENABLE_TOPO_DEFINES
# endif
#else
# ifdef CONFIG_SMP
#  define ENABLE_TOPO_DEFINES
# endif
#endif

38 39 40
/* Node not present */
#define NUMA_NO_NODE	(-1)

T
Thomas Gleixner 已提交
41 42 43 44
#ifdef CONFIG_NUMA
#include <linux/cpumask.h>
#include <asm/mpspec.h>

45
#ifdef CONFIG_X86_32
46

47 48
/* Mappings between logical cpu number and node number */
extern int cpu_to_node_map[];
49

T
Thomas Gleixner 已提交
50 51
/* Returns the number of the node containing CPU 'cpu' */
static inline int cpu_to_node(int cpu)
52 53 54
{
	return cpu_to_node_map[cpu];
}
55
#define early_cpu_to_node(cpu)	cpu_to_node(cpu)
56 57

#else /* CONFIG_X86_64 */
58

59 60 61 62
/* Mappings between logical cpu number and node number */
DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map);

/* Returns the number of the current Node. */
63 64
DECLARE_PER_CPU(int, node_number);
#define numa_node_id()		percpu_read(node_number)
65 66 67 68

#ifdef CONFIG_DEBUG_PER_CPU_MAPS
extern int cpu_to_node(int cpu);
extern int early_cpu_to_node(int cpu);
T
Thomas Gleixner 已提交
69

70 71 72
#else	/* !CONFIG_DEBUG_PER_CPU_MAPS */

/* Returns the number of the node containing CPU 'cpu' */
73 74
static inline int cpu_to_node(int cpu)
{
75
	return per_cpu(x86_cpu_to_node_map, cpu);
76
}
77

78 79 80
/* Same function but used if called before per_cpu areas are setup */
static inline int early_cpu_to_node(int cpu)
{
81
	return early_per_cpu(x86_cpu_to_node_map, cpu);
82
}
83

84 85 86
#endif /* !CONFIG_DEBUG_PER_CPU_MAPS */

#endif /* CONFIG_X86_64 */
T
Thomas Gleixner 已提交
87

88
/* Mappings between node number and cpus on that node. */
89
extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
90 91

#ifdef CONFIG_DEBUG_PER_CPU_MAPS
92
extern const struct cpumask *cpumask_of_node(int node);
93
#else
94
/* Returns a pointer to the cpumask of CPUs on Node 'node'. */
95
static inline const struct cpumask *cpumask_of_node(int node)
T
Thomas Gleixner 已提交
96 97 98
{
	return node_to_cpumask_map[node];
}
99
#endif
100

B
Brian Gerst 已提交
101 102
extern void setup_node_to_cpumask_map(void);

103 104 105 106 107 108
/*
 * Returns the number of the node containing Node 'node'. This
 * architecture is flat, so it is a pretty simple function!
 */
#define parent_node(node) (node)

T
Thomas Gleixner 已提交
109 110
#define pcibus_to_node(bus) __pcibus_to_node(bus)

111
#ifdef CONFIG_X86_32
T
Thomas Gleixner 已提交
112 113 114 115 116 117 118 119 120 121
extern unsigned long node_start_pfn[];
extern unsigned long node_end_pfn[];
extern unsigned long node_remap_size[];
#define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid])

# define SD_CACHE_NICE_TRIES	1
# define SD_IDLE_IDX		1
# define SD_NEWIDLE_IDX		2
# define SD_FORKEXEC_IDX	0

122
#else
T
Thomas Gleixner 已提交
123 124 125

# define SD_CACHE_NICE_TRIES	2
# define SD_IDLE_IDX		2
126
# define SD_NEWIDLE_IDX		2
T
Thomas Gleixner 已提交
127 128 129 130
# define SD_FORKEXEC_IDX	1

#endif

I
Ingo Molnar 已提交
131
/* sched_domains SD_NODE_INIT for NUMA machines */
I
Ingo Molnar 已提交
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
#define SD_NODE_INIT (struct sched_domain) {				\
	.min_interval		= 8,					\
	.max_interval		= 32,					\
	.busy_factor		= 32,					\
	.imbalance_pct		= 125,					\
	.cache_nice_tries	= SD_CACHE_NICE_TRIES,			\
	.busy_idx		= 3,					\
	.idle_idx		= SD_IDLE_IDX,				\
	.newidle_idx		= SD_NEWIDLE_IDX,			\
	.wake_idx		= 1,					\
	.forkexec_idx		= SD_FORKEXEC_IDX,			\
									\
	.flags			= 1*SD_LOAD_BALANCE			\
				| 0*SD_BALANCE_NEWIDLE			\
				| 1*SD_BALANCE_EXEC			\
				| 1*SD_BALANCE_FORK			\
				| 0*SD_WAKE_IDLE			\
				| 1*SD_WAKE_AFFINE			\
				| 1*SD_WAKE_BALANCE			\
				| 0*SD_SHARE_CPUPOWER			\
				| 0*SD_POWERSAVINGS_BALANCE		\
				| 0*SD_SHARE_PKG_RESOURCES		\
				| 1*SD_SERIALIZE			\
				| 0*SD_WAKE_IDLE_FAR			\
				| 0*SD_PREFER_SIBLING			\
				,					\
	.last_balance		= jiffies,				\
	.balance_interval	= 1,					\
T
Thomas Gleixner 已提交
160 161 162 163 164 165 166
}

#ifdef CONFIG_X86_64_ACPI_NUMA
extern int __node_distance(int, int);
#define node_distance(a, b) __node_distance(a, b)
#endif

167 168
#else /* !CONFIG_NUMA */

169 170 171 172 173 174 175 176 177 178 179 180 181 182
static inline int numa_node_id(void)
{
	return 0;
}

static inline int cpu_to_node(int cpu)
{
	return 0;
}

static inline int early_cpu_to_node(int cpu)
{
	return 0;
}
183

184
static inline const struct cpumask *cpumask_of_node(int node)
185
{
186
	return cpu_online_mask;
187 188
}

B
Brian Gerst 已提交
189 190
static inline void setup_node_to_cpumask_map(void) { }

T
Thomas Gleixner 已提交
191 192
#endif

193 194
#include <asm-generic/topology.h>

R
Rusty Russell 已提交
195
extern const struct cpumask *cpu_coregroup_mask(int cpu);
T
Thomas Gleixner 已提交
196 197 198 199

#ifdef ENABLE_TOPO_DEFINES
#define topology_physical_package_id(cpu)	(cpu_data(cpu).phys_proc_id)
#define topology_core_id(cpu)			(cpu_data(cpu).cpu_core_id)
200 201
#define topology_core_cpumask(cpu)		(per_cpu(cpu_core_map, cpu))
#define topology_thread_cpumask(cpu)		(per_cpu(cpu_sibling_map, cpu))
202 203 204

/* indicates that pointers to the topology cpumask_t maps are valid */
#define arch_provides_topology_pointers		yes
T
Thomas Gleixner 已提交
205 206
#endif

207 208 209 210
static inline void arch_fix_phys_package_id(int num, u32 slot)
{
}

211
struct pci_bus;
212
void x86_pci_root_bus_res_quirks(struct pci_bus *b);
213

T
Thomas Gleixner 已提交
214
#ifdef CONFIG_SMP
215 216
#define mc_capable()	((boot_cpu_data.x86_max_cores > 1) && \
			(cpumask_weight(cpu_core_mask(0)) != nr_cpu_ids))
T
Thomas Gleixner 已提交
217 218 219
#define smt_capable()			(smp_num_siblings > 1)
#endif

Y
Yinghai Lu 已提交
220 221 222 223 224 225 226 227 228 229 230 231 232
#ifdef CONFIG_NUMA
extern int get_mp_bus_to_node(int busnum);
extern void set_mp_bus_to_node(int busnum, int node);
#else
static inline int get_mp_bus_to_node(int busnum)
{
	return 0;
}
static inline void set_mp_bus_to_node(int busnum, int node)
{
}
#endif

H
H. Peter Anvin 已提交
233
#endif /* _ASM_X86_TOPOLOGY_H */