@@ -54,28 +54,15 @@ static int em_debug_cpus_show(struct seq_file *s, void *unused)
5454}
5555DEFINE_SHOW_ATTRIBUTE (em_debug_cpus );
5656
57- static int em_debug_units_show (struct seq_file * s , void * unused )
57+ static int em_debug_flags_show (struct seq_file * s , void * unused )
5858{
5959 struct em_perf_domain * pd = s -> private ;
60- char * units = (pd -> flags & EM_PERF_DOMAIN_MILLIWATTS ) ?
61- "milliWatts" : "bogoWatts" ;
6260
63- seq_printf (s , "%s \n" , units );
61+ seq_printf (s , "%#lx \n" , pd -> flags );
6462
6563 return 0 ;
6664}
67- DEFINE_SHOW_ATTRIBUTE (em_debug_units );
68-
69- static int em_debug_skip_inefficiencies_show (struct seq_file * s , void * unused )
70- {
71- struct em_perf_domain * pd = s -> private ;
72- int enabled = (pd -> flags & EM_PERF_DOMAIN_SKIP_INEFFICIENCIES ) ? 1 : 0 ;
73-
74- seq_printf (s , "%d\n" , enabled );
75-
76- return 0 ;
77- }
78- DEFINE_SHOW_ATTRIBUTE (em_debug_skip_inefficiencies );
65+ DEFINE_SHOW_ATTRIBUTE (em_debug_flags );
7966
8067static void em_debug_create_pd (struct device * dev )
8168{
@@ -89,9 +76,8 @@ static void em_debug_create_pd(struct device *dev)
8976 debugfs_create_file ("cpus" , 0444 , d , dev -> em_pd -> cpus ,
9077 & em_debug_cpus_fops );
9178
92- debugfs_create_file ("units" , 0444 , d , dev -> em_pd , & em_debug_units_fops );
93- debugfs_create_file ("skip-inefficiencies" , 0444 , d , dev -> em_pd ,
94- & em_debug_skip_inefficiencies_fops );
79+ debugfs_create_file ("flags" , 0444 , d , dev -> em_pd ,
80+ & em_debug_flags_fops );
9581
9682 /* Create a sub-directory for each performance state */
9783 for (i = 0 ; i < dev -> em_pd -> nr_perf_states ; i ++ )
@@ -121,7 +107,8 @@ static void em_debug_remove_pd(struct device *dev) {}
121107#endif
122108
123109static int em_create_perf_table (struct device * dev , struct em_perf_domain * pd ,
124- int nr_states , struct em_data_callback * cb )
110+ int nr_states , struct em_data_callback * cb ,
111+ unsigned long flags )
125112{
126113 unsigned long power , freq , prev_freq = 0 , prev_cost = ULONG_MAX ;
127114 struct em_perf_state * table ;
@@ -139,7 +126,7 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
139126 * lowest performance state of 'dev' above 'freq' and updates
140127 * 'power' and 'freq' accordingly.
141128 */
142- ret = cb -> active_power (& power , & freq , dev );
129+ ret = cb -> active_power (dev , & power , & freq );
143130 if (ret ) {
144131 dev_err (dev , "EM: invalid perf. state: %d\n" ,
145132 ret );
@@ -173,10 +160,22 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
173160 /* Compute the cost of each performance state. */
174161 fmax = (u64 ) table [nr_states - 1 ].frequency ;
175162 for (i = nr_states - 1 ; i >= 0 ; i -- ) {
176- unsigned long power_res = em_scale_power (table [i ].power );
163+ unsigned long power_res , cost ;
164+
165+ if (flags & EM_PERF_DOMAIN_ARTIFICIAL ) {
166+ ret = cb -> get_cost (dev , table [i ].frequency , & cost );
167+ if (ret || !cost || cost > EM_MAX_POWER ) {
168+ dev_err (dev , "EM: invalid cost %lu %d\n" ,
169+ cost , ret );
170+ goto free_ps_table ;
171+ }
172+ } else {
173+ power_res = em_scale_power (table [i ].power );
174+ cost = div64_u64 (fmax * power_res , table [i ].frequency );
175+ }
176+
177+ table [i ].cost = cost ;
177178
178- table [i ].cost = div64_u64 (fmax * power_res ,
179- table [i ].frequency );
180179 if (table [i ].cost >= prev_cost ) {
181180 table [i ].flags = EM_PERF_STATE_INEFFICIENT ;
182181 dev_dbg (dev , "EM: OPP:%lu is inefficient\n" ,
@@ -197,7 +196,8 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
197196}
198197
199198static int em_create_pd (struct device * dev , int nr_states ,
200- struct em_data_callback * cb , cpumask_t * cpus )
199+ struct em_data_callback * cb , cpumask_t * cpus ,
200+ unsigned long flags )
201201{
202202 struct em_perf_domain * pd ;
203203 struct device * cpu_dev ;
@@ -215,7 +215,7 @@ static int em_create_pd(struct device *dev, int nr_states,
215215 return - ENOMEM ;
216216 }
217217
218- ret = em_create_perf_table (dev , pd , nr_states , cb );
218+ ret = em_create_perf_table (dev , pd , nr_states , cb , flags );
219219 if (ret ) {
220220 kfree (pd );
221221 return ret ;
@@ -332,6 +332,7 @@ int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states,
332332 bool milliwatts )
333333{
334334 unsigned long cap , prev_cap = 0 ;
335+ unsigned long flags = 0 ;
335336 int cpu , ret ;
336337
337338 if (!dev || !nr_states || !cb )
@@ -378,12 +379,16 @@ int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states,
378379 }
379380 }
380381
381- ret = em_create_pd (dev , nr_states , cb , cpus );
382+ if (milliwatts )
383+ flags |= EM_PERF_DOMAIN_MILLIWATTS ;
384+ else if (cb -> get_cost )
385+ flags |= EM_PERF_DOMAIN_ARTIFICIAL ;
386+
387+ ret = em_create_pd (dev , nr_states , cb , cpus , flags );
382388 if (ret )
383389 goto unlock ;
384390
385- if (milliwatts )
386- dev -> em_pd -> flags |= EM_PERF_DOMAIN_MILLIWATTS ;
391+ dev -> em_pd -> flags |= flags ;
387392
388393 em_cpufreq_update_efficiencies (dev );
389394
0 commit comments