Skip to content

Commit a864659

Browse files
committed
Merge: Add efficiency latency control support to the TPMI uncore driver
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/5277 JIRA: https://issues.redhat.com/browse/RHEL-46062 Signed-off-by: David Arcari <darcari@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Rado Vrbovsky <rvrbovsk@redhat.com>
2 parents f5817ff + b6a7b4a commit a864659

File tree

4 files changed

+381
-142
lines changed

4 files changed

+381
-142
lines changed

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

Lines changed: 62 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ static int uncore_instance_count;
1919
static DEFINE_IDA(intel_uncore_ida);
2020

2121
/* callbacks for actual HW read/write */
22-
static int (*uncore_read)(struct uncore_data *data, unsigned int *min, unsigned int *max);
23-
static int (*uncore_write)(struct uncore_data *data, unsigned int input, unsigned int min_max);
24-
static int (*uncore_read_freq)(struct uncore_data *data, unsigned int *freq);
22+
static int (*uncore_read)(struct uncore_data *data, unsigned int *value, enum uncore_index index);
23+
static int (*uncore_write)(struct uncore_data *data, unsigned int input, enum uncore_index index);
2524

2625
static ssize_t show_domain_id(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
2726
{
@@ -44,36 +43,36 @@ static ssize_t show_package_id(struct kobject *kobj, struct kobj_attribute *attr
4443
return sprintf(buf, "%u\n", data->package_id);
4544
}
4645

47-
static ssize_t show_min_max_freq_khz(struct uncore_data *data,
48-
char *buf, int min_max)
46+
static ssize_t show_attr(struct uncore_data *data, char *buf, enum uncore_index index)
4947
{
50-
unsigned int min, max;
48+
unsigned int value;
5149
int ret;
5250

5351
mutex_lock(&uncore_lock);
54-
ret = uncore_read(data, &min, &max);
52+
ret = uncore_read(data, &value, index);
5553
mutex_unlock(&uncore_lock);
5654
if (ret)
5755
return ret;
5856

59-
if (min_max)
60-
return sprintf(buf, "%u\n", max);
61-
62-
return sprintf(buf, "%u\n", min);
57+
return sprintf(buf, "%u\n", value);
6358
}
6459

65-
static ssize_t store_min_max_freq_khz(struct uncore_data *data,
66-
const char *buf, ssize_t count,
67-
int min_max)
60+
static ssize_t store_attr(struct uncore_data *data, const char *buf, ssize_t count,
61+
enum uncore_index index)
6862
{
69-
unsigned int input;
63+
unsigned int input = 0;
7064
int ret;
7165

72-
if (kstrtouint(buf, 10, &input))
73-
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+
}
7473

7574
mutex_lock(&uncore_lock);
76-
ret = uncore_write(data, input, min_max);
75+
ret = uncore_write(data, input, index);
7776
mutex_unlock(&uncore_lock);
7877

7978
if (ret)
@@ -82,56 +81,44 @@ static ssize_t store_min_max_freq_khz(struct uncore_data *data,
8281
return count;
8382
}
8483

85-
static ssize_t show_perf_status_freq_khz(struct uncore_data *data, char *buf)
86-
{
87-
unsigned int freq;
88-
int ret;
89-
90-
mutex_lock(&uncore_lock);
91-
ret = uncore_read_freq(data, &freq);
92-
mutex_unlock(&uncore_lock);
93-
if (ret)
94-
return ret;
95-
96-
return sprintf(buf, "%u\n", freq);
97-
}
98-
99-
#define store_uncore_min_max(name, min_max) \
84+
#define store_uncore_attr(name, index) \
10085
static ssize_t store_##name(struct kobject *kobj, \
10186
struct kobj_attribute *attr, \
10287
const char *buf, size_t count) \
10388
{ \
10489
struct uncore_data *data = container_of(attr, struct uncore_data, name##_kobj_attr);\
10590
\
106-
return store_min_max_freq_khz(data, buf, count, \
107-
min_max); \
91+
return store_attr(data, buf, count, index); \
10892
}
10993

110-
#define show_uncore_min_max(name, min_max) \
94+
#define show_uncore_attr(name, index) \
11195
static ssize_t show_##name(struct kobject *kobj, \
11296
struct kobj_attribute *attr, char *buf)\
11397
{ \
11498
struct uncore_data *data = container_of(attr, struct uncore_data, name##_kobj_attr);\
11599
\
116-
return show_min_max_freq_khz(data, buf, min_max); \
100+
return show_attr(data, buf, index); \
117101
}
118102

119-
#define show_uncore_perf_status(name) \
120-
static ssize_t show_##name(struct kobject *kobj, \
121-
struct kobj_attribute *attr, char *buf)\
122-
{ \
123-
struct uncore_data *data = container_of(attr, struct uncore_data, name##_kobj_attr);\
124-
\
125-
return show_perf_status_freq_khz(data, buf); \
126-
}
103+
store_uncore_attr(min_freq_khz, UNCORE_INDEX_MIN_FREQ);
104+
store_uncore_attr(max_freq_khz, UNCORE_INDEX_MAX_FREQ);
105+
106+
show_uncore_attr(min_freq_khz, UNCORE_INDEX_MIN_FREQ);
107+
show_uncore_attr(max_freq_khz, UNCORE_INDEX_MAX_FREQ);
127108

128-
store_uncore_min_max(min_freq_khz, 0);
129-
store_uncore_min_max(max_freq_khz, 1);
109+
show_uncore_attr(current_freq_khz, UNCORE_INDEX_CURRENT_FREQ);
130110

131-
show_uncore_min_max(min_freq_khz, 0);
132-
show_uncore_min_max(max_freq_khz, 1);
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);
133116

134-
show_uncore_perf_status(current_freq_khz);
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);
135122

136123
#define show_uncore_data(member_name) \
137124
static ssize_t show_##member_name(struct kobject *kobj, \
@@ -176,7 +163,8 @@ show_uncore_data(initial_max_freq_khz);
176163

177164
static int create_attr_group(struct uncore_data *data, char *name)
178165
{
179-
int ret, freq, index = 0;
166+
int ret, index = 0;
167+
unsigned int val;
180168

181169
init_attribute_rw(max_freq_khz);
182170
init_attribute_rw(min_freq_khz);
@@ -198,10 +186,24 @@ static int create_attr_group(struct uncore_data *data, char *name)
198186
data->uncore_attrs[index++] = &data->initial_min_freq_khz_kobj_attr.attr;
199187
data->uncore_attrs[index++] = &data->initial_max_freq_khz_kobj_attr.attr;
200188

201-
ret = uncore_read_freq(data, &freq);
189+
ret = uncore_read(data, &val, UNCORE_INDEX_CURRENT_FREQ);
202190
if (!ret)
203191
data->uncore_attrs[index++] = &data->current_freq_khz_kobj_attr.attr;
204192

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+
205207
data->uncore_attrs[index] = NULL;
206208

207209
data->uncore_attr_group.name = name;
@@ -238,7 +240,8 @@ int uncore_freq_add_entry(struct uncore_data *data, int cpu)
238240
sprintf(data->name, "package_%02d_die_%02d", data->package_id, data->die_id);
239241
}
240242

241-
uncore_read(data, &data->initial_min_freq_khz, &data->initial_max_freq_khz);
243+
uncore_read(data, &data->initial_min_freq_khz, UNCORE_INDEX_MIN_FREQ);
244+
uncore_read(data, &data->initial_max_freq_khz, UNCORE_INDEX_MAX_FREQ);
242245

243246
ret = create_attr_group(data, data->name);
244247
if (ret) {
@@ -269,15 +272,15 @@ void uncore_freq_remove_die_entry(struct uncore_data *data)
269272
}
270273
EXPORT_SYMBOL_NS_GPL(uncore_freq_remove_die_entry, INTEL_UNCORE_FREQUENCY);
271274

272-
int uncore_freq_common_init(int (*read_control_freq)(struct uncore_data *data, unsigned int *min, unsigned int *max),
273-
int (*write_control_freq)(struct uncore_data *data, unsigned int input, unsigned int set_max),
274-
int (*read_freq)(struct uncore_data *data, unsigned int *freq))
275+
int uncore_freq_common_init(int (*read)(struct uncore_data *data, unsigned int *value,
276+
enum uncore_index index),
277+
int (*write)(struct uncore_data *data, unsigned int input,
278+
enum uncore_index index))
275279
{
276280
mutex_lock(&uncore_lock);
277281

278-
uncore_read = read_control_freq;
279-
uncore_write = write_control_freq;
280-
uncore_read_freq = read_freq;
282+
uncore_read = read;
283+
uncore_write = write;
281284

282285
if (!uncore_root_kobj) {
283286
struct device *dev_root = bus_get_dev_root(&cpu_subsys);

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

Lines changed: 26 additions & 4 deletions
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,14 +68,29 @@ 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
6879

69-
int uncore_freq_common_init(int (*read_control_freq)(struct uncore_data *data, unsigned int *min, unsigned int *max),
70-
int (*write_control_freq)(struct uncore_data *data, unsigned int input, unsigned int min_max),
71-
int (*uncore_read_freq)(struct uncore_data *data, unsigned int *freq));
80+
enum uncore_index {
81+
UNCORE_INDEX_MIN_FREQ,
82+
UNCORE_INDEX_MAX_FREQ,
83+
UNCORE_INDEX_CURRENT_FREQ,
84+
UNCORE_INDEX_EFF_LAT_CTRL_LOW_THRESHOLD,
85+
UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD,
86+
UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD_ENABLE,
87+
UNCORE_INDEX_EFF_LAT_CTRL_FREQ,
88+
};
89+
90+
int uncore_freq_common_init(int (*read)(struct uncore_data *data, unsigned int *value,
91+
enum uncore_index index),
92+
int (*write)(struct uncore_data *data, unsigned int input,
93+
enum uncore_index index));
7294
void uncore_freq_common_exit(void);
7395
int uncore_freq_add_entry(struct uncore_data *data, int cpu);
7496
void uncore_freq_remove_die_entry(struct uncore_data *data);

0 commit comments

Comments
 (0)