diff options
Diffstat (limited to 'arch/x86/kernel/cpu/amd.c')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 29 | 
1 files changed, 24 insertions, 5 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 0a44b90602b..146bb6218ee 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -26,7 +26,8 @@   *	contact AMD for precise details and a CPU swap.   *   *	See	http://www.multimania.com/poulot/k6bug.html - *		http://www.amd.com/K6/k6docs/revgd.html + *	and	section 2.6.2 of "AMD-K6 Processor Revision Guide - Model 6" + *		(Publication # 21266  Issue Date: August 1998)   *   *	The following test is erm.. interesting. AMD neglected to up   *	the chip setting when fixing the bug but they also tweaked some @@ -94,7 +95,6 @@ static void __cpuinit init_amd_k6(struct cpuinfo_x86 *c)  				"system stability may be impaired when more than 32 MB are used.\n");  		else  			printk(KERN_CONT "probably OK (after B9730xxxx).\n"); -		printk(KERN_INFO "Please see http://membres.lycos.fr/poulot/k6bug.html\n");  	}  	/* K6 with old style WHCR */ @@ -353,10 +353,11 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)  		node = per_cpu(cpu_llc_id, cpu);  	/* -	 * If core numbers are inconsistent, it's likely a multi-fabric platform, -	 * so invoke platform-specific handler +	 * On multi-fabric platform (e.g. Numascale NumaChip) a +	 * platform-specific handler needs to be called to fixup some +	 * IDs of the CPU.  	 */ -	if (c->phys_proc_id != node) +	if (x86_cpuinit.fixup_cpu_id)  		x86_cpuinit.fixup_cpu_id(c, node);  	if (!node_online(node)) { @@ -579,6 +580,24 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  		}  	} +	/* re-enable TopologyExtensions if switched off by BIOS */ +	if ((c->x86 == 0x15) && +	    (c->x86_model >= 0x10) && (c->x86_model <= 0x1f) && +	    !cpu_has(c, X86_FEATURE_TOPOEXT)) { +		u64 val; + +		if (!rdmsrl_amd_safe(0xc0011005, &val)) { +			val |= 1ULL << 54; +			wrmsrl_amd_safe(0xc0011005, val); +			rdmsrl(0xc0011005, val); +			if (val & (1ULL << 54)) { +				set_cpu_cap(c, X86_FEATURE_TOPOEXT); +				printk(KERN_INFO FW_INFO "CPU: Re-enabling " +				  "disabled Topology Extensions Support\n"); +			} +		} +	} +  	cpu_detect_cache_sizes(c);  	/* Multi core CPU? */  |