diff options
Diffstat (limited to 'arch/x86/kernel/cpu/amd.c')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 49 | 
1 files changed, 33 insertions, 16 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index b13ed393dfc..46ae4f65fc7 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -1,5 +1,6 @@  #include <linux/init.h>  #include <linux/bitops.h> +#include <linux/elf.h>  #include <linux/mm.h>  #include <linux/io.h> @@ -410,8 +411,38 @@ static void __cpuinit early_init_amd_mc(struct cpuinfo_x86 *c)  #endif  } +static void __cpuinit bsp_init_amd(struct cpuinfo_x86 *c) +{ +	if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { + +		if (c->x86 > 0x10 || +		    (c->x86 == 0x10 && c->x86_model >= 0x2)) { +			u64 val; + +			rdmsrl(MSR_K7_HWCR, val); +			if (!(val & BIT(24))) +				printk(KERN_WARNING FW_BUG "TSC doesn't count " +					"with P0 frequency!\n"); +		} +	} + +	if (c->x86 == 0x15) { +		unsigned long upperbit; +		u32 cpuid, assoc; + +		cpuid	 = cpuid_edx(0x80000005); +		assoc	 = cpuid >> 16 & 0xff; +		upperbit = ((cpuid >> 24) << 10) / assoc; + +		va_align.mask	  = (upperbit - 1) & PAGE_MASK; +		va_align.flags    = ALIGN_VA_32 | ALIGN_VA_64; +	} +} +  static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)  { +	u32 dummy; +  	early_init_amd_mc(c);  	/* @@ -442,22 +473,7 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)  	}  #endif -	/* We need to do the following only once */ -	if (c != &boot_cpu_data) -		return; - -	if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { - -		if (c->x86 > 0x10 || -		    (c->x86 == 0x10 && c->x86_model >= 0x2)) { -			u64 val; - -			rdmsrl(MSR_K7_HWCR, val); -			if (!(val & BIT(24))) -				printk(KERN_WARNING FW_BUG "TSC doesn't count " -					"with P0 frequency!\n"); -		} -	} +	rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);  }  static void __cpuinit init_amd(struct cpuinfo_x86 *c) @@ -679,6 +695,7 @@ static const struct cpu_dev __cpuinitconst amd_cpu_dev = {  	.c_size_cache	= amd_size_cache,  #endif  	.c_early_init   = early_init_amd, +	.c_bsp_init	= bsp_init_amd,  	.c_init		= init_amd,  	.c_x86_vendor	= X86_VENDOR_AMD,  };  |