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_SMP 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 */ 51DECLARE_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 */ 57extern int __cpu_to_node(int cpu); 58#define cpu_to_node __cpu_to_node 59 60extern 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 */ 65static 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. */ 73extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; 74 75#ifdef CONFIG_DEBUG_PER_CPU_MAPS 76extern const struct cpumask *cpumask_of_node(int node); 77#else 78/* Returns a pointer to the cpumask of CPUs on Node 'node'. */ 79static inline const struct cpumask *cpumask_of_node(int node) 80{ 81 return node_to_cpumask_map[node]; 82} 83#endif 84 85extern 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 95extern int __node_distance(int, int); 96#define node_distance(a, b) __node_distance(a, b) 97 98#else /* !CONFIG_NUMA */ 99 100static 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 109static inline int early_cpu_to_node(int cpu) 110{ 111 return 0; 112} 113 114static inline void setup_node_to_cpumask_map(void) { } 115 116#endif 117 118#include <asm-generic/topology.h> 119 120extern const struct cpumask *cpu_coregroup_mask(int cpu); 121 122#define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id) 123#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) 124 125#ifdef ENABLE_TOPO_DEFINES 126#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) 127#define topology_sibling_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) 128#endif 129 130static inline void arch_fix_phys_package_id(int num, u32 slot) 131{ 132} 133 134struct pci_bus; 135int x86_pci_root_bus_node(int bus); 136void x86_pci_root_bus_resources(int bus, struct list_head *resources); 137 138#endif /* _ASM_X86_TOPOLOGY_H */ 139