blob: 14f4e6336d88b7eab800163a665c38e34bdd7bb3 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001 CPU frequency and voltage scaling code in the Linux(TM) kernel
2
3
4 L i n u x C P U F r e q
5
6 C P U D r i v e r s
7
8 - information for developers -
9
10
11 Dominik Brodowski <linux@brodo.de>
12
13
14
15 Clock scaling allows you to change the clock speed of the CPUs on the
16 fly. This is a nice method to save battery power, because the lower
17 the clock speed, the less power the CPU consumes.
18
19
20Contents:
21---------
221. What To Do?
231.1 Initialization
241.2 Per-CPU Initialization
251.3 verify
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530261.4 target/target_index or setpolicy?
271.5 target/target_index
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281.6 setpolicy
Viresh Kumar1c03a2d2014-06-02 22:49:28 +0530291.7 get_intermediate and target_intermediate
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302. Frequency Table Helpers
31
32
33
341. What To Do?
35==============
36
37So, you just got a brand-new CPU / chipset with datasheets and want to
38add cpufreq support for this CPU / chipset? Great. Here are some hints
39on what is necessary:
40
41
421.1 Initialization
43------------------
44
45First of all, in an __initcall level 7 (module_init()) or later
46function check whether this kernel runs on the right CPU and the right
47chipset. If so, register a struct cpufreq_driver with the CPUfreq core
48using cpufreq_register_driver()
49
50What shall this struct cpufreq_driver contain?
51
52cpufreq_driver.name - The name of this driver.
53
Linus Torvalds1da177e2005-04-16 15:20:36 -070054cpufreq_driver.init - A pointer to the per-CPU initialization
55 function.
56
57cpufreq_driver.verify - A pointer to a "verification" function.
58
59cpufreq_driver.setpolicy _or_
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +053060cpufreq_driver.target/
61target_index - See below on the differences.
Linus Torvalds1da177e2005-04-16 15:20:36 -070062
63And optionally
64
Dirk Brandewie367dc4a2014-03-19 08:45:53 -070065cpufreq_driver.exit - A pointer to a per-CPU cleanup
66 function called during CPU_POST_DEAD
67 phase of cpu hotplug process.
68
69cpufreq_driver.stop_cpu - A pointer to a per-CPU stop function
70 called during CPU_DOWN_PREPARE phase of
71 cpu hotplug process.
Linus Torvalds1da177e2005-04-16 15:20:36 -070072
73cpufreq_driver.resume - A pointer to a per-CPU resume function
74 which is called with interrupts disabled
75 and _before_ the pre-suspend frequency
76 and/or policy is restored by a call to
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +053077 ->target/target_index or ->setpolicy.
Linus Torvalds1da177e2005-04-16 15:20:36 -070078
79cpufreq_driver.attr - A pointer to a NULL-terminated list of
80 "struct freq_attr" which allow to
81 export values to sysfs.
82
Viresh Kumar1c03a2d2014-06-02 22:49:28 +053083cpufreq_driver.get_intermediate
84and target_intermediate Used to switch to stable frequency while
85 changing CPU frequency.
86
Linus Torvalds1da177e2005-04-16 15:20:36 -070087
881.2 Per-CPU Initialization
89--------------------------
90
91Whenever a new CPU is registered with the device model, or after the
92cpufreq driver registers itself, the per-CPU initialization function
93cpufreq_driver.init is called. It takes a struct cpufreq_policy
94*policy as argument. What to do now?
95
96If necessary, activate the CPUfreq support on your CPU.
97
98Then, the driver must fill in the following values:
99
100policy->cpuinfo.min_freq _and_
101policy->cpuinfo.max_freq - the minimum and maximum frequency
102 (in kHz) which is supported by
103 this CPU
104policy->cpuinfo.transition_latency the time it takes on this CPU to
Mark Brownbbe237a2009-11-12 16:06:45 +0000105 switch between two frequencies in
106 nanoseconds (if appropriate, else
107 specify CPUFREQ_ETERNAL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108
109policy->cur The current operating frequency of
110 this CPU (if appropriate)
111policy->min,
112policy->max,
113policy->policy and, if necessary,
114policy->governor must contain the "default policy" for
115 this CPU. A few moments later,
116 cpufreq_driver.verify and either
117 cpufreq_driver.setpolicy or
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530118 cpufreq_driver.target/target_index is called
119 with these values.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120
Viresh Kumareb2f50f2013-04-01 12:57:48 +0000121For setting some of these values (cpuinfo.min[max]_freq, policy->min[max]), the
122frequency table helpers might be helpful. See the section 2 for more information
123on them.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
Viresh Kumar951fc5f2013-01-31 02:03:53 +0000125SMP systems normally have same clock source for a group of cpus. For these the
126.init() would be called only once for the first online cpu. Here the .init()
127routine must initialize policy->cpus with mask of all possible cpus (Online +
128Offline) that share the clock. Then the core would copy this mask onto
129policy->related_cpus and will reset policy->cpus to carry only online cpus.
130
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131
1321.3 verify
133------------
134
135When the user decides a new policy (consisting of
136"policy,governor,min,max") shall be set, this policy must be validated
137so that incompatible values can be corrected. For verifying these
138values, a frequency table helper and/or the
139cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned
140int min_freq, unsigned int max_freq) function might be helpful. See
141section 2 for details on frequency table helpers.
142
143You need to make sure that at least one valid frequency (or operating
144range) is within policy->min and policy->max. If necessary, increase
145policy->max first, and only if this is no solution, decrease policy->min.
146
147
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301481.4 target/target_index or setpolicy?
Linus Torvalds1da177e2005-04-16 15:20:36 -0700149----------------------------
150
151Most cpufreq drivers or even most cpu frequency scaling algorithms
152only allow the CPU to be set to one frequency. For these, you use the
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530153->target/target_index call.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700154
155Some cpufreq-capable processors switch the frequency between certain
156limits on their own. These shall use the ->setpolicy call
157
158
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301591.5. target/target_index
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160-------------
161
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530162The target_index call has two arguments: struct cpufreq_policy *policy,
163and unsigned int index (into the exposed frequency table).
164
165The CPUfreq driver must set the new frequency when called here. The
166actual frequency must be determined by freq_table[index].frequency.
167
Viresh Kumar1c03a2d2014-06-02 22:49:28 +0530168It should always restore to earlier frequency (i.e. policy->restore_freq) in
169case of errors, even if we switched to intermediate frequency earlier.
170
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530171Deprecated:
172----------
Linus Torvalds1da177e2005-04-16 15:20:36 -0700173The target call has three arguments: struct cpufreq_policy *policy,
174unsigned int target_frequency, unsigned int relation.
175
176The CPUfreq driver must set the new frequency when called here. The
177actual frequency must be determined using the following rules:
178
179- keep close to "target_freq"
180- policy->min <= new_freq <= policy->max (THIS MUST BE VALID!!!)
181- if relation==CPUFREQ_REL_L, try to select a new_freq higher than or equal
182 target_freq. ("L for lowest, but no lower than")
183- if relation==CPUFREQ_REL_H, try to select a new_freq lower than or equal
184 target_freq. ("H for highest, but no higher than")
185
Chumbalkar Nagananda51555c02009-05-21 23:29:48 +0000186Here again the frequency table helper might assist you - see section 2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187for details.
188
189
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301901.6 setpolicy
Linus Torvalds1da177e2005-04-16 15:20:36 -0700191---------------
192
193The setpolicy call only takes a struct cpufreq_policy *policy as
194argument. You need to set the lower limit of the in-processor or
195in-chipset dynamic frequency switching to policy->min, the upper limit
196to policy->max, and -if supported- select a performance-oriented
197setting when policy->policy is CPUFREQ_POLICY_PERFORMANCE, and a
198powersaving-oriented setting when CPUFREQ_POLICY_POWERSAVE. Also check
Wanlong Gao25eb6502011-06-13 17:53:53 +0800199the reference implementation in drivers/cpufreq/longrun.c
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05302011.7 get_intermediate and target_intermediate
202--------------------------------------------
203
204Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION unset.
205
206get_intermediate should return a stable intermediate frequency platform wants to
207switch to, and target_intermediate() should set CPU to to that frequency, before
208jumping to the frequency corresponding to 'index'. Core will take care of
209sending notifications and driver doesn't have to handle them in
210target_intermediate() or target_index().
211
212Drivers can return '0' from get_intermediate() in case they don't wish to switch
213to intermediate frequency for some target frequency. In that case core will
214directly call ->target_index().
215
216NOTE: ->target_index() should restore to policy->restore_freq in case of
217failures as core would send notifications for that.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218
219
2202. Frequency Table Helpers
221==========================
222
223As most cpufreq processors only allow for being set to a few specific
224frequencies, a "frequency table" with some functions might assist in
225some work of the processor driver. Such a "frequency table" consists
Viresh Kumar3a7818e2013-04-01 12:57:42 +0000226of an array of struct cpufreq_frequency_table entries, with any value in
Viresh Kumar50701582013-03-30 16:25:15 +0530227"driver_data" you want to use, and the corresponding frequency in
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228"frequency". At the end of the table, you need to add a
Viresh Kumar3a7818e2013-04-01 12:57:42 +0000229cpufreq_frequency_table entry with frequency set to CPUFREQ_TABLE_END. And
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230if you want to skip one entry in the table, set the frequency to
231CPUFREQ_ENTRY_INVALID. The entries don't need to be in ascending
232order.
233
234By calling cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
235 struct cpufreq_frequency_table *table);
236the cpuinfo.min_freq and cpuinfo.max_freq values are detected, and
237policy->min and policy->max are set to the same values. This is
238helpful for the per-CPU initialization stage.
239
240int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
241 struct cpufreq_frequency_table *table);
242assures that at least one valid frequency is within policy->min and
243policy->max, and all other criteria are met. This is helpful for the
244->verify call.
245
246int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
247 struct cpufreq_frequency_table *table,
248 unsigned int target_freq,
249 unsigned int relation,
250 unsigned int *index);
251
252is the corresponding frequency table helper for the ->target
253stage. Just pass the values to this function, and the unsigned int
254index returns the number of the frequency table entry which contains
Viresh Kumar50701582013-03-30 16:25:15 +0530255the frequency the CPU shall be set to.
Stratos Karafotis27e289d2014-04-25 23:15:23 +0300256
257The following macros can be used as iterators over cpufreq_frequency_table:
258
259cpufreq_for_each_entry(pos, table) - iterates over all entries of frequency
260table.
261
262cpufreq-for_each_valid_entry(pos, table) - iterates over all entries,
263excluding CPUFREQ_ENTRY_INVALID frequencies.
264Use arguments "pos" - a cpufreq_frequency_table * as a loop cursor and
265"table" - the cpufreq_frequency_table * you want to iterate over.
266
267For example:
268
269 struct cpufreq_frequency_table *pos, *driver_freq_table;
270
271 cpufreq_for_each_entry(pos, driver_freq_table) {
272 /* Do something with pos */
273 pos->frequency = ...
274 }