aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/cpu/amd.c3
-rw-r--r--arch/x86/kernel/cpu/amd_64.c4
-rw-r--r--arch/x86/kernel/cpu/cpu.h2
-rw-r--r--arch/x86/kernel/setup.c13
-rw-r--r--arch/x86/pci/Makefile_321
-rw-r--r--arch/x86/pci/amd_bus.c32
-rw-r--r--arch/x86/pci/direct.c16
-rw-r--r--arch/x86/pci/pci.h1
-rw-r--r--include/asm-x86/cpufeature.h2
9 files changed, 43 insertions, 31 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index acc891ae5901..81a07ca65d44 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -266,9 +266,6 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
266 266
267 if (cpu_has_xmm2) 267 if (cpu_has_xmm2)
268 set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC); 268 set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC);
269
270 if (c->x86 == 0x10)
271 amd_enable_pci_ext_cfg(c);
272} 269}
273 270
274static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 *c, unsigned int size) 271static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 *c, unsigned int size)
diff --git a/arch/x86/kernel/cpu/amd_64.c b/arch/x86/kernel/cpu/amd_64.c
index f8d20588bde9..250bfe6064af 100644
--- a/arch/x86/kernel/cpu/amd_64.c
+++ b/arch/x86/kernel/cpu/amd_64.c
@@ -6,7 +6,6 @@
6#include <asm/cacheflush.h> 6#include <asm/cacheflush.h>
7 7
8#include <mach_apic.h> 8#include <mach_apic.h>
9#include "cpu.h"
10 9
11extern int __cpuinit get_model_name(struct cpuinfo_x86 *c); 10extern int __cpuinit get_model_name(struct cpuinfo_x86 *c);
12extern void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c); 11extern void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c);
@@ -187,9 +186,6 @@ void __cpuinit init_amd(struct cpuinfo_x86 *c)
187 if (c->x86 == 0x10) 186 if (c->x86 == 0x10)
188 fam10h_check_enable_mmcfg(); 187 fam10h_check_enable_mmcfg();
189 188
190 if (c->x86 == 0x10)
191 amd_enable_pci_ext_cfg(c);
192
193 if (c == &boot_cpu_data && c->x86 >= 0xf && c->x86 <= 0x11) { 189 if (c == &boot_cpu_data && c->x86 >= 0xf && c->x86 <= 0x11) {
194 unsigned long long tseg; 190 unsigned long long tseg;
195 191
diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h
index f5d5bb1b5541..40ad1893fe87 100644
--- a/arch/x86/kernel/cpu/cpu.h
+++ b/arch/x86/kernel/cpu/cpu.h
@@ -39,5 +39,3 @@ extern int get_model_name(struct cpuinfo_x86 *c);
39extern void display_cacheinfo(struct cpuinfo_x86 *c); 39extern void display_cacheinfo(struct cpuinfo_x86 *c);
40 40
41#endif /* CONFIG_X86_32 */ 41#endif /* CONFIG_X86_32 */
42
43extern void __cpuinit amd_enable_pci_ext_cfg(struct cpuinfo_x86 *c);
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 20e14dbef107..6f80b852a196 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -137,16 +137,3 @@ void __init setup_per_cpu_areas(void)
137} 137}
138 138
139#endif 139#endif
140#define ENABLE_CF8_EXT_CFG (1ULL << 46)
141
142void __cpuinit amd_enable_pci_ext_cfg(struct cpuinfo_x86 *c)
143{
144 u64 reg;
145 rdmsrl(MSR_AMD64_NB_CFG, reg);
146 if (!(reg & ENABLE_CF8_EXT_CFG)) {
147 reg |= ENABLE_CF8_EXT_CFG;
148 wrmsrl(MSR_AMD64_NB_CFG, reg);
149 }
150 set_cpu_cap(c, X86_FEATURE_PCI_EXT_CFG);
151}
152
diff --git a/arch/x86/pci/Makefile_32 b/arch/x86/pci/Makefile_32
index 89ec35d00efd..f647e7e56da4 100644
--- a/arch/x86/pci/Makefile_32
+++ b/arch/x86/pci/Makefile_32
@@ -22,3 +22,4 @@ pci-$(CONFIG_X86_NUMAQ) := numa.o irq.o
22pci-$(CONFIG_NUMA) += mp_bus_to_node.o 22pci-$(CONFIG_NUMA) += mp_bus_to_node.o
23 23
24obj-y += $(pci-y) common.o early.o 24obj-y += $(pci-y) common.o early.o
25obj-y += amd_bus.o
diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c
index 5c2799c20e47..15f505d3a78e 100644
--- a/arch/x86/pci/amd_bus.c
+++ b/arch/x86/pci/amd_bus.c
@@ -1,5 +1,9 @@
1#include <linux/init.h> 1#include <linux/init.h>
2#include <linux/pci.h> 2#include <linux/pci.h>
3#include "pci.h"
4
5#ifdef CONFIG_X86_64
6
3#include <asm/pci-direct.h> 7#include <asm/pci-direct.h>
4#include <asm/mpspec.h> 8#include <asm/mpspec.h>
5#include <linux/cpumask.h> 9#include <linux/cpumask.h>
@@ -526,3 +530,31 @@ static int __init early_fill_mp_bus_info(void)
526} 530}
527 531
528postcore_initcall(early_fill_mp_bus_info); 532postcore_initcall(early_fill_mp_bus_info);
533
534#endif
535
536/* common 32/64 bit code */
537
538#define ENABLE_CF8_EXT_CFG (1ULL << 46)
539
540static void enable_pci_io_ecs_per_cpu(void *unused)
541{
542 u64 reg;
543 rdmsrl(MSR_AMD64_NB_CFG, reg);
544 if (!(reg & ENABLE_CF8_EXT_CFG)) {
545 reg |= ENABLE_CF8_EXT_CFG;
546 wrmsrl(MSR_AMD64_NB_CFG, reg);
547 }
548}
549
550static int __init enable_pci_io_ecs(void)
551{
552 /* assume all cpus from fam10h have IO ECS */
553 if (boot_cpu_data.x86 < 0x10)
554 return 0;
555 on_each_cpu(enable_pci_io_ecs_per_cpu, NULL, 1, 1);
556 pci_probe |= PCI_HAS_IO_ECS;
557 return 0;
558}
559
560postcore_initcall(enable_pci_io_ecs);
diff --git a/arch/x86/pci/direct.c b/arch/x86/pci/direct.c
index 27d61b63def6..9915293500fb 100644
--- a/arch/x86/pci/direct.c
+++ b/arch/x86/pci/direct.c
@@ -265,14 +265,16 @@ void __init pci_direct_init(int type)
265 type); 265 type);
266 if (type == 1) { 266 if (type == 1) {
267 raw_pci_ops = &pci_direct_conf1; 267 raw_pci_ops = &pci_direct_conf1;
268 if (!raw_pci_ext_ops && cpu_has_pci_ext_cfg) { 268 if (raw_pci_ext_ops)
269 printk(KERN_INFO "PCI: Using configuration type 1 " 269 return;
270 "for extended access\n"); 270 if (!(pci_probe & PCI_HAS_IO_ECS))
271 raw_pci_ext_ops = &pci_direct_conf1; 271 return;
272 } 272 printk(KERN_INFO "PCI: Using configuration type 1 "
273 } else { 273 "for extended access\n");
274 raw_pci_ops = &pci_direct_conf2; 274 raw_pci_ext_ops = &pci_direct_conf1;
275 return;
275 } 276 }
277 raw_pci_ops = &pci_direct_conf2;
276} 278}
277 279
278int __init pci_direct_probe(void) 280int __init pci_direct_probe(void)
diff --git a/arch/x86/pci/pci.h b/arch/x86/pci/pci.h
index f3972b12c60a..fd53db50eeeb 100644
--- a/arch/x86/pci/pci.h
+++ b/arch/x86/pci/pci.h
@@ -27,6 +27,7 @@
27#define PCI_CAN_SKIP_ISA_ALIGN 0x8000 27#define PCI_CAN_SKIP_ISA_ALIGN 0x8000
28#define PCI_USE__CRS 0x10000 28#define PCI_USE__CRS 0x10000
29#define PCI_CHECK_ENABLE_AMD_MMCONF 0x20000 29#define PCI_CHECK_ENABLE_AMD_MMCONF 0x20000
30#define PCI_HAS_IO_ECS 0x40000
30 31
31extern unsigned int pci_probe; 32extern unsigned int pci_probe;
32extern unsigned long pirq_table_addr; 33extern unsigned long pirq_table_addr;
diff --git a/include/asm-x86/cpufeature.h b/include/asm-x86/cpufeature.h
index 40fcbba00f15..0d609c837a41 100644
--- a/include/asm-x86/cpufeature.h
+++ b/include/asm-x86/cpufeature.h
@@ -79,7 +79,6 @@
79#define X86_FEATURE_REP_GOOD (3*32+16) /* rep microcode works well on this CPU */ 79#define X86_FEATURE_REP_GOOD (3*32+16) /* rep microcode works well on this CPU */
80#define X86_FEATURE_MFENCE_RDTSC (3*32+17) /* Mfence synchronizes RDTSC */ 80#define X86_FEATURE_MFENCE_RDTSC (3*32+17) /* Mfence synchronizes RDTSC */
81#define X86_FEATURE_LFENCE_RDTSC (3*32+18) /* Lfence synchronizes RDTSC */ 81#define X86_FEATURE_LFENCE_RDTSC (3*32+18) /* Lfence synchronizes RDTSC */
82#define X86_FEATURE_PCI_EXT_CFG (3*32+19) /* PCI extended cfg access */
83 82
84/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ 83/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
85#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ 84#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */
@@ -188,7 +187,6 @@ extern const char * const x86_power_flags[32];
188#define cpu_has_gbpages boot_cpu_has(X86_FEATURE_GBPAGES) 187#define cpu_has_gbpages boot_cpu_has(X86_FEATURE_GBPAGES)
189#define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON) 188#define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON)
190#define cpu_has_pat boot_cpu_has(X86_FEATURE_PAT) 189#define cpu_has_pat boot_cpu_has(X86_FEATURE_PAT)
191#define cpu_has_pci_ext_cfg boot_cpu_has(X86_FEATURE_PCI_EXT_CFG)
192 190
193#if defined(CONFIG_X86_INVLPG) || defined(CONFIG_X86_64) 191#if defined(CONFIG_X86_INVLPG) || defined(CONFIG_X86_64)
194# define cpu_has_invlpg 1 192# define cpu_has_invlpg 1