tools/power/cpupower: Fix Pstate frequency reporting on AMD Family 1Ah CPUs
[ Upstream commit 43cad521c6d228ea0c51e248f8e5b3a6295a2849 ] Update cpupower's P-State frequency calculation and reporting with AMD Family 1Ah+ processors, when using the acpi-cpufreq driver. This is due to a change in the PStateDef MSR layout in AMD Family 1Ah+. Tested on 4th and 5th Gen AMD EPYC system Signed-off-by: Ananth Narayan <Ananth.Narayan@amd.com> Signed-off-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
044a7bfca8
Коммит
a3c944359f
|
@ -38,6 +38,16 @@ union core_pstate {
|
||||||
unsigned res1:31;
|
unsigned res1:31;
|
||||||
unsigned en:1;
|
unsigned en:1;
|
||||||
} pstatedef;
|
} pstatedef;
|
||||||
|
/* since fam 1Ah: */
|
||||||
|
struct {
|
||||||
|
unsigned fid:12;
|
||||||
|
unsigned res1:2;
|
||||||
|
unsigned vid:8;
|
||||||
|
unsigned iddval:8;
|
||||||
|
unsigned idddiv:2;
|
||||||
|
unsigned res2:31;
|
||||||
|
unsigned en:1;
|
||||||
|
} pstatedef2;
|
||||||
unsigned long long val;
|
unsigned long long val;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -45,6 +55,10 @@ static int get_did(union core_pstate pstate)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
|
/* Fam 1Ah onward do not use did */
|
||||||
|
if (cpupower_cpu_info.family >= 0x1A)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATEDEF)
|
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATEDEF)
|
||||||
t = pstate.pstatedef.did;
|
t = pstate.pstatedef.did;
|
||||||
else if (cpupower_cpu_info.family == 0x12)
|
else if (cpupower_cpu_info.family == 0x12)
|
||||||
|
@ -58,12 +72,18 @@ static int get_did(union core_pstate pstate)
|
||||||
static int get_cof(union core_pstate pstate)
|
static int get_cof(union core_pstate pstate)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
int fid, did, cof;
|
int fid, did, cof = 0;
|
||||||
|
|
||||||
did = get_did(pstate);
|
did = get_did(pstate);
|
||||||
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATEDEF) {
|
if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATEDEF) {
|
||||||
fid = pstate.pstatedef.fid;
|
if (cpupower_cpu_info.family >= 0x1A) {
|
||||||
cof = 200 * fid / did;
|
fid = pstate.pstatedef2.fid;
|
||||||
|
if (fid > 0x0f)
|
||||||
|
cof = (fid * 5);
|
||||||
|
} else {
|
||||||
|
fid = pstate.pstatedef.fid;
|
||||||
|
cof = 200 * fid / did;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
t = 0x10;
|
t = 0x10;
|
||||||
fid = pstate.pstate.fid;
|
fid = pstate.pstate.fid;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче