Skip to content

Commit 24b6616

Browse files
Tero Kristojwrdegoede
authored andcommitted
platform/x86/intel-uncore-freq: Add efficiency latency control to sysfs interface
Add the TPMI efficiency latency control fields to the sysfs interface. The sysfs files are mapped to the TPMI uncore driver via the registered uncore_read and uncore_write driver callbacks. These fields are not populated on older non TPMI hardware. Signed-off-by: Tero Kristo <[email protected]> Reviewed-by: Ilpo Järvinen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Hans de Goede <[email protected]>
1 parent bb516dc commit 24b6616

File tree

2 files changed

+49
-6
lines changed

2 files changed

+49
-6
lines changed

drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,16 @@ static ssize_t show_attr(struct uncore_data *data, char *buf, enum uncore_index
6060
static ssize_t store_attr(struct uncore_data *data, const char *buf, ssize_t count,
6161
enum uncore_index index)
6262
{
63-
unsigned int input;
63+
unsigned int input = 0;
6464
int ret;
6565

66-
if (kstrtouint(buf, 10, &input))
67-
return -EINVAL;
66+
if (index == UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD_ENABLE) {
67+
if (kstrtobool(buf, (bool *)&input))
68+
return -EINVAL;
69+
} else {
70+
if (kstrtouint(buf, 10, &input))
71+
return -EINVAL;
72+
}
6873

6974
mutex_lock(&uncore_lock);
7075
ret = uncore_write(data, input, index);
@@ -103,6 +108,18 @@ show_uncore_attr(max_freq_khz, UNCORE_INDEX_MAX_FREQ);
103108

104109
show_uncore_attr(current_freq_khz, UNCORE_INDEX_CURRENT_FREQ);
105110

111+
store_uncore_attr(elc_low_threshold_percent, UNCORE_INDEX_EFF_LAT_CTRL_LOW_THRESHOLD);
112+
store_uncore_attr(elc_high_threshold_percent, UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD);
113+
store_uncore_attr(elc_high_threshold_enable,
114+
UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD_ENABLE);
115+
store_uncore_attr(elc_floor_freq_khz, UNCORE_INDEX_EFF_LAT_CTRL_FREQ);
116+
117+
show_uncore_attr(elc_low_threshold_percent, UNCORE_INDEX_EFF_LAT_CTRL_LOW_THRESHOLD);
118+
show_uncore_attr(elc_high_threshold_percent, UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD);
119+
show_uncore_attr(elc_high_threshold_enable,
120+
UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD_ENABLE);
121+
show_uncore_attr(elc_floor_freq_khz, UNCORE_INDEX_EFF_LAT_CTRL_FREQ);
122+
106123
#define show_uncore_data(member_name) \
107124
static ssize_t show_##member_name(struct kobject *kobj, \
108125
struct kobj_attribute *attr, char *buf)\
@@ -146,7 +163,8 @@ show_uncore_data(initial_max_freq_khz);
146163

147164
static int create_attr_group(struct uncore_data *data, char *name)
148165
{
149-
int ret, freq, index = 0;
166+
int ret, index = 0;
167+
unsigned int val;
150168

151169
init_attribute_rw(max_freq_khz);
152170
init_attribute_rw(min_freq_khz);
@@ -168,10 +186,24 @@ static int create_attr_group(struct uncore_data *data, char *name)
168186
data->uncore_attrs[index++] = &data->initial_min_freq_khz_kobj_attr.attr;
169187
data->uncore_attrs[index++] = &data->initial_max_freq_khz_kobj_attr.attr;
170188

171-
ret = uncore_read(data, &freq, UNCORE_INDEX_CURRENT_FREQ);
189+
ret = uncore_read(data, &val, UNCORE_INDEX_CURRENT_FREQ);
172190
if (!ret)
173191
data->uncore_attrs[index++] = &data->current_freq_khz_kobj_attr.attr;
174192

193+
ret = uncore_read(data, &val, UNCORE_INDEX_EFF_LAT_CTRL_LOW_THRESHOLD);
194+
if (!ret) {
195+
init_attribute_rw(elc_low_threshold_percent);
196+
init_attribute_rw(elc_high_threshold_percent);
197+
init_attribute_rw(elc_high_threshold_enable);
198+
init_attribute_rw(elc_floor_freq_khz);
199+
200+
data->uncore_attrs[index++] = &data->elc_low_threshold_percent_kobj_attr.attr;
201+
data->uncore_attrs[index++] = &data->elc_high_threshold_percent_kobj_attr.attr;
202+
data->uncore_attrs[index++] =
203+
&data->elc_high_threshold_enable_kobj_attr.attr;
204+
data->uncore_attrs[index++] = &data->elc_floor_freq_khz_kobj_attr.attr;
205+
}
206+
175207
data->uncore_attrs[index] = NULL;
176208

177209
data->uncore_attr_group.name = name;

drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@
3434
* @domain_id_kobj_attr: Storage for kobject attribute domain_id
3535
* @fabric_cluster_id_kobj_attr: Storage for kobject attribute fabric_cluster_id
3636
* @package_id_kobj_attr: Storage for kobject attribute package_id
37+
* @elc_low_threshold_percent_kobj_attr:
38+
Storage for kobject attribute elc_low_threshold_percent
39+
* @elc_high_threshold_percent_kobj_attr:
40+
Storage for kobject attribute elc_high_threshold_percent
41+
* @elc_high_threshold_enable_kobj_attr:
42+
Storage for kobject attribute elc_high_threshold_enable
43+
* @elc_floor_freq_khz_kobj_attr: Storage for kobject attribute elc_floor_freq_khz
3744
* @uncore_attrs: Attribute storage for group creation
3845
*
3946
* This structure is used to encapsulate all data related to uncore sysfs
@@ -61,7 +68,11 @@ struct uncore_data {
6168
struct kobj_attribute domain_id_kobj_attr;
6269
struct kobj_attribute fabric_cluster_id_kobj_attr;
6370
struct kobj_attribute package_id_kobj_attr;
64-
struct attribute *uncore_attrs[9];
71+
struct kobj_attribute elc_low_threshold_percent_kobj_attr;
72+
struct kobj_attribute elc_high_threshold_percent_kobj_attr;
73+
struct kobj_attribute elc_high_threshold_enable_kobj_attr;
74+
struct kobj_attribute elc_floor_freq_khz_kobj_attr;
75+
struct attribute *uncore_attrs[13];
6576
};
6677

6778
#define UNCORE_DOMAIN_ID_INVALID -1

0 commit comments

Comments
 (0)