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:
Linus Torvalds 2024-06-05 15:12:35 -07:00
commit 64c6a36d79
6 changed files with 61 additions and 41 deletions

View File

@ -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

View File

@ -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.

View File

@ -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;

View File

@ -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 */

View File

@ -1153,7 +1153,8 @@ 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)
{ {
intel_pstate_get_hwp_cap(cpudata); if (hwp_active)
intel_pstate_get_hwp_cap(cpudata);
policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ? policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
cpudata->pstate.max_freq : cpudata->pstate.turbo_freq; cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;

View File

@ -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) {
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;