diff options
Diffstat (limited to 'arch/x86/kernel/cpu/amd.c')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 65 | 
1 files changed, 35 insertions, 30 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 5853e57523e..fa96eb0d02f 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -12,7 +12,6 @@  #include <asm/pci-direct.h>  #ifdef CONFIG_X86_64 -# include <asm/numa_64.h>  # include <asm/mmconfig.h>  # include <asm/cacheflush.h>  #endif @@ -363,9 +362,9 @@ static void __cpuinit amd_detect_cmp(struct cpuinfo_x86 *c)  #endif  } -int amd_get_nb_id(int cpu) +u16 amd_get_nb_id(int cpu)  { -	int id = 0; +	u16 id = 0;  #ifdef CONFIG_SMP  	id = per_cpu(cpu_llc_id, cpu);  #endif @@ -517,10 +516,9 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)  static void __cpuinit init_amd(struct cpuinfo_x86 *c)  {  	u32 dummy; - -#ifdef CONFIG_SMP  	unsigned long long value; +#ifdef CONFIG_SMP  	/*  	 * Disable TLB flush filter by setting HWCR.FFDIS on K8  	 * bit 6 of msr C001_0015 @@ -558,12 +556,10 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  		 * (AMD Erratum #110, docId: 25759).  		 */  		if (c->x86_model < 0x14 && cpu_has(c, X86_FEATURE_LAHF_LM)) { -			u64 val; -  			clear_cpu_cap(c, X86_FEATURE_LAHF_LM); -			if (!rdmsrl_amd_safe(0xc001100d, &val)) { -				val &= ~(1ULL << 32); -				wrmsrl_amd_safe(0xc001100d, val); +			if (!rdmsrl_amd_safe(0xc001100d, &value)) { +				value &= ~(1ULL << 32); +				wrmsrl_amd_safe(0xc001100d, value);  			}  		} @@ -616,13 +612,12 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  	if ((c->x86 == 0x15) &&  	    (c->x86_model >= 0x10) && (c->x86_model <= 0x1f) &&  	    !cpu_has(c, X86_FEATURE_TOPOEXT)) { -		u64 val; -		if (!rdmsrl_safe(0xc0011005, &val)) { -			val |= 1ULL << 54; -			wrmsrl_safe(0xc0011005, val); -			rdmsrl(0xc0011005, val); -			if (val & (1ULL << 54)) { +		if (!rdmsrl_safe(0xc0011005, &value)) { +			value |= 1ULL << 54; +			wrmsrl_safe(0xc0011005, value); +			rdmsrl(0xc0011005, value); +			if (value & (1ULL << 54)) {  				set_cpu_cap(c, X86_FEATURE_TOPOEXT);  				printk(KERN_INFO FW_INFO "CPU: Re-enabling "  				  "disabled Topology Extensions Support\n"); @@ -636,11 +631,10 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  	 */  	if ((c->x86 == 0x15) &&  	    (c->x86_model >= 0x02) && (c->x86_model < 0x20)) { -		u64 val; -		if (!rdmsrl_safe(0xc0011021, &val) && !(val & 0x1E)) { -			val |= 0x1E; -			wrmsrl_safe(0xc0011021, val); +		if (!rdmsrl_safe(0xc0011021, &value) && !(value & 0x1E)) { +			value |= 0x1E; +			wrmsrl_safe(0xc0011021, value);  		}  	} @@ -684,12 +678,10 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  		 * benefit in doing so.  		 */  		if (!rdmsrl_safe(MSR_K8_TSEG_ADDR, &tseg)) { +			unsigned long pfn = tseg >> PAGE_SHIFT; +  			printk(KERN_DEBUG "tseg: %010llx\n", tseg); -			if ((tseg>>PMD_SHIFT) < -				(max_low_pfn_mapped>>(PMD_SHIFT-PAGE_SHIFT)) || -				((tseg>>PMD_SHIFT) < -				(max_pfn_mapped>>(PMD_SHIFT-PAGE_SHIFT)) && -				(tseg>>PMD_SHIFT) >= (1ULL<<(32 - PMD_SHIFT)))) +			if (pfn_range_is_mapped(pfn, pfn + 1))  				set_memory_4k((unsigned long)__va(tseg), 1);  		}  	} @@ -702,13 +694,11 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  	if (c->x86 > 0x11)  		set_cpu_cap(c, X86_FEATURE_ARAT); -	/* -	 * Disable GART TLB Walk Errors on Fam10h. We do this here -	 * because this is always needed when GART is enabled, even in a -	 * kernel which has no MCE support built in. -	 */  	if (c->x86 == 0x10) {  		/* +		 * Disable GART TLB Walk Errors on Fam10h. We do this here +		 * because this is always needed when GART is enabled, even in a +		 * kernel which has no MCE support built in.  		 * BIOS should disable GartTlbWlk Errors themself. If  		 * it doesn't do it here as suggested by the BKDG.  		 * @@ -722,6 +712,21 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  			mask |= (1 << 10);  			wrmsrl_safe(MSR_AMD64_MCx_MASK(4), mask);  		} + +		/* +		 * On family 10h BIOS may not have properly enabled WC+ support, +		 * causing it to be converted to CD memtype. This may result in +		 * performance degradation for certain nested-paging guests. +		 * Prevent this conversion by clearing bit 24 in +		 * MSR_AMD64_BU_CFG2. +		 * +		 * NOTE: we want to use the _safe accessors so as not to #GP kvm +		 * guests on older kvm hosts. +		 */ + +		rdmsrl_safe(MSR_AMD64_BU_CFG2, &value); +		value &= ~(1ULL << 24); +		wrmsrl_safe(MSR_AMD64_BU_CFG2, value);  	}  	rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);  |