.../ABI/testing/sysfs-devices-system-cpu | 54 +++++++++ drivers/cpufreq/cppc_cpufreq.c | 109 ++++++++++++++++++ 2 files changed, 163 insertions(+)
Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq
driver.
Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
---
Hi Rafael,
This patch is the 8th patch in [1]. After the discussion in [2], Sumit
is OK with adding sysfs entries under cpufreq sysfs node, so I resend
this patch. He will later send his updated patch after.
Any comments appreciated!
Lifeng
[1] https://lore.kernel.org/all/20250206131428.3261578-1-zhenglifeng1@huawei.com/
[2] https://lore.kernel.org/all/20250211103737.447704-1-sumitg@nvidia.com/
.../ABI/testing/sysfs-devices-system-cpu | 54 +++++++++
drivers/cpufreq/cppc_cpufreq.c | 109 ++++++++++++++++++
2 files changed, 163 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
index 206079d3bd5b..37065e1b8ebc 100644
--- a/Documentation/ABI/testing/sysfs-devices-system-cpu
+++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
@@ -268,6 +268,60 @@ Description: Discover CPUs in the same CPU frequency coordination domain
This file is only present if the acpi-cpufreq or the cppc-cpufreq
drivers are in use.
+What: /sys/devices/system/cpu/cpuX/cpufreq/auto_select
+Date: May 2025
+Contact: linux-pm@vger.kernel.org
+Description: Autonomous selection enable
+
+ Read/write interface to control autonomous selection enable
+ Read returns autonomous selection status:
+ 0: autonomous selection is disabled
+ 1: autonomous selection is enabled
+
+ Write 'y' or '1' or 'on' to enable autonomous selection.
+ Write 'n' or '0' or 'off' to disable autonomous selection.
+
+ This file is only present if the cppc-cpufreq driver is in use.
+
+What: /sys/devices/system/cpu/cpuX/cpufreq/auto_act_window
+Date: May 2025
+Contact: linux-pm@vger.kernel.org
+Description: Autonomous activity window
+
+ This file indicates a moving utilization sensitivity window to
+ the platform's autonomous selection policy.
+
+ Read/write an integer represents autonomous activity window (in
+ microseconds) from/to this file. The max value to write is
+ 1270000000 but the max significand is 127. This means that if 128
+ is written to this file, 127 will be stored. If the value is
+ greater than 130, only the first two digits will be saved as
+ significand.
+
+ Writing a zero value to this file enable the platform to
+ determine an appropriate Activity Window depending on the workload.
+
+ Writing to this file only has meaning when Autonomous Selection is
+ enabled.
+
+ This file is only present if the cppc-cpufreq driver is in use.
+
+What: /sys/devices/system/cpu/cpuX/cpufreq/energy_performance_preference_val
+Date: May 2025
+Contact: linux-pm@vger.kernel.org
+Description: Energy performance preference
+
+ Read/write an 8-bit integer from/to this file. This file
+ represents a range of values from 0 (performance preference) to
+ 0xFF (energy efficiency preference) that influences the rate of
+ performance increase/decrease and the result of the hardware's
+ energy efficiency and performance optimization policies.
+
+ Writing to this file only has meaning when Autonomous Selection is
+ enabled.
+
+ This file is only present if the cppc-cpufreq driver is in use.
+
What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1}
Date: August 2008
diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
index b3d74f9adcf0..3c3d00cec298 100644
--- a/drivers/cpufreq/cppc_cpufreq.c
+++ b/drivers/cpufreq/cppc_cpufreq.c
@@ -808,10 +808,119 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
return cpufreq_show_cpus(cpu_data->shared_cpu_map, buf);
}
+
+static ssize_t show_auto_select(struct cpufreq_policy *policy, char *buf)
+{
+ bool val;
+ int ret;
+
+ ret = cppc_get_auto_sel(policy->cpu, &val);
+
+ /* show "<unsupported>" when this register is not supported by cpc */
+ if (ret == -EOPNOTSUPP)
+ return sysfs_emit(buf, "<unsupported>\n");
+
+ if (ret)
+ return ret;
+
+ return sysfs_emit(buf, "%d\n", val);
+}
+
+static ssize_t store_auto_select(struct cpufreq_policy *policy,
+ const char *buf, size_t count)
+{
+ bool val;
+ int ret;
+
+ ret = kstrtobool(buf, &val);
+ if (ret)
+ return ret;
+
+ ret = cppc_set_auto_sel(policy->cpu, val);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static ssize_t show_auto_act_window(struct cpufreq_policy *policy, char *buf)
+{
+ u64 val;
+ int ret;
+
+ ret = cppc_get_auto_act_window(policy->cpu, &val);
+
+ /* show "<unsupported>" when this register is not supported by cpc */
+ if (ret == -EOPNOTSUPP)
+ return sysfs_emit(buf, "<unsupported>\n");
+
+ if (ret)
+ return ret;
+
+ return sysfs_emit(buf, "%llu\n", val);
+}
+
+static ssize_t store_auto_act_window(struct cpufreq_policy *policy,
+ const char *buf, size_t count)
+{
+ u64 usec;
+ int ret;
+
+ ret = kstrtou64(buf, 0, &usec);
+ if (ret)
+ return ret;
+
+ ret = cppc_set_auto_act_window(policy->cpu, usec);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static ssize_t show_energy_performance_preference_val(struct cpufreq_policy *policy, char *buf)
+{
+ u64 val;
+ int ret;
+
+ ret = cppc_get_epp_perf(policy->cpu, &val);
+
+ /* show "<unsupported>" when this register is not supported by cpc */
+ if (ret == -EOPNOTSUPP)
+ return sysfs_emit(buf, "<unsupported>\n");
+
+ if (ret)
+ return ret;
+
+ return sysfs_emit(buf, "%llu\n", val);
+}
+
+static ssize_t store_energy_performance_preference_val(struct cpufreq_policy *policy,
+ const char *buf, size_t count)
+{
+ u64 val;
+ int ret;
+
+ ret = kstrtou64(buf, 0, &val);
+ if (ret)
+ return ret;
+
+ ret = cppc_set_epp(policy->cpu, val);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
cpufreq_freq_attr_ro(freqdomain_cpus);
+cpufreq_freq_attr_rw(auto_select);
+cpufreq_freq_attr_rw(auto_act_window);
+cpufreq_freq_attr_rw(energy_performance_preference_val);
static struct freq_attr *cppc_cpufreq_attr[] = {
&freqdomain_cpus,
+ &auto_select,
+ &auto_act_window,
+ &energy_performance_preference_val,
NULL,
};
--
2.33.0
On 07/05/25 08:49, Lifeng Zheng wrote:
> External email: Use caution opening links or attachments
>
>
> Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq
> driver.
>
> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
Looks good to me.
Reviewed-by: Sumit Gupta <sumitg@nvidia.com>
> ---
> Hi Rafael,
>
> This patch is the 8th patch in [1]. After the discussion in [2], Sumit
> is OK with adding sysfs entries under cpufreq sysfs node, so I resend
> this patch. He will later send his updated patch after.
>
> Any comments appreciated!
>
> Lifeng
>
> [1] https://lore.kernel.org/all/20250206131428.3261578-1-zhenglifeng1@huawei.com/
> [2] https://lore.kernel.org/all/20250211103737.447704-1-sumitg@nvidia.com/
>
> .../ABI/testing/sysfs-devices-system-cpu | 54 +++++++++
> drivers/cpufreq/cppc_cpufreq.c | 109 ++++++++++++++++++
> 2 files changed, 163 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
> index 206079d3bd5b..37065e1b8ebc 100644
> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu
> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
> @@ -268,6 +268,60 @@ Description: Discover CPUs in the same CPU frequency coordination domain
> This file is only present if the acpi-cpufreq or the cppc-cpufreq
> drivers are in use.
>
> +What: /sys/devices/system/cpu/cpuX/cpufreq/auto_select
> +Date: May 2025
> +Contact: linux-pm@vger.kernel.org
> +Description: Autonomous selection enable
> +
> + Read/write interface to control autonomous selection enable
> + Read returns autonomous selection status:
> + 0: autonomous selection is disabled
> + 1: autonomous selection is enabled
> +
> + Write 'y' or '1' or 'on' to enable autonomous selection.
> + Write 'n' or '0' or 'off' to disable autonomous selection.
> +
> + This file is only present if the cppc-cpufreq driver is in use.
> +
> +What: /sys/devices/system/cpu/cpuX/cpufreq/auto_act_window
> +Date: May 2025
> +Contact: linux-pm@vger.kernel.org
> +Description: Autonomous activity window
> +
> + This file indicates a moving utilization sensitivity window to
> + the platform's autonomous selection policy.
> +
> + Read/write an integer represents autonomous activity window (in
> + microseconds) from/to this file. The max value to write is
> + 1270000000 but the max significand is 127. This means that if 128
> + is written to this file, 127 will be stored. If the value is
> + greater than 130, only the first two digits will be saved as
> + significand.
> +
> + Writing a zero value to this file enable the platform to
> + determine an appropriate Activity Window depending on the workload.
> +
> + Writing to this file only has meaning when Autonomous Selection is
> + enabled.
> +
> + This file is only present if the cppc-cpufreq driver is in use.
> +
> +What: /sys/devices/system/cpu/cpuX/cpufreq/energy_performance_preference_val
> +Date: May 2025
> +Contact: linux-pm@vger.kernel.org
> +Description: Energy performance preference
> +
> + Read/write an 8-bit integer from/to this file. This file
> + represents a range of values from 0 (performance preference) to
> + 0xFF (energy efficiency preference) that influences the rate of
> + performance increase/decrease and the result of the hardware's
> + energy efficiency and performance optimization policies.
> +
> + Writing to this file only has meaning when Autonomous Selection is
> + enabled.
> +
> + This file is only present if the cppc-cpufreq driver is in use.
> +
>
> What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1}
> Date: August 2008
> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
> index b3d74f9adcf0..3c3d00cec298 100644
> --- a/drivers/cpufreq/cppc_cpufreq.c
> +++ b/drivers/cpufreq/cppc_cpufreq.c
> @@ -808,10 +808,119 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
>
> return cpufreq_show_cpus(cpu_data->shared_cpu_map, buf);
> }
> +
> +static ssize_t show_auto_select(struct cpufreq_policy *policy, char *buf)
> +{
> + bool val;
> + int ret;
> +
> + ret = cppc_get_auto_sel(policy->cpu, &val);
> +
> + /* show "<unsupported>" when this register is not supported by cpc */
> + if (ret == -EOPNOTSUPP)
> + return sysfs_emit(buf, "<unsupported>\n");
> +
> + if (ret)
> + return ret;
> +
> + return sysfs_emit(buf, "%d\n", val);
> +}
> +
> +static ssize_t store_auto_select(struct cpufreq_policy *policy,
> + const char *buf, size_t count)
> +{
> + bool val;
> + int ret;
> +
> + ret = kstrtobool(buf, &val);
> + if (ret)
> + return ret;
> +
> + ret = cppc_set_auto_sel(policy->cpu, val);
> + if (ret)
> + return ret;
> +
> + return count;
> +}
> +
> +static ssize_t show_auto_act_window(struct cpufreq_policy *policy, char *buf)
> +{
> + u64 val;
> + int ret;
> +
> + ret = cppc_get_auto_act_window(policy->cpu, &val);
> +
> + /* show "<unsupported>" when this register is not supported by cpc */
> + if (ret == -EOPNOTSUPP)
> + return sysfs_emit(buf, "<unsupported>\n");
> +
> + if (ret)
> + return ret;
> +
> + return sysfs_emit(buf, "%llu\n", val);
> +}
> +
> +static ssize_t store_auto_act_window(struct cpufreq_policy *policy,
> + const char *buf, size_t count)
> +{
> + u64 usec;
> + int ret;
> +
> + ret = kstrtou64(buf, 0, &usec);
> + if (ret)
> + return ret;
> +
> + ret = cppc_set_auto_act_window(policy->cpu, usec);
> + if (ret)
> + return ret;
> +
> + return count;
> +}
> +
> +static ssize_t show_energy_performance_preference_val(struct cpufreq_policy *policy, char *buf)
> +{
> + u64 val;
> + int ret;
> +
> + ret = cppc_get_epp_perf(policy->cpu, &val);
> +
> + /* show "<unsupported>" when this register is not supported by cpc */
> + if (ret == -EOPNOTSUPP)
> + return sysfs_emit(buf, "<unsupported>\n");
> +
> + if (ret)
> + return ret;
> +
> + return sysfs_emit(buf, "%llu\n", val);
> +}
> +
> +static ssize_t store_energy_performance_preference_val(struct cpufreq_policy *policy,
> + const char *buf, size_t count)
> +{
> + u64 val;
> + int ret;
> +
> + ret = kstrtou64(buf, 0, &val);
> + if (ret)
> + return ret;
> +
> + ret = cppc_set_epp(policy->cpu, val);
> + if (ret)
> + return ret;
> +
> + return count;
> +}
> +
> cpufreq_freq_attr_ro(freqdomain_cpus);
> +cpufreq_freq_attr_rw(auto_select);
> +cpufreq_freq_attr_rw(auto_act_window);
> +cpufreq_freq_attr_rw(energy_performance_preference_val);
>
> static struct freq_attr *cppc_cpufreq_attr[] = {
> &freqdomain_cpus,
> + &auto_select,
> + &auto_act_window,
> + &energy_performance_preference_val,
> NULL,
> };
>
> --
> 2.33.0
>
On 21-05-25, 16:13, Sumit Gupta wrote: > > > On 07/05/25 08:49, Lifeng Zheng wrote: > > External email: Use caution opening links or attachments > > > > > > Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq > > driver. > > > > Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com> > > Looks good to me. > > Reviewed-by: Sumit Gupta <sumitg@nvidia.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Rafael, since I have already sent the pull request, can you please take it directly ? Thanks. -- viresh
On Wed, May 21, 2025 at 12:48 PM Viresh Kumar <viresh.kumar@linaro.org> wrote: > > On 21-05-25, 16:13, Sumit Gupta wrote: > > > > > > On 07/05/25 08:49, Lifeng Zheng wrote: > > > External email: Use caution opening links or attachments > > > > > > > > > Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq > > > driver. > > > > > > Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com> > > > > Looks good to me. > > > > Reviewed-by: Sumit Gupta <sumitg@nvidia.com> > > Acked-by: Viresh Kumar <viresh.kumar@linaro.org> > > Rafael, since I have already sent the pull request, can you please > take it directly ? Thanks. Done, thanks!
On 07-05-25, 11:19, Lifeng Zheng wrote:
> Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq
> driver.
>
> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
Sumit, can you provide your tag if it looks fine to you ?
> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
> index 206079d3bd5b..37065e1b8ebc 100644
> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu
> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
> @@ -268,6 +268,60 @@ Description: Discover CPUs in the same CPU frequency coordination domain
> This file is only present if the acpi-cpufreq or the cppc-cpufreq
> drivers are in use.
>
> +What: /sys/devices/system/cpu/cpuX/cpufreq/auto_select
Is the path correct? Should this be cpufreq/policyN/auto_select ?
> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
> index b3d74f9adcf0..3c3d00cec298 100644
> --- a/drivers/cpufreq/cppc_cpufreq.c
> +++ b/drivers/cpufreq/cppc_cpufreq.c
> @@ -808,10 +808,119 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
>
> return cpufreq_show_cpus(cpu_data->shared_cpu_map, buf);
> }
> +
> +static ssize_t show_auto_select(struct cpufreq_policy *policy, char *buf)
> +{
> + bool val;
> + int ret;
> +
> + ret = cppc_get_auto_sel(policy->cpu, &val);
> +
> + /* show "<unsupported>" when this register is not supported by cpc */
s/cpc/cppc/ ?
--
viresh
On 2025/5/19 16:18, Viresh Kumar wrote:
> On 07-05-25, 11:19, Lifeng Zheng wrote:
>> Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq
>> driver.
>>
>> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
>
> Sumit, can you provide your tag if it looks fine to you ?
>
>> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
>> index 206079d3bd5b..37065e1b8ebc 100644
>> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu
>> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
>> @@ -268,6 +268,60 @@ Description: Discover CPUs in the same CPU frequency coordination domain
>> This file is only present if the acpi-cpufreq or the cppc-cpufreq
>> drivers are in use.
>>
>> +What: /sys/devices/system/cpu/cpuX/cpufreq/auto_select
>
> Is the path correct? Should this be cpufreq/policyN/auto_select ?
cpufreq/policyN/ is linked to cpuX/cpufreq/, both paths correct. The
description of freqdomain_cpus uses cpuX/cpufreq/, so I followed.
>
>> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
>> index b3d74f9adcf0..3c3d00cec298 100644
>> --- a/drivers/cpufreq/cppc_cpufreq.c
>> +++ b/drivers/cpufreq/cppc_cpufreq.c
>> @@ -808,10 +808,119 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
>>
>> return cpufreq_show_cpus(cpu_data->shared_cpu_map, buf);
>> }
>> +
>> +static ssize_t show_auto_select(struct cpufreq_policy *policy, char *buf)
>> +{
>> + bool val;
>> + int ret;
>> +
>> + ret = cppc_get_auto_sel(policy->cpu, &val);
>> +
>> + /* show "<unsupported>" when this register is not supported by cpc */
>
> s/cpc/cppc/ ?
It means Continuous Performance Control, you can see that in ACPI 6.5,
s8.4.6.1 _CPC (Continuous Performance Control). Use "_CPC" might be better.
On 19-05-25, 17:29, zhenglifeng (A) wrote: > cpufreq/policyN/ is linked to cpuX/cpufreq/, both paths correct. Ahh, my bad. > It means Continuous Performance Control, you can see that in ACPI 6.5, > s8.4.6.1 _CPC (Continuous Performance Control). Use "_CPC" might be better. Okay. This looks fine to me then, let Sumit reply and then I can apply it. -- viresh
On Wed, May 7, 2025 at 5:19 AM Lifeng Zheng <zhenglifeng1@huawei.com> wrote:
>
> Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq
> driver.
>
> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
> ---
> Hi Rafael,
>
> This patch is the 8th patch in [1]. After the discussion in [2], Sumit
> is OK with adding sysfs entries under cpufreq sysfs node, so I resend
> this patch. He will later send his updated patch after.
>
> Any comments appreciated!
>
> Lifeng
>
> [1] https://lore.kernel.org/all/20250206131428.3261578-1-zhenglifeng1@huawei.com/
> [2] https://lore.kernel.org/all/20250211103737.447704-1-sumitg@nvidia.com/
This is for Viresh and when all of the ACPI CPPC patches settle down.
I think that it would be better to get back to it after the 6.16 merge
window.
>
> .../ABI/testing/sysfs-devices-system-cpu | 54 +++++++++
> drivers/cpufreq/cppc_cpufreq.c | 109 ++++++++++++++++++
> 2 files changed, 163 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
> index 206079d3bd5b..37065e1b8ebc 100644
> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu
> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
> @@ -268,6 +268,60 @@ Description: Discover CPUs in the same CPU frequency coordination domain
> This file is only present if the acpi-cpufreq or the cppc-cpufreq
> drivers are in use.
>
> +What: /sys/devices/system/cpu/cpuX/cpufreq/auto_select
> +Date: May 2025
> +Contact: linux-pm@vger.kernel.org
> +Description: Autonomous selection enable
> +
> + Read/write interface to control autonomous selection enable
> + Read returns autonomous selection status:
> + 0: autonomous selection is disabled
> + 1: autonomous selection is enabled
> +
> + Write 'y' or '1' or 'on' to enable autonomous selection.
> + Write 'n' or '0' or 'off' to disable autonomous selection.
> +
> + This file is only present if the cppc-cpufreq driver is in use.
> +
> +What: /sys/devices/system/cpu/cpuX/cpufreq/auto_act_window
> +Date: May 2025
> +Contact: linux-pm@vger.kernel.org
> +Description: Autonomous activity window
> +
> + This file indicates a moving utilization sensitivity window to
> + the platform's autonomous selection policy.
> +
> + Read/write an integer represents autonomous activity window (in
> + microseconds) from/to this file. The max value to write is
> + 1270000000 but the max significand is 127. This means that if 128
> + is written to this file, 127 will be stored. If the value is
> + greater than 130, only the first two digits will be saved as
> + significand.
> +
> + Writing a zero value to this file enable the platform to
> + determine an appropriate Activity Window depending on the workload.
> +
> + Writing to this file only has meaning when Autonomous Selection is
> + enabled.
> +
> + This file is only present if the cppc-cpufreq driver is in use.
> +
> +What: /sys/devices/system/cpu/cpuX/cpufreq/energy_performance_preference_val
> +Date: May 2025
> +Contact: linux-pm@vger.kernel.org
> +Description: Energy performance preference
> +
> + Read/write an 8-bit integer from/to this file. This file
> + represents a range of values from 0 (performance preference) to
> + 0xFF (energy efficiency preference) that influences the rate of
> + performance increase/decrease and the result of the hardware's
> + energy efficiency and performance optimization policies.
> +
> + Writing to this file only has meaning when Autonomous Selection is
> + enabled.
> +
> + This file is only present if the cppc-cpufreq driver is in use.
> +
>
> What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1}
> Date: August 2008
> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
> index b3d74f9adcf0..3c3d00cec298 100644
> --- a/drivers/cpufreq/cppc_cpufreq.c
> +++ b/drivers/cpufreq/cppc_cpufreq.c
> @@ -808,10 +808,119 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf)
>
> return cpufreq_show_cpus(cpu_data->shared_cpu_map, buf);
> }
> +
> +static ssize_t show_auto_select(struct cpufreq_policy *policy, char *buf)
> +{
> + bool val;
> + int ret;
> +
> + ret = cppc_get_auto_sel(policy->cpu, &val);
> +
> + /* show "<unsupported>" when this register is not supported by cpc */
> + if (ret == -EOPNOTSUPP)
> + return sysfs_emit(buf, "<unsupported>\n");
> +
> + if (ret)
> + return ret;
> +
> + return sysfs_emit(buf, "%d\n", val);
> +}
> +
> +static ssize_t store_auto_select(struct cpufreq_policy *policy,
> + const char *buf, size_t count)
> +{
> + bool val;
> + int ret;
> +
> + ret = kstrtobool(buf, &val);
> + if (ret)
> + return ret;
> +
> + ret = cppc_set_auto_sel(policy->cpu, val);
> + if (ret)
> + return ret;
> +
> + return count;
> +}
> +
> +static ssize_t show_auto_act_window(struct cpufreq_policy *policy, char *buf)
> +{
> + u64 val;
> + int ret;
> +
> + ret = cppc_get_auto_act_window(policy->cpu, &val);
> +
> + /* show "<unsupported>" when this register is not supported by cpc */
> + if (ret == -EOPNOTSUPP)
> + return sysfs_emit(buf, "<unsupported>\n");
> +
> + if (ret)
> + return ret;
> +
> + return sysfs_emit(buf, "%llu\n", val);
> +}
> +
> +static ssize_t store_auto_act_window(struct cpufreq_policy *policy,
> + const char *buf, size_t count)
> +{
> + u64 usec;
> + int ret;
> +
> + ret = kstrtou64(buf, 0, &usec);
> + if (ret)
> + return ret;
> +
> + ret = cppc_set_auto_act_window(policy->cpu, usec);
> + if (ret)
> + return ret;
> +
> + return count;
> +}
> +
> +static ssize_t show_energy_performance_preference_val(struct cpufreq_policy *policy, char *buf)
> +{
> + u64 val;
> + int ret;
> +
> + ret = cppc_get_epp_perf(policy->cpu, &val);
> +
> + /* show "<unsupported>" when this register is not supported by cpc */
> + if (ret == -EOPNOTSUPP)
> + return sysfs_emit(buf, "<unsupported>\n");
> +
> + if (ret)
> + return ret;
> +
> + return sysfs_emit(buf, "%llu\n", val);
> +}
> +
> +static ssize_t store_energy_performance_preference_val(struct cpufreq_policy *policy,
> + const char *buf, size_t count)
> +{
> + u64 val;
> + int ret;
> +
> + ret = kstrtou64(buf, 0, &val);
> + if (ret)
> + return ret;
> +
> + ret = cppc_set_epp(policy->cpu, val);
> + if (ret)
> + return ret;
> +
> + return count;
> +}
> +
> cpufreq_freq_attr_ro(freqdomain_cpus);
> +cpufreq_freq_attr_rw(auto_select);
> +cpufreq_freq_attr_rw(auto_act_window);
> +cpufreq_freq_attr_rw(energy_performance_preference_val);
>
> static struct freq_attr *cppc_cpufreq_attr[] = {
> &freqdomain_cpus,
> + &auto_select,
> + &auto_act_window,
> + &energy_performance_preference_val,
> NULL,
> };
>
> --
> 2.33.0
>
>
© 2016 - 2025 Red Hat, Inc.