Message ID | 20250113122104.3870673-7-zhenglifeng1@huawei.com |
---|---|
State | New |
Headers | show |
Series | Support for autonomous selection in cppc_cpufreq | expand |
Hello Lifeng, On Mon, Jan 13, 2025 at 08:21:04PM +0800, Lifeng Zheng wrote: > Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq > driver. > [..snip..] > diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c > index bd8f75accfa0..ea6c6a5bbd8c 100644 > --- a/drivers/cpufreq/cppc_cpufreq.c > +++ b/drivers/cpufreq/cppc_cpufreq.c > @@ -814,10 +814,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, "%s\n", "<unsupported>"); > + > + 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); When the auto_select register is not supported, since cppc_set_reg_val() doesn't have the !CPC_SUPPORTED(reg) check, that function won't return an error, and thus this store function won't return an error either. Should there be a !CPC_SUPPORTED(reg) check in cppc_set_reg_val() as well? Or should the store function call cppc_get_auto_sel() to figure out if the register is supported or not? -- Thanks and Regards gautham.
On 2025/1/16 19:39, Russell Haley wrote: > Hello, > > I noticed something here just as a user casually browsing the mailing list. > > On 1/13/25 6:21 AM, Lifeng Zheng wrote: >> Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq >> driver. >> >> Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.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..3d87c3bb3fe2 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. >> > > [...snip...] > >> +What: /sys/devices/system/cpu/cpuX/cpufreq/energy_perf >> +Date: October 2024 >> +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 only presents if the cppc-cpufreq driver is in use. > > In intel_pstate driver, there is file with near-identical semantics: > > /sys/devices/system/cpu/cpuX/cpufreq/energy_performance_preference > > It also accepts a few string arguments and converts them to integers. > > Perhaps the same name should be used, and the semantics made exactly > identical, and then it could be documented as present for either > cppc_cpufreq OR intel_pstate? > > I think would be more elegant if userspace tooling could Just Work with > either driver. > > One might object that the frequency selection behavior that results from > any particular value of the register itself might be different, but they > are *already* different between Intel's P and E-cores in the same CPU > package. (Ugh.) Yes, I should use the same name. Thanks. As for accepting string arguments and converting them to integers, I don't think it is necessary. It'll be a litte confused if someone writes a raw value and reads a string I think. I prefer to let users freely set this value. In addition, there are many differences between the implementations of energy_performance_preference in intel_pstate and cppc_cpufreq (and amd-pstate...). It is really difficult to explain all this differences in this document. So I'll leave it to be documented as present for cppc_cpufreq only. > > -- > Thanks, > Russell > > >
diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu index 206079d3bd5b..3d87c3bb3fe2 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: October 2024 +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 only presents if the cppc-cpufreq driver is in use. + +What: /sys/devices/system/cpu/cpuX/cpufreq/auto_act_window +Date: October 2024 +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 only presents if the cppc-cpufreq driver is in use. + +What: /sys/devices/system/cpu/cpuX/cpufreq/energy_perf +Date: October 2024 +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 only presents 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 bd8f75accfa0..ea6c6a5bbd8c 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -814,10 +814,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, "%s\n", "<unsupported>"); + + 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, "%s\n", "<unsupported>"); + + 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_perf(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, "%s\n", "<unsupported>"); + + if (ret) + return ret; + + return sysfs_emit(buf, "%llu\n", val); +} + +static ssize_t store_energy_perf(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_perf); static struct freq_attr *cppc_cpufreq_attr[] = { &freqdomain_cpus, + &auto_select, + &auto_act_window, + &energy_perf, NULL, };
Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq driver. Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com> --- .../ABI/testing/sysfs-devices-system-cpu | 54 +++++++++ drivers/cpufreq/cppc_cpufreq.c | 109 ++++++++++++++++++ 2 files changed, 163 insertions(+)