File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/topology.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       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: /* Mappings between logical cpu number and node number */
      51: DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map);
      52: 
      53: #ifdef CONFIG_DEBUG_PER_CPU_MAPS
      54: /*
      55:  * override generic percpu implementation of cpu_to_node
      56:  */
      57: extern int __cpu_to_node(int cpu);
      58: #define cpu_to_node __cpu_to_node
      59: 
      60: extern int early_cpu_to_node(int cpu);
      61: 
      62: #else    /* !CONFIG_DEBUG_PER_CPU_MAPS */
      63: 
      64: /* Same function but used if called before per_cpu areas are setup */
      65: static inline int early_cpu_to_node(int cpu)
      66: {
      67:     return early_per_cpu(x86_cpu_to_node_map, cpu);
      68: }
      69: 
      70: #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */
      71: 
      72: /* Mappings between node number and cpus on that node. */
      73: extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
      74: 
      75: #ifdef CONFIG_DEBUG_PER_CPU_MAPS
      76: extern const struct cpumask *cpumask_of_node(int node);
      77: #else
      78: /* Returns a pointer to the cpumask of CPUs on Node 'node'. */
      79: static inline const struct cpumask *cpumask_of_node(int node)
      80: {
      81:     return node_to_cpumask_map[node];
      82: }
      83: #endif
      84: 
      85: extern void setup_node_to_cpumask_map(void);
      86: 
      87: /*
      88:  * Returns the number of the node containing Node 'node'. This
      89:  * architecture is flat, so it is a pretty simple function!
      90:  */
      91: #define parent_node(node) (node)
      92: 
      93: #define pcibus_to_node(bus) __pcibus_to_node(bus)
      94: 
      95: extern int __node_distance(int, int);
      96: #define node_distance(a, b) __node_distance(a, b)
      97: 
      98: #else /* !CONFIG_NUMA */
      99: 
     100: static inline int numa_node_id(void)
     101: {
     102:     return 0;
     103: }
     104: /*
     105:  * indicate override:
     106:  */
     107: #define numa_node_id numa_node_id
     108: 
     109: static inline int early_cpu_to_node(int cpu)
     110: {
     111:     return 0;
     112: }
     113: 
     114: static inline void setup_node_to_cpumask_map(void) { }
     115: 
     116: #endif
     117: 
     118: #include <asm-generic/topology.h>
     119: 
     120: extern const struct cpumask *cpu_coregroup_mask(int cpu);
     121: 
     122: #ifdef ENABLE_TOPO_DEFINES
     123: #define topology_physical_package_id(cpu)    (cpu_data(cpu).phys_proc_id)
     124: #define topology_core_id(cpu)            (cpu_data(cpu).cpu_core_id)
     125: #define topology_core_cpumask(cpu)        (per_cpu(cpu_core_map, cpu))
     126: #define topology_thread_cpumask(cpu)        (per_cpu(cpu_sibling_map, cpu))
     127: #endif
     128: 
     129: static inline void arch_fix_phys_package_id(int num, u32 slot)
     130: {
     131: }
     132: 
     133: struct pci_bus;
     134: void x86_pci_root_bus_resources(int bus, struct list_head *resources);
     135: 
     136: #ifdef CONFIG_SMP
     137: #define mc_capable()    ((boot_cpu_data.x86_max_cores > 1) && \
     138:             (cpumask_weight(cpu_core_mask(0)) != nr_cpu_ids))
     139: #define smt_capable()            (smp_num_siblings > 1)
     140: #endif
     141: 
     142: #ifdef CONFIG_NUMA
     143: extern int get_mp_bus_to_node(int busnum);
     144: extern void set_mp_bus_to_node(int busnum, int node);
     145: #else
     146: static inline int get_mp_bus_to_node(int busnum)
     147: {
     148:     return 0;
     149: }
     150: static inline void set_mp_bus_to_node(int busnum, int node)
     151: {
     152: }
     153: #endif
     154: 
     155: #endif /* _ASM_X86_TOPOLOGY_H */
     156: