49 lines
1.7 KiB
Diff
49 lines
1.7 KiB
Diff
|
# HG changeset patch
|
||
|
# User Andreas Herrmann <andreas.herrmann3@amd.com>
|
||
|
# Date 1338452142 -7200
|
||
|
# Node ID d7ae665b03afb88a813c6f197612215697eaf8f6
|
||
|
# Parent a120d24f90fb5e94244331e530aacf5b0ea86f25
|
||
|
x86/amd: re-enable CPU topology extensions in case BIOS has disabled it
|
||
|
|
||
|
BIOS will switch off the corresponding feature flag on family
|
||
|
15h models 10h-1fh non-desktop CPUs.
|
||
|
|
||
|
The topology extension CPUID leafs are required to detect which
|
||
|
cores belong to the same compute unit. (thread siblings mask is
|
||
|
set accordingly and also correct information about L1i and L2
|
||
|
cache sharing depends on this).
|
||
|
|
||
|
W/o this patch we wouldn't see which cores belong to the same
|
||
|
compute unit and also cache sharing information for L1i and L2
|
||
|
would be incorrect on such systems.
|
||
|
|
||
|
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
|
||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||
|
Committed-by: Jan Beulich <jbeulich@suse.com>
|
||
|
|
||
|
--- a/xen/arch/x86/cpu/amd.c
|
||
|
+++ b/xen/arch/x86/cpu/amd.c
|
||
|
@@ -612,6 +612,21 @@ static void __devinit init_amd(struct cp
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ /* re-enable TopologyExtensions if switched off by BIOS */
|
||
|
+ if ((c->x86 == 0x15) &&
|
||
|
+ (c->x86_model >= 0x10) && (c->x86_model <= 0x1f) &&
|
||
|
+ !cpu_has(c, X86_FEATURE_TOPOEXT) &&
|
||
|
+ !rdmsr_safe(MSR_K8_EXT_FEATURE_MASK, value)) {
|
||
|
+ value |= 1ULL << 54;
|
||
|
+ wrmsr_safe(MSR_K8_EXT_FEATURE_MASK, value);
|
||
|
+ rdmsrl(MSR_K8_EXT_FEATURE_MASK, value);
|
||
|
+ if (value & (1ULL << 54)) {
|
||
|
+ set_bit(X86_FEATURE_TOPOEXT, c->x86_capability);
|
||
|
+ printk(KERN_INFO "CPU: Re-enabling disabled "
|
||
|
+ "Topology Extensions Support\n");
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
amd_get_topology(c);
|
||
|
|
||
|
/* Pointless to use MWAIT on Family10 as it does not deep sleep. */
|