aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/kernel/mce_amd.c10
-rw-r--r--arch/x86_64/kernel/pci-gart.c3
-rw-r--r--arch/x86_64/kernel/setup.c27
-rw-r--r--arch/x86_64/kernel/smpboot.c14
-rw-r--r--include/asm-x86_64/processor.h4
-rw-r--r--include/asm-x86_64/smp.h2
-rw-r--r--include/asm-x86_64/topology.h6
7 files changed, 29 insertions, 37 deletions
diff --git a/arch/x86_64/kernel/mce_amd.c b/arch/x86_64/kernel/mce_amd.c
index d13b241ad094..86e1e022b20e 100644
--- a/arch/x86_64/kernel/mce_amd.c
+++ b/arch/x86_64/kernel/mce_amd.c
@@ -115,7 +115,7 @@ void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c)
115 per_cpu(bank_map, cpu) |= (1 << bank); 115 per_cpu(bank_map, cpu) |= (1 << bank);
116 116
117#ifdef CONFIG_SMP 117#ifdef CONFIG_SMP
118 if (shared_bank[bank] && cpu_core_id[cpu]) 118 if (shared_bank[bank] && c->cpu_core_id)
119 continue; 119 continue;
120#endif 120#endif
121 121
@@ -323,10 +323,10 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, int bank)
323 struct threshold_bank *b = NULL; 323 struct threshold_bank *b = NULL;
324 324
325#ifdef CONFIG_SMP 325#ifdef CONFIG_SMP
326 if (cpu_core_id[cpu] && shared_bank[bank]) { /* symlink */ 326 if (cpu_data[cpu].cpu_core_id && shared_bank[bank]) { /* symlink */
327 char name[16]; 327 char name[16];
328 unsigned lcpu = first_cpu(cpu_core_map[cpu]); 328 unsigned lcpu = first_cpu(cpu_core_map[cpu]);
329 if (cpu_core_id[lcpu]) 329 if (cpu_data[lcpu].cpu_core_id)
330 goto out; /* first core not up yet */ 330 goto out; /* first core not up yet */
331 331
332 b = per_cpu(threshold_banks, lcpu)[bank]; 332 b = per_cpu(threshold_banks, lcpu)[bank];
@@ -434,7 +434,7 @@ static __cpuinit int threshold_create_symlinks(unsigned int cpu)
434 int bank, err = 0; 434 int bank, err = 0;
435 unsigned int lcpu = 0; 435 unsigned int lcpu = 0;
436 436
437 if (cpu_core_id[cpu]) 437 if (cpu_data[cpu].cpu_core_id)
438 return 0; 438 return 0;
439 for_each_cpu_mask(lcpu, cpu_core_map[cpu]) { 439 for_each_cpu_mask(lcpu, cpu_core_map[cpu]) {
440 if (lcpu == cpu) 440 if (lcpu == cpu)
@@ -455,7 +455,7 @@ static __cpuinit void threshold_remove_symlinks(unsigned int cpu)
455{ 455{
456 int bank; 456 int bank;
457 unsigned int lcpu = 0; 457 unsigned int lcpu = 0;
458 if (cpu_core_id[cpu]) 458 if (cpu_data[cpu].cpu_core_id)
459 return; 459 return;
460 for_each_cpu_mask(lcpu, cpu_core_map[cpu]) { 460 for_each_cpu_mask(lcpu, cpu_core_map[cpu]) {
461 if (lcpu == cpu) 461 if (lcpu == cpu)
diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c
index 9a93954bed37..4ca674d16b09 100644
--- a/arch/x86_64/kernel/pci-gart.c
+++ b/arch/x86_64/kernel/pci-gart.c
@@ -680,9 +680,6 @@ void __init gart_iommu_init(void)
680 dma_ops = &gart_dma_ops; 680 dma_ops = &gart_dma_ops;
681} 681}
682 682
683/* Must execute after PCI subsystem */
684fs_initcall(gart_iommu_init);
685
686void gart_parse_options(char *p) 683void gart_parse_options(char *p)
687{ 684{
688 int arg; 685 int arg;
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
index 04b2d7b92d17..24aa25ee0d7d 100644
--- a/arch/x86_64/kernel/setup.c
+++ b/arch/x86_64/kernel/setup.c
@@ -785,9 +785,9 @@ static int nearby_node(int apicid)
785static void __init amd_detect_cmp(struct cpuinfo_x86 *c) 785static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
786{ 786{
787#ifdef CONFIG_SMP 787#ifdef CONFIG_SMP
788 int cpu = smp_processor_id();
789 unsigned bits; 788 unsigned bits;
790#ifdef CONFIG_NUMA 789#ifdef CONFIG_NUMA
790 int cpu = smp_processor_id();
791 int node = 0; 791 int node = 0;
792 unsigned apicid = hard_smp_processor_id(); 792 unsigned apicid = hard_smp_processor_id();
793#endif 793#endif
@@ -805,12 +805,12 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
805 } 805 }
806 806
807 /* Low order bits define the core id (index of core in socket) */ 807 /* Low order bits define the core id (index of core in socket) */
808 cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1); 808 c->cpu_core_id = c->phys_proc_id & ((1 << bits)-1);
809 /* Convert the APIC ID into the socket ID */ 809 /* Convert the APIC ID into the socket ID */
810 phys_proc_id[cpu] = phys_pkg_id(bits); 810 c->phys_proc_id = phys_pkg_id(bits);
811 811
812#ifdef CONFIG_NUMA 812#ifdef CONFIG_NUMA
813 node = phys_proc_id[cpu]; 813 node = c->phys_proc_id;
814 if (apicid_to_node[apicid] != NUMA_NO_NODE) 814 if (apicid_to_node[apicid] != NUMA_NO_NODE)
815 node = apicid_to_node[apicid]; 815 node = apicid_to_node[apicid];
816 if (!node_online(node)) { 816 if (!node_online(node)) {
@@ -823,7 +823,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
823 but in the same order as the HT nodeids. 823 but in the same order as the HT nodeids.
824 If that doesn't result in a usable node fall back to the 824 If that doesn't result in a usable node fall back to the
825 path for the previous case. */ 825 path for the previous case. */
826 int ht_nodeid = apicid - (phys_proc_id[0] << bits); 826 int ht_nodeid = apicid - (cpu_data[0].phys_proc_id << bits);
827 if (ht_nodeid >= 0 && 827 if (ht_nodeid >= 0 &&
828 apicid_to_node[ht_nodeid] != NUMA_NO_NODE) 828 apicid_to_node[ht_nodeid] != NUMA_NO_NODE)
829 node = apicid_to_node[ht_nodeid]; 829 node = apicid_to_node[ht_nodeid];
@@ -834,7 +834,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
834 numa_set_node(cpu, node); 834 numa_set_node(cpu, node);
835 835
836 printk(KERN_INFO "CPU %d/%x(%d) -> Node %d -> Core %d\n", 836 printk(KERN_INFO "CPU %d/%x(%d) -> Node %d -> Core %d\n",
837 cpu, apicid, c->x86_max_cores, node, cpu_core_id[cpu]); 837 cpu, apicid, c->x86_max_cores, node, c->cpu_core_id);
838#endif 838#endif
839#endif 839#endif
840} 840}
@@ -905,7 +905,6 @@ static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
905#ifdef CONFIG_SMP 905#ifdef CONFIG_SMP
906 u32 eax, ebx, ecx, edx; 906 u32 eax, ebx, ecx, edx;
907 int index_msb, core_bits; 907 int index_msb, core_bits;
908 int cpu = smp_processor_id();
909 908
910 cpuid(1, &eax, &ebx, &ecx, &edx); 909 cpuid(1, &eax, &ebx, &ecx, &edx);
911 910
@@ -926,10 +925,10 @@ static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
926 } 925 }
927 926
928 index_msb = get_count_order(smp_num_siblings); 927 index_msb = get_count_order(smp_num_siblings);
929 phys_proc_id[cpu] = phys_pkg_id(index_msb); 928 c->phys_proc_id = phys_pkg_id(index_msb);
930 929
931 printk(KERN_INFO "CPU: Physical Processor ID: %d\n", 930 printk(KERN_INFO "CPU: Physical Processor ID: %d\n",
932 phys_proc_id[cpu]); 931 c->phys_proc_id);
933 932
934 smp_num_siblings = smp_num_siblings / c->x86_max_cores; 933 smp_num_siblings = smp_num_siblings / c->x86_max_cores;
935 934
@@ -937,12 +936,12 @@ static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
937 936
938 core_bits = get_count_order(c->x86_max_cores); 937 core_bits = get_count_order(c->x86_max_cores);
939 938
940 cpu_core_id[cpu] = phys_pkg_id(index_msb) & 939 c->cpu_core_id = phys_pkg_id(index_msb) &
941 ((1 << core_bits) - 1); 940 ((1 << core_bits) - 1);
942 941
943 if (c->x86_max_cores > 1) 942 if (c->x86_max_cores > 1)
944 printk(KERN_INFO "CPU: Processor Core ID: %d\n", 943 printk(KERN_INFO "CPU: Processor Core ID: %d\n",
945 cpu_core_id[cpu]); 944 c->cpu_core_id);
946 } 945 }
947#endif 946#endif
948} 947}
@@ -1080,7 +1079,7 @@ void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
1080 } 1079 }
1081 1080
1082#ifdef CONFIG_SMP 1081#ifdef CONFIG_SMP
1083 phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff; 1082 c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
1084#endif 1083#endif
1085} 1084}
1086 1085
@@ -1288,9 +1287,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
1288#ifdef CONFIG_SMP 1287#ifdef CONFIG_SMP
1289 if (smp_num_siblings * c->x86_max_cores > 1) { 1288 if (smp_num_siblings * c->x86_max_cores > 1) {
1290 int cpu = c - cpu_data; 1289 int cpu = c - cpu_data;
1291 seq_printf(m, "physical id\t: %d\n", phys_proc_id[cpu]); 1290 seq_printf(m, "physical id\t: %d\n", c->phys_proc_id);
1292 seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[cpu])); 1291 seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[cpu]));
1293 seq_printf(m, "core id\t\t: %d\n", cpu_core_id[cpu]); 1292 seq_printf(m, "core id\t\t: %d\n", c->cpu_core_id);
1294 seq_printf(m, "cpu cores\t: %d\n", c->booted_cores); 1293 seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
1295 } 1294 }
1296#endif 1295#endif
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c
index 06535e7687ce..b1c10b154bfe 100644
--- a/arch/x86_64/kernel/smpboot.c
+++ b/arch/x86_64/kernel/smpboot.c
@@ -63,10 +63,6 @@
63 63
64/* Number of siblings per CPU package */ 64/* Number of siblings per CPU package */
65int smp_num_siblings = 1; 65int smp_num_siblings = 1;
66/* Package ID of each logical CPU */
67u8 phys_proc_id[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
68/* core ID of each logical CPU */
69u8 cpu_core_id[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
70 66
71/* Last level cache ID of each logical CPU */ 67/* Last level cache ID of each logical CPU */
72u8 cpu_llc_id[NR_CPUS] __cpuinitdata = {[0 ... NR_CPUS-1] = BAD_APICID}; 68u8 cpu_llc_id[NR_CPUS] __cpuinitdata = {[0 ... NR_CPUS-1] = BAD_APICID};
@@ -472,8 +468,8 @@ static inline void set_cpu_sibling_map(int cpu)
472 468
473 if (smp_num_siblings > 1) { 469 if (smp_num_siblings > 1) {
474 for_each_cpu_mask(i, cpu_sibling_setup_map) { 470 for_each_cpu_mask(i, cpu_sibling_setup_map) {
475 if (phys_proc_id[cpu] == phys_proc_id[i] && 471 if (c[cpu].phys_proc_id == c[i].phys_proc_id &&
476 cpu_core_id[cpu] == cpu_core_id[i]) { 472 c[cpu].cpu_core_id == c[i].cpu_core_id) {
477 cpu_set(i, cpu_sibling_map[cpu]); 473 cpu_set(i, cpu_sibling_map[cpu]);
478 cpu_set(cpu, cpu_sibling_map[i]); 474 cpu_set(cpu, cpu_sibling_map[i]);
479 cpu_set(i, cpu_core_map[cpu]); 475 cpu_set(i, cpu_core_map[cpu]);
@@ -500,7 +496,7 @@ static inline void set_cpu_sibling_map(int cpu)
500 cpu_set(i, c[cpu].llc_shared_map); 496 cpu_set(i, c[cpu].llc_shared_map);
501 cpu_set(cpu, c[i].llc_shared_map); 497 cpu_set(cpu, c[i].llc_shared_map);
502 } 498 }
503 if (phys_proc_id[cpu] == phys_proc_id[i]) { 499 if (c[cpu].phys_proc_id == c[i].phys_proc_id) {
504 cpu_set(i, cpu_core_map[cpu]); 500 cpu_set(i, cpu_core_map[cpu]);
505 cpu_set(cpu, cpu_core_map[i]); 501 cpu_set(cpu, cpu_core_map[i]);
506 /* 502 /*
@@ -1201,8 +1197,8 @@ static void remove_siblinginfo(int cpu)
1201 cpu_clear(cpu, cpu_sibling_map[sibling]); 1197 cpu_clear(cpu, cpu_sibling_map[sibling]);
1202 cpus_clear(cpu_sibling_map[cpu]); 1198 cpus_clear(cpu_sibling_map[cpu]);
1203 cpus_clear(cpu_core_map[cpu]); 1199 cpus_clear(cpu_core_map[cpu]);
1204 phys_proc_id[cpu] = BAD_APICID; 1200 c[cpu].phys_proc_id = 0;
1205 cpu_core_id[cpu] = BAD_APICID; 1201 c[cpu].cpu_core_id = 0;
1206 cpu_clear(cpu, cpu_sibling_setup_map); 1202 cpu_clear(cpu, cpu_sibling_setup_map);
1207} 1203}
1208 1204
diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h
index e583f0d95209..3b3c1217fe61 100644
--- a/include/asm-x86_64/processor.h
+++ b/include/asm-x86_64/processor.h
@@ -69,7 +69,11 @@ struct cpuinfo_x86 {
69 cpumask_t llc_shared_map; /* cpus sharing the last level cache */ 69 cpumask_t llc_shared_map; /* cpus sharing the last level cache */
70#endif 70#endif
71 __u8 apicid; 71 __u8 apicid;
72#ifdef CONFIG_SMP
72 __u8 booted_cores; /* number of cores as seen by OS */ 73 __u8 booted_cores; /* number of cores as seen by OS */
74 __u8 phys_proc_id; /* Physical Processor id. */
75 __u8 cpu_core_id; /* Core id. */
76#endif
73} ____cacheline_aligned; 77} ____cacheline_aligned;
74 78
75#define X86_VENDOR_INTEL 0 79#define X86_VENDOR_INTEL 0
diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h
index 7686b9b25aef..6805e1feb300 100644
--- a/include/asm-x86_64/smp.h
+++ b/include/asm-x86_64/smp.h
@@ -53,8 +53,6 @@ extern int smp_call_function_single(int cpuid, void (*func) (void *info),
53 53
54extern cpumask_t cpu_sibling_map[NR_CPUS]; 54extern cpumask_t cpu_sibling_map[NR_CPUS];
55extern cpumask_t cpu_core_map[NR_CPUS]; 55extern cpumask_t cpu_core_map[NR_CPUS];
56extern u8 phys_proc_id[NR_CPUS];
57extern u8 cpu_core_id[NR_CPUS];
58extern u8 cpu_llc_id[NR_CPUS]; 56extern u8 cpu_llc_id[NR_CPUS];
59 57
60#define SMP_TRAMPOLINE_BASE 0x6000 58#define SMP_TRAMPOLINE_BASE 0x6000
diff --git a/include/asm-x86_64/topology.h b/include/asm-x86_64/topology.h
index d4009f8dade0..c4e46e7fa7ba 100644
--- a/include/asm-x86_64/topology.h
+++ b/include/asm-x86_64/topology.h
@@ -55,10 +55,8 @@ extern int __node_distance(int, int);
55#endif 55#endif
56 56
57#ifdef CONFIG_SMP 57#ifdef CONFIG_SMP
58#define topology_physical_package_id(cpu) \ 58#define topology_physical_package_id(cpu) (cpu_data[cpu].phys_proc_id)
59 (phys_proc_id[cpu] == BAD_APICID ? -1 : phys_proc_id[cpu]) 59#define topology_core_id(cpu) (cpu_data[cpu].cpu_core_id)
60#define topology_core_id(cpu) \
61 (cpu_core_id[cpu] == BAD_APICID ? 0 : cpu_core_id[cpu])
62#define topology_core_siblings(cpu) (cpu_core_map[cpu]) 60#define topology_core_siblings(cpu) (cpu_core_map[cpu])
63#define topology_thread_siblings(cpu) (cpu_sibling_map[cpu]) 61#define topology_thread_siblings(cpu) (cpu_sibling_map[cpu])
64#endif 62#endif