home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / x86 / include / asm / topology.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.7 KB  |  260 lines

  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. /* Node not present */
  39. #define NUMA_NO_NODE    (-1)
  40.  
  41. #ifdef CONFIG_NUMA
  42. #include <linux/cpumask.h>
  43. #include <asm/mpspec.h>
  44.  
  45. #ifdef CONFIG_X86_32
  46.  
  47. /* Mappings between node number and cpus on that node. */
  48. extern cpumask_t node_to_cpumask_map[];
  49.  
  50. /* Mappings between logical cpu number and node number */
  51. extern int cpu_to_node_map[];
  52.  
  53. /* Returns the number of the node containing CPU 'cpu' */
  54. static inline int cpu_to_node(int cpu)
  55. {
  56.     return cpu_to_node_map[cpu];
  57. }
  58. #define early_cpu_to_node(cpu)    cpu_to_node(cpu)
  59.  
  60. /* Returns a bitmask of CPUs on Node 'node'.
  61.  *
  62.  * Side note: this function creates the returned cpumask on the stack
  63.  * so with a high NR_CPUS count, excessive stack space is used.  The
  64.  * node_to_cpumask_ptr function should be used whenever possible.
  65.  */
  66. static inline cpumask_t node_to_cpumask(int node)
  67. {
  68.     return node_to_cpumask_map[node];
  69. }
  70.  
  71. #else /* CONFIG_X86_64 */
  72.  
  73. /* Mappings between node number and cpus on that node. */
  74. extern cpumask_t *node_to_cpumask_map;
  75.  
  76. /* Mappings between logical cpu number and node number */
  77. DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map);
  78.  
  79. /* Returns the number of the current Node. */
  80. #define numa_node_id()        read_pda(nodenumber)
  81.  
  82. #ifdef CONFIG_DEBUG_PER_CPU_MAPS
  83. extern int cpu_to_node(int cpu);
  84. extern int early_cpu_to_node(int cpu);
  85. extern const cpumask_t *_node_to_cpumask_ptr(int node);
  86. extern cpumask_t node_to_cpumask(int node);
  87.  
  88. #else    /* !CONFIG_DEBUG_PER_CPU_MAPS */
  89.  
  90. /* Returns the number of the node containing CPU 'cpu' */
  91. static inline int cpu_to_node(int cpu)
  92. {
  93.     return per_cpu(x86_cpu_to_node_map, cpu);
  94. }
  95.  
  96. /* Same function but used if called before per_cpu areas are setup */
  97. static inline int early_cpu_to_node(int cpu)
  98. {
  99.     if (early_per_cpu_ptr(x86_cpu_to_node_map))
  100.         return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu];
  101.  
  102.     return per_cpu(x86_cpu_to_node_map, cpu);
  103. }
  104.  
  105. /* Returns a pointer to the cpumask of CPUs on Node 'node'. */
  106. static inline const cpumask_t *_node_to_cpumask_ptr(int node)
  107. {
  108.     return &node_to_cpumask_map[node];
  109. }
  110.  
  111. /* Returns a bitmask of CPUs on Node 'node'. */
  112. static inline cpumask_t node_to_cpumask(int node)
  113. {
  114.     return node_to_cpumask_map[node];
  115. }
  116.  
  117. #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */
  118.  
  119. /* Replace default node_to_cpumask_ptr with optimized version */
  120. #define node_to_cpumask_ptr(v, node)        \
  121.         const cpumask_t *v = _node_to_cpumask_ptr(node)
  122.  
  123. #define node_to_cpumask_ptr_next(v, node)    \
  124.                v = _node_to_cpumask_ptr(node)
  125.  
  126. #endif /* CONFIG_X86_64 */
  127.  
  128. /*
  129.  * Returns the number of the node containing Node 'node'. This
  130.  * architecture is flat, so it is a pretty simple function!
  131.  */
  132. #define parent_node(node) (node)
  133.  
  134. #define pcibus_to_node(bus) __pcibus_to_node(bus)
  135. #define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus)
  136.  
  137. #ifdef CONFIG_X86_32
  138. extern unsigned long node_start_pfn[];
  139. extern unsigned long node_end_pfn[];
  140. extern unsigned long node_remap_size[];
  141. #define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid])
  142.  
  143. # define SD_CACHE_NICE_TRIES    1
  144. # define SD_IDLE_IDX        1
  145. # define SD_NEWIDLE_IDX        2
  146. # define SD_FORKEXEC_IDX    0
  147.  
  148. #else
  149.  
  150. # define SD_CACHE_NICE_TRIES    2
  151. # define SD_IDLE_IDX        2
  152. # define SD_NEWIDLE_IDX        2
  153. # define SD_FORKEXEC_IDX    1
  154.  
  155. #endif
  156.  
  157. /* sched_domains SD_NODE_INIT for NUMA machines */
  158. #define SD_NODE_INIT (struct sched_domain) {        \
  159.     .min_interval        = 8,            \
  160.     .max_interval        = 32,            \
  161.     .busy_factor        = 32,            \
  162.     .imbalance_pct        = 125,            \
  163.     .cache_nice_tries    = SD_CACHE_NICE_TRIES,    \
  164.     .busy_idx        = 3,            \
  165.     .idle_idx        = SD_IDLE_IDX,        \
  166.     .newidle_idx        = SD_NEWIDLE_IDX,    \
  167.     .wake_idx        = 1,            \
  168.     .forkexec_idx        = SD_FORKEXEC_IDX,    \
  169.     .flags            = SD_LOAD_BALANCE    \
  170.                 | SD_BALANCE_EXEC    \
  171.                 | SD_BALANCE_FORK    \
  172.                 | SD_WAKE_AFFINE    \
  173.                 | SD_WAKE_BALANCE    \
  174.                 | SD_SERIALIZE,        \
  175.     .last_balance        = jiffies,        \
  176.     .balance_interval    = 1,            \
  177. }
  178.  
  179. #ifdef CONFIG_X86_64_ACPI_NUMA
  180. extern int __node_distance(int, int);
  181. #define node_distance(a, b) __node_distance(a, b)
  182. #endif
  183.  
  184. #else /* !CONFIG_NUMA */
  185.  
  186. #define numa_node_id()        0
  187. #define    cpu_to_node(cpu)    0
  188. #define    early_cpu_to_node(cpu)    0
  189.  
  190. static inline const cpumask_t *_node_to_cpumask_ptr(int node)
  191. {
  192.     return &cpu_online_map;
  193. }
  194. static inline cpumask_t node_to_cpumask(int node)
  195. {
  196.     return cpu_online_map;
  197. }
  198. static inline int node_to_first_cpu(int node)
  199. {
  200.     return first_cpu(cpu_online_map);
  201. }
  202.  
  203. /* Replace default node_to_cpumask_ptr with optimized version */
  204. #define node_to_cpumask_ptr(v, node)        \
  205.         const cpumask_t *v = _node_to_cpumask_ptr(node)
  206.  
  207. #define node_to_cpumask_ptr_next(v, node)    \
  208.                v = _node_to_cpumask_ptr(node)
  209. #endif
  210.  
  211. #include <asm-generic/topology.h>
  212.  
  213. #ifdef CONFIG_NUMA
  214. /* Returns the number of the first CPU on Node 'node'. */
  215. static inline int node_to_first_cpu(int node)
  216. {
  217.     node_to_cpumask_ptr(mask, node);
  218.     return first_cpu(*mask);
  219. }
  220. #endif
  221.  
  222. extern cpumask_t cpu_coregroup_map(int cpu);
  223.  
  224. #ifdef ENABLE_TOPO_DEFINES
  225. #define topology_physical_package_id(cpu)    (cpu_data(cpu).phys_proc_id)
  226. #define topology_core_id(cpu)            (cpu_data(cpu).cpu_core_id)
  227. #define topology_core_siblings(cpu)        (per_cpu(cpu_core_map, cpu))
  228. #define topology_thread_siblings(cpu)        (per_cpu(cpu_sibling_map, cpu))
  229.  
  230. /* indicates that pointers to the topology cpumask_t maps are valid */
  231. #define arch_provides_topology_pointers        yes
  232. #endif
  233.  
  234. static inline void arch_fix_phys_package_id(int num, u32 slot)
  235. {
  236. }
  237.  
  238. struct pci_bus;
  239. void set_pci_bus_resources_arch_default(struct pci_bus *b);
  240.  
  241. #ifdef CONFIG_SMP
  242. #define mc_capable()    (cpus_weight(per_cpu(cpu_core_map, 0)) != nr_cpu_ids)
  243. #define smt_capable()            (smp_num_siblings > 1)
  244. #endif
  245.  
  246. #ifdef CONFIG_NUMA
  247. extern int get_mp_bus_to_node(int busnum);
  248. extern void set_mp_bus_to_node(int busnum, int node);
  249. #else
  250. static inline int get_mp_bus_to_node(int busnum)
  251. {
  252.     return 0;
  253. }
  254. static inline void set_mp_bus_to_node(int busnum, int node)
  255. {
  256. }
  257. #endif
  258.  
  259. #endif /* _ASM_X86_TOPOLOGY_H */
  260.