Linux Power Management development
 help / color / mirror / Atom feed
* [PATCH v3] cpufreq: CPPC: mask Desired_Excursion when autonomous selection is enabled
@ 2026-05-06 10:18 luoxueqin
  2026-05-11 14:33 ` Pierre Gondois
  2026-05-12 10:02 ` Sumit Gupta
  0 siblings, 2 replies; 3+ messages in thread
From: luoxueqin @ 2026-05-06 10:18 UTC (permalink / raw)
  To: rafael, viresh.kumar, zhanjie9, zhenglifeng1, pierre.gondois,
	sumitg, linux-pm, linux-kernel
  Cc: Xueqin Luo

From: Xueqin Luo <luoxueqin@kylinos.cn>

According to the ACPI specification, the Desired_Excursion field is not
utilized when Autonomous Selection is enabled. In this mode, the bit is
architecturally ignored and does not carry meaningful information.

Currently, the kernel exposes the raw Performance Limited register
value to userspace through the cpufreq sysfs interface. This may lead to
misinterpretation, as userspace may assume Desired_Excursion is valid
even when autonomous selection is active.

To provide a stable and semantically correct ABI, mask out the
Desired_Excursion bit when autonomous selection is enabled, so that
userspace does not observe undefined or misleading values.

Writes are left unchanged, as the field is architecturally ignored in
this mode and write attempts are harmless.

Signed-off-by: Xueqin Luo <luoxueqin@kylinos.cn>
---
v2->v3:
- Use cached auto_sel from cpufreq driver data
- Fall back to raw value when policy is unavailable
- Keep sysfs ABI unchanged by using a wrapper around cppc_get_perf_limited()
---
 drivers/cpufreq/cppc_cpufreq.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
index 7e7f9dfb7a24..a439d9621eed 100644
--- a/drivers/cpufreq/cppc_cpufreq.c
+++ b/drivers/cpufreq/cppc_cpufreq.c
@@ -982,7 +982,34 @@ store_energy_performance_preference_val(struct cpufreq_policy *policy,
 	return count;
 }
 
-CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited,
+static int cppc_get_perf_limited_filtered(int cpu, u64 *perf_limited)
+{
+	struct cpufreq_policy *policy;
+	struct cppc_cpudata *cpu_data;
+	bool auto_sel_enabled = false;
+	int ret;
+
+	policy = cpufreq_cpu_get_raw(cpu);
+	if (policy && policy->driver_data) {
+		cpu_data = policy->driver_data;
+		auto_sel_enabled = cpu_data->perf_ctrls.auto_sel;
+	}
+
+	ret = cppc_get_perf_limited(cpu, perf_limited);
+	if (ret)
+		return ret;
+
+	/*
+	 * Desired_Excursion is ignored when Autonomous Selection is enabled.
+	 * Mask it to avoid exposing misleading values to userspace.
+	 */
+	if (auto_sel_enabled)
+		*perf_limited &= ~CPPC_PERF_LIMITED_DESIRED_EXCURSION;
+
+	return 0;
+}
+
+CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited_filtered,
 			 cppc_set_perf_limited)
 
 cpufreq_freq_attr_ro(freqdomain_cpus);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] cpufreq: CPPC: mask Desired_Excursion when autonomous selection is enabled
  2026-05-06 10:18 [PATCH v3] cpufreq: CPPC: mask Desired_Excursion when autonomous selection is enabled luoxueqin
@ 2026-05-11 14:33 ` Pierre Gondois
  2026-05-12 10:02 ` Sumit Gupta
  1 sibling, 0 replies; 3+ messages in thread
From: Pierre Gondois @ 2026-05-11 14:33 UTC (permalink / raw)
  To: luoxueqin, rafael, viresh.kumar, zhanjie9, zhenglifeng1, sumitg,
	linux-pm, linux-kernel

Hello Xueqin,

Thanks for the update,

Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>


On 5/6/26 12:18, luoxueqin wrote:
> From: Xueqin Luo <luoxueqin@kylinos.cn>
>
> According to the ACPI specification, the Desired_Excursion field is not
> utilized when Autonomous Selection is enabled. In this mode, the bit is
> architecturally ignored and does not carry meaningful information.
>
> Currently, the kernel exposes the raw Performance Limited register
> value to userspace through the cpufreq sysfs interface. This may lead to
> misinterpretation, as userspace may assume Desired_Excursion is valid
> even when autonomous selection is active.
>
> To provide a stable and semantically correct ABI, mask out the
> Desired_Excursion bit when autonomous selection is enabled, so that
> userspace does not observe undefined or misleading values.
>
> Writes are left unchanged, as the field is architecturally ignored in
> this mode and write attempts are harmless.
>
> Signed-off-by: Xueqin Luo <luoxueqin@kylinos.cn>
> ---
> v2->v3:
> - Use cached auto_sel from cpufreq driver data
> - Fall back to raw value when policy is unavailable
> - Keep sysfs ABI unchanged by using a wrapper around cppc_get_perf_limited()
> ---
>   drivers/cpufreq/cppc_cpufreq.c | 29 ++++++++++++++++++++++++++++-
>   1 file changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
> index 7e7f9dfb7a24..a439d9621eed 100644
> --- a/drivers/cpufreq/cppc_cpufreq.c
> +++ b/drivers/cpufreq/cppc_cpufreq.c
> @@ -982,7 +982,34 @@ store_energy_performance_preference_val(struct cpufreq_policy *policy,
>   	return count;
>   }
>   
> -CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited,
> +static int cppc_get_perf_limited_filtered(int cpu, u64 *perf_limited)
> +{
> +	struct cpufreq_policy *policy;
> +	struct cppc_cpudata *cpu_data;
> +	bool auto_sel_enabled = false;
> +	int ret;
> +
> +	policy = cpufreq_cpu_get_raw(cpu);
> +	if (policy && policy->driver_data) {
> +		cpu_data = policy->driver_data;
> +		auto_sel_enabled = cpu_data->perf_ctrls.auto_sel;
> +	}
> +
> +	ret = cppc_get_perf_limited(cpu, perf_limited);
> +	if (ret)
> +		return ret;
> +
> +	/*
> +	 * Desired_Excursion is ignored when Autonomous Selection is enabled.
> +	 * Mask it to avoid exposing misleading values to userspace.
> +	 */
> +	if (auto_sel_enabled)
> +		*perf_limited &= ~CPPC_PERF_LIMITED_DESIRED_EXCURSION;
> +
> +	return 0;
> +}
> +
> +CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited_filtered,
>   			 cppc_set_perf_limited)
>   
>   cpufreq_freq_attr_ro(freqdomain_cpus);

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] cpufreq: CPPC: mask Desired_Excursion when autonomous selection is enabled
  2026-05-06 10:18 [PATCH v3] cpufreq: CPPC: mask Desired_Excursion when autonomous selection is enabled luoxueqin
  2026-05-11 14:33 ` Pierre Gondois
@ 2026-05-12 10:02 ` Sumit Gupta
  1 sibling, 0 replies; 3+ messages in thread
From: Sumit Gupta @ 2026-05-12 10:02 UTC (permalink / raw)
  To: luoxueqin, rafael, viresh.kumar, zhanjie9, zhenglifeng1,
	pierre.gondois, linux-pm, linux-kernel


On 06/05/26 15:48, luoxueqin wrote:
> External email: Use caution opening links or attachments
>
>
> From: Xueqin Luo <luoxueqin@kylinos.cn>
>
> According to the ACPI specification, the Desired_Excursion field is not
> utilized when Autonomous Selection is enabled. In this mode, the bit is
> architecturally ignored and does not carry meaningful information.
>
> Currently, the kernel exposes the raw Performance Limited register
> value to userspace through the cpufreq sysfs interface. This may lead to
> misinterpretation, as userspace may assume Desired_Excursion is valid
> even when autonomous selection is active.
>
> To provide a stable and semantically correct ABI, mask out the
> Desired_Excursion bit when autonomous selection is enabled, so that
> userspace does not observe undefined or misleading values.
>
> Writes are left unchanged, as the field is architecturally ignored in
> this mode and write attempts are harmless.
>
> Signed-off-by: Xueqin Luo <luoxueqin@kylinos.cn>
> ---
> v2->v3:
> - Use cached auto_sel from cpufreq driver data
> - Fall back to raw value when policy is unavailable
> - Keep sysfs ABI unchanged by using a wrapper around cppc_get_perf_limited()
> ---
>   drivers/cpufreq/cppc_cpufreq.c | 29 ++++++++++++++++++++++++++++-
>   1 file changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
> index 7e7f9dfb7a24..a439d9621eed 100644
> --- a/drivers/cpufreq/cppc_cpufreq.c
> +++ b/drivers/cpufreq/cppc_cpufreq.c
> @@ -982,7 +982,34 @@ store_energy_performance_preference_val(struct cpufreq_policy *policy,
>          return count;
>   }
>
> -CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited,
> +static int cppc_get_perf_limited_filtered(int cpu, u64 *perf_limited)
> +{
> +       struct cpufreq_policy *policy;
> +       struct cppc_cpudata *cpu_data;
> +       bool auto_sel_enabled = false;
> +       int ret;
> +
> +       policy = cpufreq_cpu_get_raw(cpu);
> +       if (policy && policy->driver_data) {
> +               cpu_data = policy->driver_data;
> +               auto_sel_enabled = cpu_data->perf_ctrls.auto_sel;
> +       }
> +
> +       ret = cppc_get_perf_limited(cpu, perf_limited);
> +       if (ret)
> +               return ret;
> +

Small nit:
Call cppc_get_perf_limited() first and return early on error before
cpufreq_cpu_get_raw(). You can then drop the auto_sel_enabled
variable and test cpu_data->perf_ctrls.auto_sel directly.

Thank you,
Sumit Gupta


> +       /*
> +        * Desired_Excursion is ignored when Autonomous Selection is enabled.
> +        * Mask it to avoid exposing misleading values to userspace.
> +        */
> +       if (auto_sel_enabled)
> +               *perf_limited &= ~CPPC_PERF_LIMITED_DESIRED_EXCURSION;
> +
> +       return 0;
> +}
> +
> +CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited_filtered,
>                           cppc_set_perf_limited)
>
>   cpufreq_freq_attr_ro(freqdomain_cpus);
> --
> 2.43.0
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-05-12 10:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-06 10:18 [PATCH v3] cpufreq: CPPC: mask Desired_Excursion when autonomous selection is enabled luoxueqin
2026-05-11 14:33 ` Pierre Gondois
2026-05-12 10:02 ` Sumit Gupta

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox