aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Ostrovsky <boris.ostrovsky@amd.com>2013-01-29 16:32:49 -0500
committerH. Peter Anvin <hpa@linux.intel.com>2013-01-31 16:35:38 -0500
commitf0322bd341fd63261527bf84afd3272bcc2e8dd3 (patch)
tree40138ddb8827ab5945c8d13b5ae731bc92018443
parent6bf08a8dcd1ef13e542f08fc3b1ce6cf64ae63b6 (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.h1
-rw-r--r--arch/x86/kernel/cpu/amd.c21
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);