Commit 4a1cf5ed authored by Sumit Gupta's avatar Sumit Gupta Committed by Rafael J. Wysocki
Browse files

cpufreq: CPPC: Add generic helpers for sysfs show/store



Add generic helper functions for u64 sysfs attributes that follow the
common pattern of calling CPPC get/set APIs:
 - cppc_cpufreq_sysfs_show_u64(): reads value and handles -EOPNOTSUPP
 - cppc_cpufreq_sysfs_store_u64(): parses input and calls set function

Add CPPC_CPUFREQ_ATTR_RW_U64() macro to generate show/store functions
using these helpers, reducing boilerplate for simple attributes.

Convert auto_act_window and energy_performance_preference_val to use
the new macro.

No functional changes.

Signed-off-by: default avatarSumit Gupta <sumitg@nvidia.com>
Reviewed-by: default avatarLifeng Zheng <zhenglifeng1@huawei.com>
[ rjw: Retained empty code line after a conditional ]
Link: https://patch.msgid.link/20260120145623.2959636-2-sumitg@nvidia.com


Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent b753c320
Loading
Loading
Loading
Loading
+25 −43
Original line number Diff line number Diff line
@@ -863,14 +863,13 @@ static ssize_t store_auto_select(struct cpufreq_policy *policy,
	return count;
}

static ssize_t show_auto_act_window(struct cpufreq_policy *policy, char *buf)
static ssize_t cppc_cpufreq_sysfs_show_u64(unsigned int cpu,
					   int (*get_func)(int, u64 *),
					   char *buf)
{
	u64 val;
	int ret;

	ret = cppc_get_auto_act_window(policy->cpu, &val);
	int ret = get_func((int)cpu, &val);

	/* show "<unsupported>" when this register is not supported by cpc */
	if (ret == -EOPNOTSUPP)
		return sysfs_emit(buf, "<unsupported>\n");

@@ -880,56 +879,39 @@ static ssize_t show_auto_act_window(struct cpufreq_policy *policy, char *buf)
	return sysfs_emit(buf, "%llu\n", val);
}

static ssize_t store_auto_act_window(struct cpufreq_policy *policy,
static ssize_t cppc_cpufreq_sysfs_store_u64(unsigned int cpu,
					    int (*set_func)(int, u64),
					    const char *buf, size_t count)
{
	u64 usec;
	u64 val;
	int ret;

	ret = kstrtou64(buf, 0, &usec);
	ret = kstrtou64(buf, 0, &val);
	if (ret)
		return ret;

	ret = cppc_set_auto_act_window(policy->cpu, usec);
	if (ret)
		return ret;
	ret = set_func((int)cpu, val);

	return count;
	return ret ? ret : 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);
#define CPPC_CPUFREQ_ATTR_RW_U64(_name, _get_func, _set_func)		\
static ssize_t show_##_name(struct cpufreq_policy *policy, char *buf)	\
{									\
	return cppc_cpufreq_sysfs_show_u64(policy->cpu, _get_func, buf);\
}									\
static ssize_t store_##_name(struct cpufreq_policy *policy,		\
			     const char *buf, size_t count)		\
{									\
	return cppc_cpufreq_sysfs_store_u64(policy->cpu, _set_func,	\
					    buf, count);		\
}

static ssize_t store_energy_performance_preference_val(struct cpufreq_policy *policy,
						       const char *buf, size_t count)
{
	u64 val;
	int ret;
CPPC_CPUFREQ_ATTR_RW_U64(auto_act_window, cppc_get_auto_act_window,
			 cppc_set_auto_act_window)

	ret = kstrtou64(buf, 0, &val);
	if (ret)
		return ret;

	ret = cppc_set_epp(policy->cpu, val);
	if (ret)
		return ret;

	return count;
}
CPPC_CPUFREQ_ATTR_RW_U64(energy_performance_preference_val,
			 cppc_get_epp_perf, cppc_set_epp)

cpufreq_freq_attr_ro(freqdomain_cpus);
cpufreq_freq_attr_rw(auto_select);