diff options
author | Boris Ostrovsky <boris.ostrovsky@amd.com> | 2013-01-29 16:32:49 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-01-31 16:35:38 -0500 |
commit | f0322bd341fd63261527bf84afd3272bcc2e8dd3 (patch) | |
tree | 40138ddb8827ab5945c8d13b5ae731bc92018443 | |
parent | 6bf08a8dcd1ef13e542f08fc3b1ce6cf64ae63b6 (diff) |
x86, AMD: Enable WC+ memory type on family 10 processors
In some cases BIOS may not enable WC+ memory type on family 10
processors, instead converting what would be WC+ memory to CD type.
On guests using nested pages this could result in performance
degradation. This patch enables WC+.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>
Link: http://lkml.kernel.org/r/1359495169-23278-1-git-send-email-ostr@amd64.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | arch/x86/include/uapi/asm/msr-index.h | 1 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/amd.c | 21 |
2 files changed, 17 insertions, 5 deletions
diff --git a/arch/x86/include/uapi/asm/msr-index.h b/arch/x86/include/uapi/asm/msr-index.h index 433a59fb1a74..158cde98bbc3 100644 --- a/arch/x86/include/uapi/asm/msr-index.h +++ b/arch/x86/include/uapi/asm/msr-index.h | |||
@@ -173,6 +173,7 @@ | |||
173 | #define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 | 173 | #define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 |
174 | #define MSR_AMD64_OSVW_STATUS 0xc0010141 | 174 | #define MSR_AMD64_OSVW_STATUS 0xc0010141 |
175 | #define MSR_AMD64_DC_CFG 0xc0011022 | 175 | #define MSR_AMD64_DC_CFG 0xc0011022 |
176 | #define MSR_AMD64_BU_CFG2 0xc001102a | ||
176 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 | 177 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 |
177 | #define MSR_AMD64_IBSFETCHLINAD 0xc0011031 | 178 | #define MSR_AMD64_IBSFETCHLINAD 0xc0011031 |
178 | #define MSR_AMD64_IBSFETCHPHYSAD 0xc0011032 | 179 | #define MSR_AMD64_IBSFETCHPHYSAD 0xc0011032 |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index dd4a5b685a00..721ef3208eb5 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -698,13 +698,11 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
698 | if (c->x86 > 0x11) | 698 | if (c->x86 > 0x11) |
699 | set_cpu_cap(c, X86_FEATURE_ARAT); | 699 | set_cpu_cap(c, X86_FEATURE_ARAT); |
700 | 700 | ||
701 | /* | ||
702 | * Disable GART TLB Walk Errors on Fam10h. We do this here | ||
703 | * because this is always needed when GART is enabled, even in a | ||
704 | * kernel which has no MCE support built in. | ||
705 | */ | ||
706 | if (c->x86 == 0x10) { | 701 | if (c->x86 == 0x10) { |
707 | /* | 702 | /* |
703 | * Disable GART TLB Walk Errors on Fam10h. We do this here | ||
704 | * because this is always needed when GART is enabled, even in a | ||
705 | * kernel which has no MCE support built in. | ||
708 | * BIOS should disable GartTlbWlk Errors themself. If | 706 | * BIOS should disable GartTlbWlk Errors themself. If |
709 | * it doesn't do it here as suggested by the BKDG. | 707 | * it doesn't do it here as suggested by the BKDG. |
710 | * | 708 | * |
@@ -718,6 +716,19 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
718 | mask |= (1 << 10); | 716 | mask |= (1 << 10); |
719 | wrmsrl_safe(MSR_AMD64_MCx_MASK(4), mask); | 717 | wrmsrl_safe(MSR_AMD64_MCx_MASK(4), mask); |
720 | } | 718 | } |
719 | |||
720 | /* | ||
721 | * On family 10h BIOS may not have properly enabled WC+ support, | ||
722 | * causing it to be converted to CD memtype. This may result in | ||
723 | * performance degradation for certain nested-paging guests. | ||
724 | * Prevent this conversion by clearing bit 24 in | ||
725 | * MSR_AMD64_BU_CFG2. | ||
726 | */ | ||
727 | if (c->x86 == 0x10) { | ||
728 | rdmsrl(MSR_AMD64_BU_CFG2, value); | ||
729 | value &= ~(1ULL << 24); | ||
730 | wrmsrl(MSR_AMD64_BU_CFG2, value); | ||
731 | } | ||
721 | } | 732 | } |
722 | 733 | ||
723 | rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy); | 734 | rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy); |