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 14:13, Gautham R. Shenoy wrote: > On Thu, Jan 16, 2025 at 09:26:37AM +0800, zhenglifeng (A) wrote: >> On 2025/1/15 22:51, Gautham R. Shenoy wrote: >> >>> 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? >> >> In patch 2, I have this check in cppc_set_reg_val(): >> >> + /* if a register is writeable, it must be a buffer */ >> + if ((reg->type != ACPI_TYPE_BUFFER) || >> + (IS_OPTIONAL_CPC_REG(reg_idx) && IS_NULL_REG(®->cpc_entry.reg))) { >> + pr_debug("CPC register (reg_idx=%d) is not supported\n", reg_idx); >> + return -EOPNOTSUPP; >> + } >> >> If a register is not a cpc supported one, it must be either an integer type >> or a null one. So it won't pass this check I think. > > Ah, I see. In that case, you can remove the cppc_get_auto_sel() in > shmem_init_perf() function in amd_pstate.c (in Patch 5/6) from the > following snippet. The auto_sel value is nowhere used in the rest of > the code. > > @@ -399,6 +399,7 @@ static int shmem_init_perf(struct amd_cpudata *cpudata) > { > struct cppc_perf_caps cppc_perf; > u64 numerator; > + bool auto_sel; <--- Not needed. > > int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf); > if (ret) > @@ -420,7 +421,7 @@ static int shmem_init_perf(struct amd_cpudata *cpudata) > if (cppc_state == AMD_PSTATE_ACTIVE) > return 0; > > - ret = cppc_get_auto_sel_caps(cpudata->cpu, &cppc_perf); <--- Not needed. > + ret = cppc_get_auto_sel(cpudata->cpu, &auto_sel); <--- Not needed. > if (ret) { <--- Not needed. > pr_warn("failed to get auto_sel, ret: %d\n", ret); <--- Not needed. > If auto_sel is not supported, this function will return 0 after getting fail. But after removing cppc_get_auto_sel(), this function will return -EOPNOTSUPP by setting. Is this alright? > > -- > Thanks and Regards > gautham.
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.) -- Thanks, Russell
On Thu, Jan 16, 2025 at 04:01:08PM +0800, zhenglifeng (A) wrote: > > @@ -399,6 +399,7 @@ static int shmem_init_perf(struct amd_cpudata *cpudata) > > { > > struct cppc_perf_caps cppc_perf; > > u64 numerator; > > + bool auto_sel; <--- Not needed. > > > > int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf); > > if (ret) > > @@ -420,7 +421,7 @@ static int shmem_init_perf(struct amd_cpudata *cpudata) > > if (cppc_state == AMD_PSTATE_ACTIVE) > > return 0; > > > > - ret = cppc_get_auto_sel_caps(cpudata->cpu, &cppc_perf); <--- Not needed. > > + ret = cppc_get_auto_sel(cpudata->cpu, &auto_sel); <--- Not needed. > > if (ret) { <--- Not needed. > > pr_warn("failed to get auto_sel, ret: %d\n", ret); <--- Not needed. > > > > If auto_sel is not supported, this function will return 0 after getting > fail. But after removing cppc_get_auto_sel(), this function will return > -EOPNOTSUPP by setting. Is this alright? This is not ok. The shmem_init_perf() function shouldn't error out if the auto-selection register is not supported. Also, looking at the function, there may be a few additional cleanups required in that one. For now, let us just retain the cppc_get_auto_sel() and cppc_set_auto_sel() functions as you have done in this patchset. -- 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 > > >
On 1/16/2025 21:11, zhenglifeng (A) wrote: > 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. At least the interface to userspace I think we should do the best we can to be the same between all the drivers if possible. For example; I've got a patch that I may bring up in a future kernel cycle that adds raw integer writes to amd-pstates energy_performance_profile to behave the same way intel-pstate does. > >> >> -- >> 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(+)