diff options
Diffstat (limited to 'arch/x86/kernel/cpu/amd.c')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 64 | 
1 files changed, 35 insertions, 29 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 38915fbfae73..22ab408177b2 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -232,8 +232,6 @@ static void init_amd_k7(struct cpuinfo_x86 *c)  		}  	} -	set_cpu_cap(c, X86_FEATURE_K7); -  	/* calling is from identify_secondary_cpu() ? */  	if (!c->cpu_index)  		return; @@ -315,6 +313,13 @@ static void legacy_fixup_core_id(struct cpuinfo_x86 *c)  	c->cpu_core_id %= cus_per_node;  } + +static void amd_get_topology_early(struct cpuinfo_x86 *c) +{ +	if (cpu_has(c, X86_FEATURE_TOPOEXT)) +		smp_num_siblings = ((cpuid_ebx(0x8000001e) >> 8) & 0xff) + 1; +} +  /*   * Fixup core topology information for   * (1) AMD multi-node processors @@ -334,7 +339,6 @@ static void amd_get_topology(struct cpuinfo_x86 *c)  		cpuid(0x8000001e, &eax, &ebx, &ecx, &edx);  		node_id  = ecx & 0xff; -		smp_num_siblings = ((ebx >> 8) & 0xff) + 1;  		if (c->x86 == 0x15)  			c->cu_id = ebx & 0xff; @@ -613,10 +617,19 @@ clear_sev:  static void early_init_amd(struct cpuinfo_x86 *c)  { +	u64 value;  	u32 dummy;  	early_init_amd_mc(c); +#ifdef CONFIG_X86_32 +	if (c->x86 == 6) +		set_cpu_cap(c, X86_FEATURE_K7); +#endif + +	if (c->x86 >= 0xf) +		set_cpu_cap(c, X86_FEATURE_K8); +  	rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);  	/* @@ -683,6 +696,22 @@ static void early_init_amd(struct cpuinfo_x86 *c)  		set_cpu_bug(c, X86_BUG_AMD_E400);  	early_detect_mem_encrypt(c); + +	/* Re-enable TopologyExtensions if switched off by BIOS */ +	if (c->x86 == 0x15 && +	    (c->x86_model >= 0x10 && c->x86_model <= 0x6f) && +	    !cpu_has(c, X86_FEATURE_TOPOEXT)) { + +		if (msr_set_bit(0xc0011005, 54) > 0) { +			rdmsrl(0xc0011005, value); +			if (value & BIT_64(54)) { +				set_cpu_cap(c, X86_FEATURE_TOPOEXT); +				pr_info_once(FW_INFO "CPU: Re-enabling disabled Topology Extensions Support.\n"); +			} +		} +	} + +	amd_get_topology_early(c);  }  static void init_amd_k8(struct cpuinfo_x86 *c) @@ -774,19 +803,6 @@ static void init_amd_bd(struct cpuinfo_x86 *c)  {  	u64 value; -	/* re-enable TopologyExtensions if switched off by BIOS */ -	if ((c->x86_model >= 0x10) && (c->x86_model <= 0x6f) && -	    !cpu_has(c, X86_FEATURE_TOPOEXT)) { - -		if (msr_set_bit(0xc0011005, 54) > 0) { -			rdmsrl(0xc0011005, value); -			if (value & BIT_64(54)) { -				set_cpu_cap(c, X86_FEATURE_TOPOEXT); -				pr_info_once(FW_INFO "CPU: Re-enabling disabled Topology Extensions Support.\n"); -			} -		} -	} -  	/*  	 * The way access filter has a performance penalty on some workloads.  	 * Disable it on the affected CPUs. @@ -850,22 +866,12 @@ static void init_amd(struct cpuinfo_x86 *c)  	cpu_detect_cache_sizes(c); -	/* Multi core CPU? */ -	if (c->extended_cpuid_level >= 0x80000008) { -		amd_detect_cmp(c); -		amd_get_topology(c); -		srat_detect_node(c); -	} - -#ifdef CONFIG_X86_32 -	detect_ht(c); -#endif +	amd_detect_cmp(c); +	amd_get_topology(c); +	srat_detect_node(c);  	init_amd_cacheinfo(c); -	if (c->x86 >= 0xf) -		set_cpu_cap(c, X86_FEATURE_K8); -  	if (cpu_has(c, X86_FEATURE_XMM2)) {  		unsigned long long val;  		int ret;  |