diff options
| -rw-r--r-- | arch/x86/include/asm/k8.h | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel_cacheinfo.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/process.c | 12 | ||||
| -rw-r--r-- | arch/x86/mm/srat_64.c | 3 |
4 files changed, 18 insertions, 6 deletions
diff --git a/arch/x86/include/asm/k8.h b/arch/x86/include/asm/k8.h index f70e60071fe8..af00bd1d2089 100644 --- a/arch/x86/include/asm/k8.h +++ b/arch/x86/include/asm/k8.h | |||
| @@ -16,11 +16,16 @@ extern int k8_numa_init(unsigned long start_pfn, unsigned long end_pfn); | |||
| 16 | extern int k8_scan_nodes(void); | 16 | extern int k8_scan_nodes(void); |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_K8_NB | 18 | #ifdef CONFIG_K8_NB |
| 19 | extern int num_k8_northbridges; | ||
| 20 | |||
| 19 | static inline struct pci_dev *node_to_k8_nb_misc(int node) | 21 | static inline struct pci_dev *node_to_k8_nb_misc(int node) |
| 20 | { | 22 | { |
| 21 | return (node < num_k8_northbridges) ? k8_northbridges[node] : NULL; | 23 | return (node < num_k8_northbridges) ? k8_northbridges[node] : NULL; |
| 22 | } | 24 | } |
| 25 | |||
| 23 | #else | 26 | #else |
| 27 | #define num_k8_northbridges 0 | ||
| 28 | |||
| 24 | static inline struct pci_dev *node_to_k8_nb_misc(int node) | 29 | static inline struct pci_dev *node_to_k8_nb_misc(int node) |
| 25 | { | 30 | { |
| 26 | return NULL; | 31 | return NULL; |
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index b3eeb66c0a51..95962a93f99a 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
| @@ -340,6 +340,10 @@ amd_check_l3_disable(int index, struct _cpuid4_info_regs *this_leaf) | |||
| 340 | (boot_cpu_data.x86_mask < 0x1))) | 340 | (boot_cpu_data.x86_mask < 0x1))) |
| 341 | return; | 341 | return; |
| 342 | 342 | ||
| 343 | /* not in virtualized environments */ | ||
| 344 | if (num_k8_northbridges == 0) | ||
| 345 | return; | ||
| 346 | |||
| 343 | this_leaf->can_disable = true; | 347 | this_leaf->can_disable = true; |
| 344 | this_leaf->l3_indices = amd_calc_l3_indices(); | 348 | this_leaf->l3_indices = amd_calc_l3_indices(); |
| 345 | } | 349 | } |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 28ad9f4d8b94..0415c3ef91b5 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -546,11 +546,13 @@ static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c) | |||
| 546 | * check OSVW bit for CPUs that are not affected | 546 | * check OSVW bit for CPUs that are not affected |
| 547 | * by erratum #400 | 547 | * by erratum #400 |
| 548 | */ | 548 | */ |
| 549 | rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val); | 549 | if (cpu_has(c, X86_FEATURE_OSVW)) { |
| 550 | if (val >= 2) { | 550 | rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val); |
| 551 | rdmsrl(MSR_AMD64_OSVW_STATUS, val); | 551 | if (val >= 2) { |
| 552 | if (!(val & BIT(1))) | 552 | rdmsrl(MSR_AMD64_OSVW_STATUS, val); |
| 553 | goto no_c1e_idle; | 553 | if (!(val & BIT(1))) |
| 554 | goto no_c1e_idle; | ||
| 555 | } | ||
| 554 | } | 556 | } |
| 555 | return 1; | 557 | return 1; |
| 556 | } | 558 | } |
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c index 28c68762648f..38512d0c4742 100644 --- a/arch/x86/mm/srat_64.c +++ b/arch/x86/mm/srat_64.c | |||
| @@ -461,7 +461,8 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes) | |||
| 461 | * node, it must now point to the fake node ID. | 461 | * node, it must now point to the fake node ID. |
| 462 | */ | 462 | */ |
| 463 | for (j = 0; j < MAX_LOCAL_APIC; j++) | 463 | for (j = 0; j < MAX_LOCAL_APIC; j++) |
| 464 | if (apicid_to_node[j] == nid) | 464 | if (apicid_to_node[j] == nid && |
| 465 | fake_apicid_to_node[j] == NUMA_NO_NODE) | ||
| 465 | fake_apicid_to_node[j] = i; | 466 | fake_apicid_to_node[j] = i; |
| 466 | } | 467 | } |
| 467 | for (i = 0; i < num_nodes; i++) | 468 | for (i = 0; i < num_nodes; i++) |
