@@ -19,9 +19,8 @@ static int uncore_instance_count;
1919static 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
2625static 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
177164static 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}
270273EXPORT_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 );
0 commit comments