1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef _CPUFREQ_GOVERNOR_H
18#define _CPUFREQ_GOVERNOR_H
19
20#include <linux/cpufreq.h>
21#include <linux/sched/cpufreq.h>
22#include <linux/kernel_stat.h>
23#include <linux/module.h>
24#include <linux/mutex.h>
25
26
27
28
29
30
31
32
33
34
35#define MIN_SAMPLING_RATE_RATIO (2)
36#define LATENCY_MULTIPLIER (1000)
37#define MIN_LATENCY_MULTIPLIER (20)
38#define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000)
39
40
41enum {OD_NORMAL_SAMPLE, OD_SUB_SAMPLE};
42
43
44
45
46
47
48
49
50
51#define gov_sys_attr_ro(_name) \
52static struct global_attr _name##_gov_sys = \
53__ATTR(_name, 0444, show_##_name##_gov_sys, NULL)
54
55#define gov_sys_attr_rw(_name) \
56static struct global_attr _name##_gov_sys = \
57__ATTR(_name, 0644, show_##_name##_gov_sys, store_##_name##_gov_sys)
58
59#define gov_pol_attr_ro(_name) \
60static struct freq_attr _name##_gov_pol = \
61__ATTR(_name, 0444, show_##_name##_gov_pol, NULL)
62
63#define gov_pol_attr_rw(_name) \
64static struct freq_attr _name##_gov_pol = \
65__ATTR(_name, 0644, show_##_name##_gov_pol, store_##_name##_gov_pol)
66
67#define gov_sys_pol_attr_rw(_name) \
68 gov_sys_attr_rw(_name); \
69 gov_pol_attr_rw(_name)
70
71#define gov_sys_pol_attr_ro(_name) \
72 gov_sys_attr_ro(_name); \
73 gov_pol_attr_ro(_name)
74
75
76#define show_one(_gov, file_name) \
77static ssize_t show_##file_name##_gov_sys \
78(struct kobject *kobj, struct attribute *attr, char *buf) \
79{ \
80 struct _gov##_dbs_tuners *tuners = _gov##_dbs_cdata.gdbs_data->tuners; \
81 return sprintf(buf, "%u\n", tuners->file_name); \
82} \
83 \
84static ssize_t show_##file_name##_gov_pol \
85(struct cpufreq_policy *policy, char *buf) \
86{ \
87 struct dbs_data *dbs_data = policy->governor_data; \
88 struct _gov##_dbs_tuners *tuners = dbs_data->tuners; \
89 return sprintf(buf, "%u\n", tuners->file_name); \
90}
91
92#define store_one(_gov, file_name) \
93static ssize_t store_##file_name##_gov_sys \
94(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count) \
95{ \
96 struct dbs_data *dbs_data = _gov##_dbs_cdata.gdbs_data; \
97 return store_##file_name(dbs_data, buf, count); \
98} \
99 \
100static ssize_t store_##file_name##_gov_pol \
101(struct cpufreq_policy *policy, const char *buf, size_t count) \
102{ \
103 struct dbs_data *dbs_data = policy->governor_data; \
104 return store_##file_name(dbs_data, buf, count); \
105}
106
107#define show_store_one(_gov, file_name) \
108show_one(_gov, file_name); \
109store_one(_gov, file_name)
110
111
112#define define_get_cpu_dbs_routines(_dbs_info) \
113static struct cpu_dbs_common_info *get_cpu_cdbs(int cpu) \
114{ \
115 return &per_cpu(_dbs_info, cpu).cdbs; \
116} \
117 \
118static void *get_cpu_dbs_info_s(int cpu) \
119{ \
120 return &per_cpu(_dbs_info, cpu); \
121}
122
123
124
125
126
127
128
129
130
131
132
133struct cpu_dbs_common_info {
134 int cpu;
135 u64 prev_cpu_idle;
136 u64 prev_cpu_wall;
137 u64 prev_cpu_nice;
138
139
140
141
142
143
144 unsigned int prev_load;
145 struct cpufreq_policy *cur_policy;
146 struct delayed_work work;
147
148
149
150
151
152 struct mutex timer_mutex;
153 ktime_t time_stamp;
154};
155
156struct od_cpu_dbs_info_s {
157 struct cpu_dbs_common_info cdbs;
158 struct cpufreq_frequency_table *freq_table;
159 unsigned int freq_lo;
160 unsigned int freq_lo_jiffies;
161 unsigned int freq_hi_jiffies;
162 unsigned int rate_mult;
163 unsigned int sample_type:1;
164};
165
166struct cs_cpu_dbs_info_s {
167 struct cpu_dbs_common_info cdbs;
168 unsigned int down_skip;
169 unsigned int requested_freq;
170 unsigned int enable:1;
171};
172
173
174struct od_dbs_tuners {
175 unsigned int ignore_nice_load;
176 unsigned int sampling_rate;
177 unsigned int sampling_down_factor;
178 unsigned int up_threshold;
179 unsigned int powersave_bias;
180 unsigned int io_is_busy;
181};
182
183struct cs_dbs_tuners {
184 unsigned int ignore_nice_load;
185 unsigned int sampling_rate;
186 unsigned int sampling_down_factor;
187 unsigned int up_threshold;
188 unsigned int down_threshold;
189 unsigned int freq_step;
190};
191
192
193struct dbs_data;
194struct common_dbs_data {
195
196 #define GOV_ONDEMAND 0
197 #define GOV_CONSERVATIVE 1
198 int governor;
199 struct attribute_group *attr_group_gov_sys;
200 struct attribute_group *attr_group_gov_pol;
201
202
203
204
205
206 struct dbs_data *gdbs_data;
207
208 struct cpu_dbs_common_info *(*get_cpu_cdbs)(int cpu);
209 void *(*get_cpu_dbs_info_s)(int cpu);
210 void (*gov_dbs_timer)(struct work_struct *work);
211 void (*gov_check_cpu)(int cpu, unsigned int load);
212 int (*init)(struct dbs_data *dbs_data, bool notify);
213 void (*exit)(struct dbs_data *dbs_data, bool notify);
214
215
216 void *gov_ops;
217
218
219
220
221 struct mutex mutex;
222};
223
224
225struct dbs_data {
226 struct common_dbs_data *cdata;
227 unsigned int min_sampling_rate;
228 int usage_count;
229 void *tuners;
230};
231
232
233struct od_ops {
234 void (*powersave_bias_init_cpu)(int cpu);
235 unsigned int (*powersave_bias_target)(struct cpufreq_policy *policy,
236 unsigned int freq_next, unsigned int relation);
237 void (*freq_increase)(struct cpufreq_policy *policy, unsigned int freq);
238};
239
240static inline int delay_for_sampling_rate(unsigned int sampling_rate)
241{
242 int delay = usecs_to_jiffies(sampling_rate);
243
244
245 if (num_online_cpus() > 1)
246 delay -= jiffies % delay;
247
248 return delay;
249}
250
251#define declare_show_sampling_rate_min(_gov) \
252static ssize_t show_sampling_rate_min_gov_sys \
253(struct kobject *kobj, struct attribute *attr, char *buf) \
254{ \
255 struct dbs_data *dbs_data = _gov##_dbs_cdata.gdbs_data; \
256 return sprintf(buf, "%u\n", dbs_data->min_sampling_rate); \
257} \
258 \
259static ssize_t show_sampling_rate_min_gov_pol \
260(struct cpufreq_policy *policy, char *buf) \
261{ \
262 struct dbs_data *dbs_data = policy->governor_data; \
263 return sprintf(buf, "%u\n", dbs_data->min_sampling_rate); \
264}
265
266extern struct mutex cpufreq_governor_lock;
267
268void dbs_check_cpu(struct dbs_data *dbs_data, int cpu);
269bool need_load_eval(struct cpu_dbs_common_info *cdbs,
270 unsigned int sampling_rate);
271int cpufreq_governor_dbs(struct cpufreq_policy *policy,
272 struct common_dbs_data *cdata, unsigned int event);
273void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy,
274 unsigned int delay, bool all_cpus);
275void od_register_powersave_bias_handler(unsigned int (*f)
276 (struct cpufreq_policy *, unsigned int, unsigned int),
277 unsigned int powersave_bias);
278void od_unregister_powersave_bias_handler(void);
279#endif
280