mirror of
https://github.com/anrieff/libcpuid
synced 2025-10-03 11:01:30 +00:00
Support for AMD Phenom, beautified cpu match table
git-svn-id: https://svn.code.sf.net/p/libcpuid/code/HEAD/libcpuid@24 3b4be424-7ac5-41d7-8526-f4ddcb85d872
This commit is contained in:
parent
1ce98d95e8
commit
f7e5bafc7b
1 changed files with 111 additions and 76 deletions
|
@ -48,108 +48,120 @@ enum _amd_code_t {
|
||||||
MOBILE_DURON,
|
MOBILE_DURON,
|
||||||
SEMPRON,
|
SEMPRON,
|
||||||
MOBILE_SEMPRON,
|
MOBILE_SEMPRON,
|
||||||
OPTERON_SINGLECORE,
|
OPTERON_SINGLE,
|
||||||
OPTERON_DUALCORE,
|
OPTERON_DUALCORE,
|
||||||
OPTERON_800_DUALCORE,
|
OPTERON_800_DUALCORE,
|
||||||
MOBILE_TURION,
|
MOBILE_TURION,
|
||||||
ATHLON_64_512K,
|
ATHLON_64_512K,
|
||||||
ATHLON_64_1024K,
|
ATHLON_64_1M,
|
||||||
ATHLON_64_X2_512K,
|
ATHLON_64_X2_512K,
|
||||||
ATHLON_64_X2_1024K,
|
ATHLON_64_X2_1M,
|
||||||
ATHLON_64_FX,
|
ATHLON_64_FX,
|
||||||
TURION_64_512K,
|
TURION_64_512K,
|
||||||
TURION_64_1024K,
|
TURION_64_1M,
|
||||||
TURION_X2_512K,
|
TURION_X2_512K,
|
||||||
TURION_X2_1024K,
|
TURION_X2_1M,
|
||||||
SEMPRON_64_128K,
|
SEMPRON_64_128K,
|
||||||
SEMPRON_64_256K,
|
SEMPRON_64_256K,
|
||||||
|
SEMPRON_DUALCORE,
|
||||||
|
PHENOM,
|
||||||
|
PHENOM_X2,
|
||||||
|
PHENOM_X3,
|
||||||
|
PHENOM_X4,
|
||||||
};
|
};
|
||||||
typedef enum _amd_code_t amd_code_t;
|
typedef enum _amd_code_t amd_code_t;
|
||||||
|
|
||||||
const struct match_entry_t cpudb_amd[] = {
|
const struct match_entry_t cpudb_amd[] = {
|
||||||
{ -1, -1, -1, -1, -1, NO_CODE, "Unknown AMD CPU" },
|
{ -1, -1, -1, -1, -1, NO_CODE , "Unknown AMD CPU" },
|
||||||
|
|
||||||
/* 486 and the likes */
|
/* 486 and the likes */
|
||||||
{ 4, -1, -1, -1, -1, NO_CODE, "Unknown AMD 486" },
|
{ 4, -1, -1, -1, -1, NO_CODE , "Unknown AMD 486" },
|
||||||
{ 4, 3, -1, -1, -1, NO_CODE, "AMD 486DX2" },
|
{ 4, 3, -1, -1, -1, NO_CODE , "AMD 486DX2" },
|
||||||
{ 4, 7, -1, -1, -1, NO_CODE, "AMD 486DX2WB" },
|
{ 4, 7, -1, -1, -1, NO_CODE , "AMD 486DX2WB" },
|
||||||
{ 4, 8, -1, -1, -1, NO_CODE, "AMD 486DX4" },
|
{ 4, 8, -1, -1, -1, NO_CODE , "AMD 486DX4" },
|
||||||
{ 4, 9, -1, -1, -1, NO_CODE, "AMD 486DX4WB" },
|
{ 4, 9, -1, -1, -1, NO_CODE , "AMD 486DX4WB" },
|
||||||
|
|
||||||
/* Pentia clones */
|
/* Pentia clones */
|
||||||
{ 5, -1, -1, -1, -1, NO_CODE, "Unknown AMD 586" },
|
{ 5, -1, -1, -1, -1, NO_CODE , "Unknown AMD 586" },
|
||||||
{ 5, 0, -1, -1, -1, NO_CODE, "K5" },
|
{ 5, 0, -1, -1, -1, NO_CODE , "K5" },
|
||||||
{ 5, 1, -1, -1, -1, NO_CODE, "K5" },
|
{ 5, 1, -1, -1, -1, NO_CODE , "K5" },
|
||||||
{ 5, 2, -1, -1, -1, NO_CODE, "K5" },
|
{ 5, 2, -1, -1, -1, NO_CODE , "K5" },
|
||||||
{ 5, 3, -1, -1, -1, NO_CODE, "K5" },
|
{ 5, 3, -1, -1, -1, NO_CODE , "K5" },
|
||||||
|
|
||||||
/* The K6 */
|
/* The K6 */
|
||||||
{ 5, 6, -1, -1, -1, NO_CODE, "K6" },
|
{ 5, 6, -1, -1, -1, NO_CODE , "K6" },
|
||||||
{ 5, 7, -1, -1, -1, NO_CODE, "K6" },
|
{ 5, 7, -1, -1, -1, NO_CODE , "K6" },
|
||||||
|
|
||||||
{ 5, 8, -1, -1, -1, NO_CODE, "K6-2" },
|
{ 5, 8, -1, -1, -1, NO_CODE , "K6-2" },
|
||||||
{ 5, 9, -1, -1, -1, NO_CODE, "K6-III" },
|
{ 5, 9, -1, -1, -1, NO_CODE , "K6-III" },
|
||||||
{ 5, 10, -1, -1, -1, NO_CODE, "Unknown K6" },
|
{ 5, 10, -1, -1, -1, NO_CODE , "Unknown K6" },
|
||||||
{ 5, 11, -1, -1, -1, NO_CODE, "Unknown K6" },
|
{ 5, 11, -1, -1, -1, NO_CODE , "Unknown K6" },
|
||||||
{ 5, 12, -1, -1, -1, NO_CODE, "Unknown K6" },
|
{ 5, 12, -1, -1, -1, NO_CODE , "Unknown K6" },
|
||||||
{ 5, 13, -1, -1, -1, NO_CODE, "K6-2+" },
|
{ 5, 13, -1, -1, -1, NO_CODE , "K6-2+" },
|
||||||
|
|
||||||
/* Athlon et al. */
|
/* Athlon et al. */
|
||||||
{ 6, 1, -1, -1, -1, NO_CODE, "Athlon (Slot-A)" },
|
{ 6, 1, -1, -1, -1, NO_CODE , "Athlon (Slot-A)" },
|
||||||
{ 6, 2, -1, -1, -1, NO_CODE, "Athlon (Slot-A)" },
|
{ 6, 2, -1, -1, -1, NO_CODE , "Athlon (Slot-A)" },
|
||||||
{ 6, 3, -1, -1, -1, NO_CODE, "Duron (Spitfire)" },
|
{ 6, 3, -1, -1, -1, NO_CODE , "Duron (Spitfire)" },
|
||||||
{ 6, 4, -1, -1, -1, NO_CODE, "Athlon (ThunderBird)" },
|
{ 6, 4, -1, -1, -1, NO_CODE , "Athlon (ThunderBird)" },
|
||||||
|
|
||||||
{ 6, 6, -1, -1, -1, NO_CODE, "Unknown Athlon" },
|
{ 6, 6, -1, -1, -1, NO_CODE , "Unknown Athlon" },
|
||||||
{ 6, 6, -1, -1, -1, ATHLON, "Athlon (Palomino)" },
|
{ 6, 6, -1, -1, -1, ATHLON , "Athlon (Palomino)" },
|
||||||
{ 6, 6, -1, -1, -1, ATHLON_MP, "Athlon MP (Palomino)" },
|
{ 6, 6, -1, -1, -1, ATHLON_MP , "Athlon MP (Palomino)" },
|
||||||
{ 6, 6, -1, -1, -1, DURON, "Duron (Palomino)" },
|
{ 6, 6, -1, -1, -1, DURON , "Duron (Palomino)" },
|
||||||
{ 6, 6, -1, -1, -1, ATHLON_XP, "Athlon XP" },
|
{ 6, 6, -1, -1, -1, ATHLON_XP , "Athlon XP" },
|
||||||
|
|
||||||
{ 6, 7, -1, -1, -1, NO_CODE, "Unknown Athlon XP" },
|
{ 6, 7, -1, -1, -1, NO_CODE , "Unknown Athlon XP" },
|
||||||
{ 6, 7, -1, -1, -1, DURON, "Duron (Morgan)" },
|
{ 6, 7, -1, -1, -1, DURON , "Duron (Morgan)" },
|
||||||
|
|
||||||
{ 6, 8, -1, -1, -1, NO_CODE, "Athlon XP" },
|
{ 6, 8, -1, -1, -1, NO_CODE , "Athlon XP" },
|
||||||
{ 6, 8, -1, -1, -1, ATHLON, "Athlon XP" },
|
{ 6, 8, -1, -1, -1, ATHLON , "Athlon XP" },
|
||||||
{ 6, 8, -1, -1, -1, ATHLON_XP, "Athlon XP" },
|
{ 6, 8, -1, -1, -1, ATHLON_XP , "Athlon XP" },
|
||||||
{ 6, 8, -1, -1, -1, DURON, "Duron (Applebred)" },
|
{ 6, 8, -1, -1, -1, DURON , "Duron (Applebred)" },
|
||||||
{ 6, 8, -1, -1, -1, SEMPRON, "Sempron (Thoroughbred)" },
|
{ 6, 8, -1, -1, -1, SEMPRON , "Sempron (Thoroughbred)" },
|
||||||
{ 6, 8, -1, -1, -1, SEMPRON_64_128K, "Sempron (Thoroughbred)" },
|
{ 6, 8, -1, -1, -1, SEMPRON_64_128K , "Sempron (Thoroughbred)" },
|
||||||
{ 6, 8, -1, -1, -1, SEMPRON_64_256K, "Sempron (Thoroughbred)" },
|
{ 6, 8, -1, -1, -1, SEMPRON_64_256K , "Sempron (Thoroughbred)" },
|
||||||
{ 6, 8, -1, -1, -1, ATHLON_MP, "Athlon MP (Thoroughbred)" },
|
{ 6, 8, -1, -1, -1, ATHLON_MP , "Athlon MP (Thoroughbred)"},
|
||||||
{ 6, 8, -1, -1, -1, ATHLON_XP_M, "Mobile Athlon (Thoroughbred)" },
|
{ 6, 8, -1, -1, -1, ATHLON_XP_M , "Mobile Athlon (T-Bred)" },
|
||||||
{ 6, 8, -1, -1, -1, ATHLON_XP_M_LV, "Mobile Athlon (Thoroughbred)" },
|
{ 6, 8, -1, -1, -1, ATHLON_XP_M_LV , "Mobile Athlon (T-Bred)" },
|
||||||
|
|
||||||
{ 6, 10, -1, -1, -1, NO_CODE, "Athlon XP (Barton)" },
|
{ 6, 10, -1, -1, -1, NO_CODE , "Athlon XP (Barton)" },
|
||||||
{ 6, 10, -1, -1, -1, ATHLON, "Athlon XP (Barton)" },
|
{ 6, 10, -1, -1, -1, ATHLON , "Athlon XP (Barton)" },
|
||||||
{ 6, 10, -1, -1, -1, ATHLON_XP_BARTON, "Athlon XP (Barton)" },
|
{ 6, 10, -1, -1, -1, ATHLON_XP_BARTON , "Athlon XP (Barton)" },
|
||||||
{ 6, 10, -1, -1, -1, SEMPRON, "Sempron (Barton)" },
|
{ 6, 10, -1, -1, -1, SEMPRON , "Sempron (Barton)" },
|
||||||
{ 6, 10, -1, -1, -1, SEMPRON_64_256K, "Sempron (Barton)" },
|
{ 6, 10, -1, -1, -1, SEMPRON_64_256K , "Sempron (Barton)" },
|
||||||
{ 6, 10, -1, -1, -1, ATHLON_XP, "Athlon XP" },
|
{ 6, 10, -1, -1, -1, ATHLON_XP , "Athlon XP" },
|
||||||
/* ^^ Actually, Thorton, but it's equivallent to Thoroughbred */
|
/* ^^ Actually, Thorton, but it's equivallent to Thoroughbred */
|
||||||
{ 6, 10, -1, -1, -1, ATHLON_MP, "Athlon MP (Barton)" },
|
{ 6, 10, -1, -1, -1, ATHLON_MP , "Athlon MP (Barton)" },
|
||||||
{ 6, 10, -1, -1, -1, ATHLON_XP_M, "Mobile Athlon (Barton)" },
|
{ 6, 10, -1, -1, -1, ATHLON_XP_M , "Mobile Athlon (Barton)" },
|
||||||
{ 6, 10, -1, -1, -1, ATHLON_XP_M_LV, "Mobile Athlon (Barton)" },
|
{ 6, 10, -1, -1, -1, ATHLON_XP_M_LV , "Mobile Athlon (Barton)" },
|
||||||
|
|
||||||
/* K8 Architecture */
|
/* K8 Architecture */
|
||||||
{ 15, -1, -1, 0, -1, NO_CODE, "Unknown K8" },
|
{ 15, -1, -1, 15, -1, NO_CODE , "Unknown K8" },
|
||||||
{ 15, -1, -1, 1, -1, NO_CODE, "Unknown K9" },
|
{ 15, -1, -1, 16, -1, NO_CODE , "Unknown K9" },
|
||||||
|
|
||||||
{ 15, -1, -1, 0, 0, NO_CODE, "Unknown A64" },
|
{ 15, -1, -1, 15, -1, NO_CODE , "Unknown A64" },
|
||||||
{ 15, -1, -1, 0, 0, OPTERON_SINGLECORE, "Opteron" },
|
{ 15, -1, -1, 15, -1, OPTERON_SINGLE , "Opteron" },
|
||||||
{ 15, -1, -1, 0, 0, OPTERON_DUALCORE, "Opteron (Dual Core)" },
|
{ 15, -1, -1, 15, -1, OPTERON_DUALCORE , "Opteron (Dual Core)" },
|
||||||
{ 15, -1, -1, 0, 0, ATHLON_64_512K, "Athlon 64 (512K)" },
|
{ 15, -1, -1, 15, -1, ATHLON_64_512K , "Athlon 64 (512K)" },
|
||||||
{ 15, -1, -1, 0, 0, ATHLON_64_1024K, "Athlon 64 (1024K)" },
|
{ 15, -1, -1, 15, -1, ATHLON_64_1M , "Athlon 64 (1024K)" },
|
||||||
{ 15, -1, -1, 0, 0, ATHLON_64_X2_512K, "Athlon 64 X2 (512K)" },
|
{ 15, -1, -1, 15, -1, ATHLON_64_X2_512K, "Athlon 64 X2 (512K)" },
|
||||||
{ 15, -1, -1, 0, 0, ATHLON_64_X2_1024K, "Athlon 64 X2 (1024K)" },
|
{ 15, -1, -1, 15, -1, ATHLON_64_X2_1M , "Athlon 64 X2 (1024K)" },
|
||||||
{ 15, -1, -1, 0, 0, ATHLON_FX, "Athlon FX" },
|
{ 15, -1, -1, 15, -1, ATHLON_FX , "Athlon FX" },
|
||||||
{ 15, -1, -1, 0, 0, ATHLON_64_FX, "Athlon 64 FX" },
|
{ 15, -1, -1, 15, -1, ATHLON_64_FX , "Athlon 64 FX" },
|
||||||
{ 15, -1, -1, 0, 0, TURION_64_512K, "Turion 64 (512K)" },
|
{ 15, -1, -1, 15, -1, TURION_64_512K , "Turion 64 (512K)" },
|
||||||
{ 15, -1, -1, 0, 0, TURION_64_1024K, "Turion 64 (1024K)" },
|
{ 15, -1, -1, 15, -1, TURION_64_1M , "Turion 64 (1024K)" },
|
||||||
{ 15, -1, -1, 0, 0, TURION_X2_512K, "Turion 64 X2 (512K)" },
|
{ 15, -1, -1, 15, -1, TURION_X2_512K , "Turion 64 X2 (512K)" },
|
||||||
{ 15, -1, -1, 0, 0, TURION_X2_1024K, "Turion 64 X2 (1024K)" },
|
{ 15, -1, -1, 15, -1, TURION_X2_1M , "Turion 64 X2 (1024K)" },
|
||||||
{ 15, -1, -1, 0, 0, SEMPRON_64_128K, "A64 Sempron (128K)" },
|
{ 15, -1, -1, 15, -1, SEMPRON_64_128K , "A64 Sempron (128K)" },
|
||||||
{ 15, -1, -1, 0, 0, SEMPRON_64_256K, "A64 Sempron (256K)" },
|
{ 15, -1, -1, 15, -1, SEMPRON_64_256K , "A64 Sempron (256K)" },
|
||||||
|
{ 15, -1, -1, 15, -1, SEMPRON_DUALCORE , "A64 Sempron (Dual Core)" },
|
||||||
|
|
||||||
|
/* K9 Architecture */
|
||||||
|
{ 15, -1, -1, 16, -1, PHENOM , "Unknown AMD Phenom" },
|
||||||
|
{ 15, 2, -1, 16, -1, PHENOM , "Phenom" },
|
||||||
|
{ 15, 2, -1, 16, -1, PHENOM_X3 , "Phenom X3 (Toliman)" },
|
||||||
|
{ 15, 2, -1, 16, -1, PHENOM_X4 , "Phenom X4 (Agena)" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -254,7 +266,10 @@ static amd_code_t decode_amd_codename_part1(const char *bs)
|
||||||
{
|
{
|
||||||
if (strstr(bs, "Opteron")) {
|
if (strstr(bs, "Opteron")) {
|
||||||
if (strstr(bs, "Dual Core")) return OPTERON_DUALCORE;
|
if (strstr(bs, "Dual Core")) return OPTERON_DUALCORE;
|
||||||
return OPTERON_SINGLECORE;
|
return OPTERON_SINGLE;
|
||||||
|
}
|
||||||
|
if (strstr(bs, "Phenom")) {
|
||||||
|
return PHENOM;
|
||||||
}
|
}
|
||||||
if (strstr(bs, "Athlon(tm) 64 FX")) return ATHLON_64_FX;
|
if (strstr(bs, "Athlon(tm) 64 FX")) return ATHLON_64_FX;
|
||||||
if (strstr(bs, "Athlon(tm) FX")) return ATHLON_FX;
|
if (strstr(bs, "Athlon(tm) FX")) return ATHLON_FX;
|
||||||
|
@ -262,6 +277,9 @@ static amd_code_t decode_amd_codename_part1(const char *bs)
|
||||||
if (strstr(bs, "Dual Core")) return ATHLON_64_X2_512K;
|
if (strstr(bs, "Dual Core")) return ATHLON_64_X2_512K;
|
||||||
return ATHLON_64_512K;
|
return ATHLON_64_512K;
|
||||||
}
|
}
|
||||||
|
if (strstr(bs, "Athlon(tm) X2")) {
|
||||||
|
return ATHLON_64_X2_512K;
|
||||||
|
}
|
||||||
if (strstr(bs, "Turion(tm)")) {
|
if (strstr(bs, "Turion(tm)")) {
|
||||||
if (strstr(bs, "X2"))
|
if (strstr(bs, "X2"))
|
||||||
return TURION_X2_512K;
|
return TURION_X2_512K;
|
||||||
|
@ -292,15 +310,32 @@ static void decode_amd_codename(struct cpu_raw_data_t* raw, struct cpu_id_t* dat
|
||||||
if (code == ATHLON_XP && data->l2_cache == 512)
|
if (code == ATHLON_XP && data->l2_cache == 512)
|
||||||
code = ATHLON_XP_BARTON;
|
code = ATHLON_XP_BARTON;
|
||||||
if (code == ATHLON_64_512K && data->l2_cache > 512)
|
if (code == ATHLON_64_512K && data->l2_cache > 512)
|
||||||
code = ATHLON_64_1024K;
|
code = ATHLON_64_1M;
|
||||||
if (code == SEMPRON_64_128K && data->l2_cache > 128)
|
if (code == SEMPRON_64_128K && data->l2_cache > 128)
|
||||||
code = SEMPRON_64_256K;
|
code = SEMPRON_64_256K;
|
||||||
if (code == TURION_64_512K && data->l2_cache > 512)
|
if (code == TURION_64_512K && data->l2_cache > 512)
|
||||||
code = TURION_64_1024K;
|
code = TURION_64_1M;
|
||||||
if (code == TURION_X2_512K && data->l2_cache > 512)
|
if (code == TURION_X2_512K && data->l2_cache > 512)
|
||||||
code = TURION_X2_1024K;
|
code = TURION_X2_1M;
|
||||||
if (code == ATHLON_64_X2_512K && data->l2_cache > 512)
|
if (code == ATHLON_64_X2_512K && data->l2_cache > 512)
|
||||||
code = ATHLON_64_X2_1024K;
|
code = ATHLON_64_X2_1M;
|
||||||
|
if (code == ATHLON_64_X2_512K && data->l2_cache < 512)
|
||||||
|
code = SEMPRON_DUALCORE;
|
||||||
|
if (code == PHENOM) {
|
||||||
|
switch (data->num_cores) {
|
||||||
|
case 2:
|
||||||
|
code = PHENOM_X2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
code = PHENOM_X3;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
code = PHENOM_X4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
match_cpu_codename(cpudb_amd, COUNT_OF(cpudb_amd), data, code);
|
match_cpu_codename(cpudb_amd, COUNT_OF(cpudb_amd), data, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue