diff options
Diffstat (limited to 'arch/x86/kernel/cpu/amd.c')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 28e5f5956042..63fddcd082cd 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -356,7 +356,7 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)  #endif  #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)  	/* check CPU config space for extended APIC ID */ -	if (c->x86 >= 0xf) { +	if (cpu_has_apic && c->x86 >= 0xf) {  		unsigned int val;  		val = read_pci_config(0, 24, 0, 0x68);  		if ((val & ((1 << 17) | (1 << 18))) == ((1 << 17) | (1 << 18))) @@ -400,6 +400,13 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  		level = cpuid_eax(1);  		if((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)  			set_cpu_cap(c, X86_FEATURE_REP_GOOD); + +		/* +		 * Some BIOSes incorrectly force this feature, but only K8 +		 * revision D (model = 0x14) and later actually support it. +		 */ +		if (c->x86_model < 0x14) +			clear_cpu_cap(c, X86_FEATURE_LAHF_LM);  	}  	if (c->x86 == 0x10 || c->x86 == 0x11)  		set_cpu_cap(c, X86_FEATURE_REP_GOOD);  | 
