prepare code that does topology detection for amd cpus for bulldozer

This also introduces a new detection path for family 10h and newer
pre-bulldozer cpus, pre-10h hardware should not be affected.

Tested by:	Gary Jennejohn <gljennjohn@googlemail.com>
		(with pre-10h hardware)
MFC after:	2 weeks
This commit is contained in:
Andriy Gapon 2011-05-06 13:51:54 +00:00
parent f9a9473702
commit fdf30d59a6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=221527
4 changed files with 54 additions and 4 deletions

View File

@ -176,11 +176,34 @@ mem_range_AP_init(void)
static void
topo_probe_amd(void)
{
int core_id_bits;
int id;
/* AMD processors do not support HTT. */
cpu_cores = (amd_feature2 & AMDID2_CMP) != 0 ?
(cpu_procinfo2 & AMDID_CMP_CORES) + 1 : 1;
cpu_logical = 1;
if ((amd_feature2 & AMDID2_CMP) == 0) {
cpu_cores = 1;
return;
}
core_id_bits = (cpu_procinfo2 & AMDID_COREID_SIZE) >>
AMDID_COREID_SIZE_SHIFT;
if (core_id_bits == 0) {
cpu_cores = (cpu_procinfo2 & AMDID_CMP_CORES) + 1;
return;
}
/* Fam 10h and newer should get here. */
for (id = 0; id <= MAX_APIC_ID; id++) {
/* Check logical CPU availability. */
if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
continue;
/* Check if logical CPU has the same package ID. */
if ((id >> core_id_bits) != (boot_cpu_id >> core_id_bits))
continue;
cpu_cores++;
}
}
/*

View File

@ -228,6 +228,8 @@
* AMD extended function 8000_0008h ecx info
*/
#define AMDID_CMP_CORES 0x000000ff
#define AMDID_COREID_SIZE 0x0000f000
#define AMDID_COREID_SIZE_SHIFT 12
/*
* CPUID manufacturers identifiers

View File

@ -224,11 +224,34 @@ mem_range_AP_init(void)
static void
topo_probe_amd(void)
{
int core_id_bits;
int id;
/* AMD processors do not support HTT. */
cpu_cores = (amd_feature2 & AMDID2_CMP) != 0 ?
(cpu_procinfo2 & AMDID_CMP_CORES) + 1 : 1;
cpu_logical = 1;
if ((amd_feature2 & AMDID2_CMP) == 0) {
cpu_cores = 1;
return;
}
core_id_bits = (cpu_procinfo2 & AMDID_COREID_SIZE) >>
AMDID_COREID_SIZE_SHIFT;
if (core_id_bits == 0) {
cpu_cores = (cpu_procinfo2 & AMDID_CMP_CORES) + 1;
return;
}
/* Fam 10h and newer should get here. */
for (id = 0; id <= MAX_APIC_ID; id++) {
/* Check logical CPU availability. */
if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
continue;
/* Check if logical CPU has the same package ID. */
if ((id >> core_id_bits) != (boot_cpu_id >> core_id_bits))
continue;
cpu_cores++;
}
}
/*

View File

@ -227,6 +227,8 @@
* AMD extended function 8000_0008h ecx info
*/
#define AMDID_CMP_CORES 0x000000ff
#define AMDID_COREID_SIZE 0x0000f000
#define AMDID_COREID_SIZE_SHIFT 12
/*
* CPUID manufacturers identifiers