Re: [PATCH] ACPI: CPPC: Add helper to get effective guaranteed performance
From: luoxueqin
Date: Sun May 31 2026 - 22:32:41 EST
在 2026/5/29 23:33, srinivas pandruvada 写道:
On Fri, 2026-05-29 at 16:18 +0800, Xueqin Luo wrote:Thanks Srinivas.
According to the ACPI CPPC specification, if the GuaranteedHi Luo,
Performance register is not implemented, OSPM assumes the
guaranteed performance is equal to nominal performance.
Add cppc_get_effective_guaranteed_perf() helper to provide a
spec-compliant effective guaranteed performance value while
preserving the raw values returned by cppc_get_perf_caps().
Are you trying to fix any issue where you have issue with
"base_frequency" display? intel_pstate will revert to native MSR, which
is always present when we are using CPPC.
I worry about some bad nominal perf in some platforms as we will be
dependent on OEM BIOS.
Thanks,
Srinivas
The intent is not to fix any issue in intel_pstate. It already
implements the fallback correctly today.
My goal was to provide a common helper encapsulating the ACPI
CPPC semantics, with intel_pstate serving as the first user.
That said, I agree the benefit may not justify a new exported
helper at this point.
Signed-off-by: Xueqin Luo <luoxueqin@xxxxxxxxxx>
---
drivers/acpi/cppc_acpi.c | 26 ++++++++++++++++++++++++++
drivers/cpufreq/intel_pstate.c | 10 ++++------
include/acpi/cppc_acpi.h | 5 +++++
3 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index f370be8715ae..6dc11030707a 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -1328,6 +1328,32 @@ int cppc_get_highest_perf(int cpunum, u64
*highest_perf)
}
EXPORT_SYMBOL_GPL(cppc_get_highest_perf);
+/**
+ * cppc_get_effective_guaranteed_perf - get effective guaranteed
performance
+ * @cpunum: CPU number
+ * @guaranteed_perf: Effective guaranteed performance value
+ *
+ * The ACPI CPPC specification states that if the Guaranteed
+ * Performance register is not implemented, OSPM assumes the
+ * guaranteed performance is equal to nominal performance.
+ *
+ * Return: 0 on success, negative errno on failure.
+ */
+int cppc_get_effective_guaranteed_perf(int cpunum, u64
*guaranteed_perf)
+{
+ struct cppc_perf_caps perf_caps;
+ int ret;
+
+ ret = cppc_get_perf_caps(cpunum, &perf_caps);
+ if (ret)
+ return ret;
+ *guaranteed_perf = perf_caps.guaranteed_perf ?:
+ perf_caps.nominal_perf;
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(cppc_get_effective_guaranteed_perf);
+
/**
* cppc_get_epp_perf - Get the epp register value.
* @cpunum: CPU from which to get epp preference value.
diff --git a/drivers/cpufreq/intel_pstate.c
b/drivers/cpufreq/intel_pstate.c
index 8dc22a65e025..8934e48f71a2 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -404,17 +404,15 @@ static void intel_pstate_set_itmt_prio(int cpu)
static int intel_pstate_get_cppc_guaranteed(int cpu)
{
- struct cppc_perf_caps cppc_perf;
+ u64 guaranteed_perf;
int ret;
- ret = cppc_get_perf_caps(cpu, &cppc_perf);
+ ret = cppc_get_effective_guaranteed_perf(cpu,
&guaranteed_perf);
+
if (ret)
return ret;
- if (cppc_perf.guaranteed_perf)
- return cppc_perf.guaranteed_perf;
-
- return cppc_perf.nominal_perf;
+ return guaranteed_perf;
}
static int intel_pstate_cppc_get_scaling(int cpu)
diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h
index d1f02ceec4f9..c02f3bc1fc1a 100644
--- a/include/acpi/cppc_acpi.h
+++ b/include/acpi/cppc_acpi.h
@@ -155,6 +155,7 @@ struct cppc_cpudata {
extern int cppc_get_desired_perf(int cpunum, u64 *desired_perf);
extern int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf);
extern int cppc_get_highest_perf(int cpunum, u64 *highest_perf);
+extern int cppc_get_effective_guaranteed_perf(int cpunum, u64
*guaranteed_perf);
extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs
*perf_fb_ctrs);
extern int cppc_get_perf(int cpu, struct cppc_perf_ctrls
*perf_ctrls);
extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls
*perf_ctrls);
@@ -198,6 +199,10 @@ static inline int cppc_get_highest_perf(int
cpunum, u64 *highest_perf)
{
return -EOPNOTSUPP;
}
+static inline int cppc_get_effective_guaranteed_perf(int cpunum, u64
*guaranteed_perf)
+{
+ return -EOPNOTSUPP;
+}
static inline int cppc_get_perf_ctrs(int cpu, struct
cppc_perf_fb_ctrs *perf_fb_ctrs)
{
return -EOPNOTSUPP;