1 #ifndef _ASM_POWERPC_TOPOLOGY_H 2 #define _ASM_POWERPC_TOPOLOGY_H 3 #ifdef __KERNEL__ 4 5 6 struct device; 7 struct device_node; 8 9 #ifdef CONFIG_NUMA 10 11 /* 12 * Before going off node we want the VM to try and reclaim from the local 13 * node. It does this if the remote distance is larger than RECLAIM_DISTANCE. 14 * With the default REMOTE_DISTANCE of 20 and the default RECLAIM_DISTANCE of 15 * 20, we never reclaim and go off node straight away. 16 * 17 * To fix this we choose a smaller value of RECLAIM_DISTANCE. 18 */ 19 #define RECLAIM_DISTANCE 10 20 21 /* 22 * Avoid creating an extra level of balancing (SD_ALLNODES) on the largest 23 * POWER7 boxes which have a maximum of 32 nodes. 24 */ 25 #define SD_NODES_PER_DOMAIN 32 26 27 #include <asm/mmzone.h> 28 29 static inline int cpu_to_node(int cpu) 30 { 31 return numa_cpu_lookup_table[cpu]; 32 } 33 34 #define parent_node(node) (node) 35 36 #define cpumask_of_node(node) ((node) == -1 ? \ 37 cpu_all_mask : \ 38 node_to_cpumask_map[node]) 39 40 struct pci_bus; 41 #ifdef CONFIG_PCI 42 extern int pcibus_to_node(struct pci_bus *bus); 43 #else 44 static inline int pcibus_to_node(struct pci_bus *bus) 45 { 46 return -1; 47 } 48 #endif 49 50 #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ 51 cpu_all_mask : \ 52 cpumask_of_node(pcibus_to_node(bus))) 53 54 /* sched_domains SD_NODE_INIT for PPC64 machines */ 55 #define SD_NODE_INIT (struct sched_domain) { \ 56 .min_interval = 8, \ 57 .max_interval = 32, \ 58 .busy_factor = 32, \ 59 .imbalance_pct = 125, \ 60 .cache_nice_tries = 1, \ 61 .busy_idx = 3, \ 62 .idle_idx = 1, \ 63 .newidle_idx = 0, \ 64 .wake_idx = 0, \ 65 .forkexec_idx = 0, \ 66 \ 67 .flags = 1*SD_LOAD_BALANCE \ 68 | 0*SD_BALANCE_NEWIDLE \ 69 | 1*SD_BALANCE_EXEC \ 70 | 1*SD_BALANCE_FORK \ 71 | 0*SD_BALANCE_WAKE \ 72 | 1*SD_WAKE_AFFINE \ 73 | 0*SD_PREFER_LOCAL \ 74 | 0*SD_SHARE_CPUPOWER \ 75 | 0*SD_POWERSAVINGS_BALANCE \ 76 | 0*SD_SHARE_PKG_RESOURCES \ 77 | 1*SD_SERIALIZE \ 78 | 0*SD_PREFER_SIBLING \ 79 , \ 80 .last_balance = jiffies, \ 81 .balance_interval = 1, \ 82 } 83 84 extern int __node_distance(int, int); 85 #define node_distance(a, b) __node_distance(a, b) 86 87 extern void __init dump_numa_cpu_topology(void); 88 89 extern int sysfs_add_device_to_node(struct device *dev, int nid); 90 extern void sysfs_remove_device_from_node(struct device *dev, int nid); 91 92 #else 93 94 static inline void dump_numa_cpu_topology(void) {} 95 96 static inline int sysfs_add_device_to_node(struct device *dev, int nid) 97 { 98 return 0; 99 } 100 101 static inline void sysfs_remove_device_from_node(struct device *dev, 102 int nid) 103 { 104 } 105 #endif /* CONFIG_NUMA */ 106 107 #if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR) 108 extern int start_topology_update(void); 109 extern int stop_topology_update(void); 110 #else 111 static inline int start_topology_update(void) 112 { 113 return 0; 114 } 115 static inline int stop_topology_update(void) 116 { 117 return 0; 118 } 119 #endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */ 120 121 #include <asm-generic/topology.h> 122 123 #ifdef CONFIG_SMP 124 #include <asm/cputable.h> 125 #define smt_capable() (cpu_has_feature(CPU_FTR_SMT)) 126 127 #ifdef CONFIG_PPC64 128 #include <asm/smp.h> 129 130 #define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) 131 #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) 132 #define topology_core_id(cpu) (cpu_to_core_id(cpu)) 133 #endif 134 #endif 135 136 #endif /* __KERNEL__ */ 137 #endif /* _ASM_POWERPC_TOPOLOGY_H */ 138