diff options
-rw-r--r-- | arch/x86/kernel/cpu/amd.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/amd_64.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/cpu.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 13 | ||||
-rw-r--r-- | arch/x86/pci/Makefile_32 | 1 | ||||
-rw-r--r-- | arch/x86/pci/amd_bus.c | 32 | ||||
-rw-r--r-- | arch/x86/pci/direct.c | 16 | ||||
-rw-r--r-- | arch/x86/pci/pci.h | 1 | ||||
-rw-r--r-- | include/asm-x86/cpufeature.h | 2 |
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 | ||
274 | static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 *c, unsigned int size) | 271 | static 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 | ||
11 | extern int __cpuinit get_model_name(struct cpuinfo_x86 *c); | 10 | extern int __cpuinit get_model_name(struct cpuinfo_x86 *c); |
12 | extern void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c); | 11 | extern 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); | |||
39 | extern void display_cacheinfo(struct cpuinfo_x86 *c); | 39 | extern void display_cacheinfo(struct cpuinfo_x86 *c); |
40 | 40 | ||
41 | #endif /* CONFIG_X86_32 */ | 41 | #endif /* CONFIG_X86_32 */ |
42 | |||
43 | extern 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 | |||
142 | void __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 | |||
22 | pci-$(CONFIG_NUMA) += mp_bus_to_node.o | 22 | pci-$(CONFIG_NUMA) += mp_bus_to_node.o |
23 | 23 | ||
24 | obj-y += $(pci-y) common.o early.o | 24 | obj-y += $(pci-y) common.o early.o |
25 | obj-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 | ||
528 | postcore_initcall(early_fill_mp_bus_info); | 532 | postcore_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 | |||
540 | static 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 | |||
550 | static 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 | |||
560 | postcore_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 | ||
278 | int __init pci_direct_probe(void) | 280 | int __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 | ||
31 | extern unsigned int pci_probe; | 32 | extern unsigned int pci_probe; |
32 | extern unsigned long pirq_table_addr; | 33 | extern 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 |