Power management fixes for 6.10-rc3
- Fix a recently introduced unchecked HWP MSR access in the intel_pstate driver (Srinivas Pandruvada). - Add missing conversion from MHz to KHz to amd_pstate_set_boost() to address sysfs inteface inconsistency and fix P-state frequency reporting on AMD Family 1Ah CPUs in the cpupower utility (Dhananjay Ugwekar). - Get rid of an excess global header file used by the amd-pstate cpufreq driver (Arnd Bergmann). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmZgo68SHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxRkIP+wXPamRibHU8VMFDewo0xYDNEcjTXBm9 Ng4D21CNteci5GB96SmEWPViEmBTZ0HiaPVZX0YViL5HT1pSALTWYuQq7iKh9E9m fqpq4iITc6u0M5wQTTHeG+S5tAVM7z32ZXosHI/sr9j7V7kfa3mmfQn1jy4Jso7S B3NkkpaRKngpo+EBZqJ4prGKB6I3Wp1WVIHo4BSqLEA5JInwd1fJP1J6ugl2vnUe V1IFRtYrzYLbzesx+OA6mRppc6Dgva+Nw+8O1zPsLuUmPJ1NVybe465uyi/u9cip PDNpycuimgI3ScllwjLeafTAzHqDxkBWIie56HpGZYbddkM7Xgg9JSu8iJ2Rcv0G bP5YIC2Vwo3nhvNfA8uVCvIAw4zNoxR9Po7SIC5zW8C51OVX7qig3BHh9Uts8Pqz uSXjLRl3aWeFekRgiI9q0Lmtw3y8UBQqEBXSKa0vXxFHlji/17v9iBAiHuP64wut u5NE+8iLmhA358uBELG32L7sR/CG0asyRsm5VFnpYVf9UDPmcpmj/WwzyLQaI0cc a5rcU5C+YEH3GWMTnyvKHEbWi+3gMaR81fVsnDdMM739HNSUltdgqSc7rjeUf3B1 FAfVVfV76dqVruVSFuu5oaZDE4BvdxrefKGur/AaKenDIauTpf5YQWiI6qkL/ZKF zkSbVmLWKOQw =lugn -----END PGP SIGNATURE----- Merge tag 'pm-6.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull power management fixes from Rafael Wysocki: "These fix the intel_pstate and amd-pstate cpufreq drivers and the cpupower utility. Specifics: - Fix a recently introduced unchecked HWP MSR access in the intel_pstate driver (Srinivas Pandruvada) - Add missing conversion from MHz to KHz to amd_pstate_set_boost() to address sysfs inteface inconsistency and fix P-state frequency reporting on AMD Family 1Ah CPUs in the cpupower utility (Dhananjay Ugwekar) - Get rid of an excess global header file used by the amd-pstate cpufreq driver (Arnd Bergmann)" * tag 'pm-6.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: cpufreq: intel_pstate: Fix unchecked HWP MSR access cpufreq: amd-pstate: Fix the inconsistency in max frequency units cpufreq: amd-pstate: remove global header file tools/power/cpupower: Fix Pstate frequency reporting on AMD Family 1Ah CPUs
This commit is contained in:
commit
64c6a36d79
@ -1107,7 +1107,6 @@ L: linux-pm@vger.kernel.org
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/admin-guide/pm/amd-pstate.rst
|
F: Documentation/admin-guide/pm/amd-pstate.rst
|
||||||
F: drivers/cpufreq/amd-pstate*
|
F: drivers/cpufreq/amd-pstate*
|
||||||
F: include/linux/amd-pstate.h
|
|
||||||
F: tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py
|
F: tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py
|
||||||
|
|
||||||
AMD PTDMA DRIVER
|
AMD PTDMA DRIVER
|
||||||
|
@ -26,10 +26,11 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/amd-pstate.h>
|
|
||||||
|
|
||||||
#include <acpi/cppc_acpi.h>
|
#include <acpi/cppc_acpi.h>
|
||||||
|
|
||||||
|
#include "amd-pstate.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Abbreviations:
|
* Abbreviations:
|
||||||
* amd_pstate_ut: used as a shortform for AMD P-State unit test.
|
* amd_pstate_ut: used as a shortform for AMD P-State unit test.
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/static_call.h>
|
#include <linux/static_call.h>
|
||||||
#include <linux/amd-pstate.h>
|
|
||||||
#include <linux/topology.h>
|
#include <linux/topology.h>
|
||||||
|
|
||||||
#include <acpi/processor.h>
|
#include <acpi/processor.h>
|
||||||
@ -46,6 +45,8 @@
|
|||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/cpufeature.h>
|
#include <asm/cpufeature.h>
|
||||||
#include <asm/cpu_device_id.h>
|
#include <asm/cpu_device_id.h>
|
||||||
|
|
||||||
|
#include "amd-pstate.h"
|
||||||
#include "amd-pstate-trace.h"
|
#include "amd-pstate-trace.h"
|
||||||
|
|
||||||
#define AMD_PSTATE_TRANSITION_LATENCY 20000
|
#define AMD_PSTATE_TRANSITION_LATENCY 20000
|
||||||
@ -53,6 +54,37 @@
|
|||||||
#define CPPC_HIGHEST_PERF_PERFORMANCE 196
|
#define CPPC_HIGHEST_PERF_PERFORMANCE 196
|
||||||
#define CPPC_HIGHEST_PERF_DEFAULT 166
|
#define CPPC_HIGHEST_PERF_DEFAULT 166
|
||||||
|
|
||||||
|
#define AMD_CPPC_EPP_PERFORMANCE 0x00
|
||||||
|
#define AMD_CPPC_EPP_BALANCE_PERFORMANCE 0x80
|
||||||
|
#define AMD_CPPC_EPP_BALANCE_POWERSAVE 0xBF
|
||||||
|
#define AMD_CPPC_EPP_POWERSAVE 0xFF
|
||||||
|
|
||||||
|
/*
|
||||||
|
* enum amd_pstate_mode - driver working mode of amd pstate
|
||||||
|
*/
|
||||||
|
enum amd_pstate_mode {
|
||||||
|
AMD_PSTATE_UNDEFINED = 0,
|
||||||
|
AMD_PSTATE_DISABLE,
|
||||||
|
AMD_PSTATE_PASSIVE,
|
||||||
|
AMD_PSTATE_ACTIVE,
|
||||||
|
AMD_PSTATE_GUIDED,
|
||||||
|
AMD_PSTATE_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const amd_pstate_mode_string[] = {
|
||||||
|
[AMD_PSTATE_UNDEFINED] = "undefined",
|
||||||
|
[AMD_PSTATE_DISABLE] = "disable",
|
||||||
|
[AMD_PSTATE_PASSIVE] = "passive",
|
||||||
|
[AMD_PSTATE_ACTIVE] = "active",
|
||||||
|
[AMD_PSTATE_GUIDED] = "guided",
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct quirk_entry {
|
||||||
|
u32 nominal_freq;
|
||||||
|
u32 lowest_freq;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: We need more time to fine tune processors with shared memory solution
|
* TODO: We need more time to fine tune processors with shared memory solution
|
||||||
* with community together.
|
* with community together.
|
||||||
@ -669,7 +701,7 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
|
|||||||
if (state)
|
if (state)
|
||||||
policy->cpuinfo.max_freq = cpudata->max_freq;
|
policy->cpuinfo.max_freq = cpudata->max_freq;
|
||||||
else
|
else
|
||||||
policy->cpuinfo.max_freq = cpudata->nominal_freq;
|
policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
|
||||||
|
|
||||||
policy->max = policy->cpuinfo.max_freq;
|
policy->max = policy->cpuinfo.max_freq;
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* linux/include/linux/amd-pstate.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 Advanced Micro Devices, Inc.
|
* Copyright (C) 2022 Advanced Micro Devices, Inc.
|
||||||
*
|
*
|
||||||
* Author: Meng Li <li.meng@amd.com>
|
* Author: Meng Li <li.meng@amd.com>
|
||||||
@ -12,11 +10,6 @@
|
|||||||
|
|
||||||
#include <linux/pm_qos.h>
|
#include <linux/pm_qos.h>
|
||||||
|
|
||||||
#define AMD_CPPC_EPP_PERFORMANCE 0x00
|
|
||||||
#define AMD_CPPC_EPP_BALANCE_PERFORMANCE 0x80
|
|
||||||
#define AMD_CPPC_EPP_BALANCE_POWERSAVE 0xBF
|
|
||||||
#define AMD_CPPC_EPP_POWERSAVE 0xFF
|
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* AMD P-state INTERFACE *
|
* AMD P-state INTERFACE *
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
@ -108,30 +101,4 @@ struct amd_cpudata {
|
|||||||
bool suspended;
|
bool suspended;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* enum amd_pstate_mode - driver working mode of amd pstate
|
|
||||||
*/
|
|
||||||
enum amd_pstate_mode {
|
|
||||||
AMD_PSTATE_UNDEFINED = 0,
|
|
||||||
AMD_PSTATE_DISABLE,
|
|
||||||
AMD_PSTATE_PASSIVE,
|
|
||||||
AMD_PSTATE_ACTIVE,
|
|
||||||
AMD_PSTATE_GUIDED,
|
|
||||||
AMD_PSTATE_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char * const amd_pstate_mode_string[] = {
|
|
||||||
[AMD_PSTATE_UNDEFINED] = "undefined",
|
|
||||||
[AMD_PSTATE_DISABLE] = "disable",
|
|
||||||
[AMD_PSTATE_PASSIVE] = "passive",
|
|
||||||
[AMD_PSTATE_ACTIVE] = "active",
|
|
||||||
[AMD_PSTATE_GUIDED] = "guided",
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct quirk_entry {
|
|
||||||
u32 nominal_freq;
|
|
||||||
u32 lowest_freq;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _LINUX_AMD_PSTATE_H */
|
#endif /* _LINUX_AMD_PSTATE_H */
|
@ -1153,6 +1153,7 @@ static void intel_pstate_update_policies(void)
|
|||||||
static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
|
static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
|
||||||
struct cpufreq_policy *policy)
|
struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
|
if (hwp_active)
|
||||||
intel_pstate_get_hwp_cap(cpudata);
|
intel_pstate_get_hwp_cap(cpudata);
|
||||||
|
|
||||||
policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
|
policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
|
||||||
|
@ -41,6 +41,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;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -48,6 +58,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)
|
||||||
@ -61,12 +75,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) {
|
||||||
|
if (cpupower_cpu_info.family >= 0x1A) {
|
||||||
|
fid = pstate.pstatedef2.fid;
|
||||||
|
if (fid > 0x0f)
|
||||||
|
cof = (fid * 5);
|
||||||
|
} else {
|
||||||
fid = pstate.pstatedef.fid;
|
fid = pstate.pstatedef.fid;
|
||||||
cof = 200 * fid / did;
|
cof = 200 * fid / did;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
t = 0x10;
|
t = 0x10;
|
||||||
fid = pstate.pstate.fid;
|
fid = pstate.pstate.fid;
|
||||||
|
Loading…
Reference in New Issue
Block a user