diff options
| author | Lifeng Zheng <zhenglifeng1@huawei.com> | 2025-05-07 06:19:41 +0300 | 
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2025-05-21 23:47:44 +0300 | 
| commit | 922607a2b462b813c4b461feca04aed0c97d4cfe (patch) | |
| tree | ce16ddd685c945bd3e91cfe17a2d35e8d6174c8d /drivers/cpufreq/cppc_cpufreq.c | |
| parent | 1da98dc52b948a6063415d8bae0c60ef89044a8c (diff) | |
| download | linux-922607a2b462b813c4b461feca04aed0c97d4cfe.tar.xz | |
cpufreq: CPPC: Add support for autonomous selection
Add sysfs interfaces for CPPC autonomous selection in the cppc_cpufreq
driver.
Signed-off-by: Lifeng Zheng <zhenglifeng1@huawei.com>
Reviewed-by: Sumit Gupta <sumitg@nvidia.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Link: https://patch.msgid.link/20250507031941.2812701-1-zhenglifeng1@huawei.com
[ rjw: Subject edits ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq/cppc_cpufreq.c')
| -rw-r--r-- | drivers/cpufreq/cppc_cpufreq.c | 109 | 
1 files changed, 109 insertions, 0 deletions
| diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index cb93f00bafdb..b7c688a5659c 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,  }; | 
