Merge branch 'linux-5.5' of git://github.com/skeggsb/linux into drm-fixes
[linux-2.6-block.git] / Documentation / power / opp.rst
CommitLineData
151f4e2b 1==========================================
4b875810
NM
2Operating Performance Points (OPP) Library
3==========================================
e1f60b29
NM
4
5(C) 2009-2010 Nishanth Menon <nm@ti.com>, Texas Instruments Incorporated
6
151f4e2b
MCC
7.. Contents
8
9 1. Introduction
10 2. Initial OPP List Registration
11 3. OPP Search Functions
12 4. OPP Availability Control Functions
13 5. OPP Data Retrieval Functions
14 6. Data Structures
e1f60b29
NM
15
161. Introduction
17===============
151f4e2b 18
4b875810 191.1 What is an Operating Performance Point (OPP)?
151f4e2b 20-------------------------------------------------
4b875810 21
e1f60b29
NM
22Complex SoCs of today consists of a multiple sub-modules working in conjunction.
23In an operational system executing varied use cases, not all modules in the SoC
24need to function at their highest performing frequency all the time. To
25facilitate this, sub-modules in a SoC are grouped into domains, allowing some
4b875810
NM
26domains to run at lower voltage and frequency while other domains run at
27voltage/frequency pairs that are higher.
28
29The set of discrete tuples consisting of frequency and voltage pairs that
e1f60b29
NM
30the device will support per domain are called Operating Performance Points or
31OPPs.
32
4b875810 33As an example:
151f4e2b 34
4b875810
NM
35Let us consider an MPU device which supports the following:
36{300MHz at minimum voltage of 1V}, {800MHz at minimum voltage of 1.2V},
37{1GHz at minimum voltage of 1.3V}
38
39We can represent these as three OPPs as the following {Hz, uV} tuples:
151f4e2b
MCC
40
41- {300000000, 1000000}
42- {800000000, 1200000}
43- {1000000000, 1300000}
4b875810
NM
44
451.2 Operating Performance Points Library
151f4e2b 46----------------------------------------
4b875810 47
e1f60b29 48OPP library provides a set of helper functions to organize and query the OPP
27a84f76 49information. The library is located in drivers/opp/ directory and the header
e4db1c74 50is located in include/linux/pm_opp.h. OPP library can be enabled by enabling
e1f60b29
NM
51CONFIG_PM_OPP from power management menuconfig menu. OPP library depends on
52CONFIG_PM as certain SoCs such as Texas Instrument's OMAP framework allows to
53optionally boot at a certain OPP without needing cpufreq.
54
151f4e2b
MCC
55Typical usage of the OPP library is as follows::
56
57 (users) -> registers a set of default OPPs -> (library)
58 SoC framework -> modifies on required cases certain OPPs -> OPP layer
e1f60b29
NM
59 -> queries to search/retrieve information ->
60
61OPP layer expects each domain to be represented by a unique device pointer. SoC
62framework registers a set of initial OPPs per device with the OPP layer. This
63list is expected to be an optimally small number typically around 5 per device.
64This initial list contains a set of OPPs that the framework expects to be safely
65enabled by default in the system.
66
151f4e2b
MCC
67Note on OPP Availability
68^^^^^^^^^^^^^^^^^^^^^^^^
69
e1f60b29
NM
70As the system proceeds to operate, SoC framework may choose to make certain
71OPPs available or not available on each device based on various external
72factors. Example usage: Thermal management or other exceptional situations where
73SoC framework might choose to disable a higher frequency OPP to safely continue
74operations until that OPP could be re-enabled if possible.
75
1992b66d 76OPP library facilitates this concept in its implementation. The following
e1f60b29 77operational functions operate only on available opps:
1992b66d
BH
78opp_find_freq_{ceil, floor}, dev_pm_opp_get_voltage, dev_pm_opp_get_freq,
79dev_pm_opp_get_opp_count
e1f60b29 80
1992b66d
BH
81dev_pm_opp_find_freq_exact is meant to be used to find the opp pointer
82which can then be used for dev_pm_opp_enable/disable functions to make an
83opp available as required.
e1f60b29
NM
84
85WARNING: Users of OPP library should refresh their availability count using
1992b66d
BH
86get_opp_count if dev_pm_opp_enable/disable functions are invoked for a
87device, the exact mechanism to trigger these or the notification mechanism
88to other dependent subsystems such as cpufreq are left to the discretion of
89the SoC specific framework which uses the OPP library. Similar care needs
90to be taken care to refresh the cpufreq table in cases of these operations.
e1f60b29 91
e1f60b29
NM
922. Initial OPP List Registration
93================================
5d4879cd 94The SoC implementation calls dev_pm_opp_add function iteratively to add OPPs per
e1f60b29
NM
95device. It is expected that the SoC framework will register the OPP entries
96optimally- typical numbers range to be less than 5. The list generated by
97registering the OPPs is maintained by OPP library throughout the device
98operation. The SoC framework can subsequently control the availability of the
5d4879cd 99OPPs dynamically using the dev_pm_opp_enable / disable functions.
e1f60b29 100
151f4e2b
MCC
101dev_pm_opp_add
102 Add a new OPP for a specific domain represented by the device pointer.
e1f60b29 103 The OPP is defined using the frequency and voltage. Once added, the OPP
1992b66d
BH
104 is assumed to be available and control of its availability can be done
105 with the dev_pm_opp_enable/disable functions. OPP library
106 internally stores and manages this information in the opp struct.
107 This function may be used by SoC framework to define a optimal list
108 as per the demands of SoC usage environment.
e1f60b29 109
151f4e2b
MCC
110 WARNING:
111 Do not use this function in interrupt context.
112
113 Example::
e1f60b29 114
e1f60b29
NM
115 soc_pm_init()
116 {
117 /* Do things */
5d4879cd 118 r = dev_pm_opp_add(mpu_dev, 1000000, 900000);
e1f60b29
NM
119 if (!r) {
120 pr_err("%s: unable to register mpu opp(%d)\n", r);
121 goto no_cpufreq;
122 }
123 /* Do cpufreq things */
124 no_cpufreq:
125 /* Do remaining things */
126 }
127
1283. OPP Search Functions
129=======================
130High level framework such as cpufreq operates on frequencies. To map the
131frequency back to the corresponding OPP, OPP library provides handy functions
132to search the OPP list that OPP library internally manages. These search
133functions return the matching pointer representing the opp if a match is
134found, else returns error. These errors are expected to be handled by standard
135error checks such as IS_ERR() and appropriate actions taken by the caller.
136
6185deaa
VK
137Callers of these functions shall call dev_pm_opp_put() after they have used the
138OPP. Otherwise the memory for the OPP will never get freed and result in
139memleak.
140
151f4e2b
MCC
141dev_pm_opp_find_freq_exact
142 Search for an OPP based on an *exact* frequency and
e1f60b29
NM
143 availability. This function is especially useful to enable an OPP which
144 is not available by default.
145 Example: In a case when SoC framework detects a situation where a
146 higher frequency could be made available, it can use this function to
151f4e2b
MCC
147 find the OPP prior to call the dev_pm_opp_enable to actually make
148 it available::
149
5d4879cd 150 opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false);
6185deaa 151 dev_pm_opp_put(opp);
e1f60b29
NM
152 /* dont operate on the pointer.. just do a sanity check.. */
153 if (IS_ERR(opp)) {
154 pr_err("frequency not disabled!\n");
155 /* trigger appropriate actions.. */
156 } else {
5d4879cd 157 dev_pm_opp_enable(dev,1000000000);
e1f60b29
NM
158 }
159
151f4e2b
MCC
160 NOTE:
161 This is the only search function that operates on OPPs which are
162 not available.
e1f60b29 163
151f4e2b
MCC
164dev_pm_opp_find_freq_floor
165 Search for an available OPP which is *at most* the
e1f60b29
NM
166 provided frequency. This function is useful while searching for a lesser
167 match OR operating on OPP information in the order of decreasing
168 frequency.
151f4e2b
MCC
169 Example: To find the highest opp for a device::
170
e1f60b29 171 freq = ULONG_MAX;
6185deaa
VK
172 opp = dev_pm_opp_find_freq_floor(dev, &freq);
173 dev_pm_opp_put(opp);
e1f60b29 174
151f4e2b
MCC
175dev_pm_opp_find_freq_ceil
176 Search for an available OPP which is *at least* the
e1f60b29
NM
177 provided frequency. This function is useful while searching for a
178 higher match OR operating on OPP information in the order of increasing
179 frequency.
151f4e2b
MCC
180 Example 1: To find the lowest opp for a device::
181
e1f60b29 182 freq = 0;
6185deaa
VK
183 opp = dev_pm_opp_find_freq_ceil(dev, &freq);
184 dev_pm_opp_put(opp);
151f4e2b
MCC
185
186 Example 2: A simplified implementation of a SoC cpufreq_driver->target::
187
e1f60b29
NM
188 soc_cpufreq_target(..)
189 {
190 /* Do stuff like policy checks etc. */
191 /* Find the best frequency match for the req */
5d4879cd 192 opp = dev_pm_opp_find_freq_ceil(dev, &freq);
6185deaa 193 dev_pm_opp_put(opp);
e1f60b29
NM
194 if (!IS_ERR(opp))
195 soc_switch_to_freq_voltage(freq);
196 else
25985edc 197 /* do something when we can't satisfy the req */
e1f60b29
NM
198 /* do other stuff */
199 }
200
2014. OPP Availability Control Functions
202=====================================
203A default OPP list registered with the OPP library may not cater to all possible
204situation. The OPP library provides a set of functions to modify the
205availability of a OPP within the OPP list. This allows SoC frameworks to have
206fine grained dynamic control of which sets of OPPs are operationally available.
207These functions are intended to *temporarily* remove an OPP in conditions such
208as thermal considerations (e.g. don't use OPPx until the temperature drops).
209
151f4e2b
MCC
210WARNING:
211 Do not use these functions in interrupt context.
e1f60b29 212
151f4e2b
MCC
213dev_pm_opp_enable
214 Make a OPP available for operation.
e1f60b29
NM
215 Example: Lets say that 1GHz OPP is to be made available only if the
216 SoC temperature is lower than a certain threshold. The SoC framework
151f4e2b
MCC
217 implementation might choose to do something as follows::
218
e1f60b29
NM
219 if (cur_temp < temp_low_thresh) {
220 /* Enable 1GHz if it was disabled */
5d4879cd 221 opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false);
6185deaa 222 dev_pm_opp_put(opp);
e1f60b29
NM
223 /* just error check */
224 if (!IS_ERR(opp))
5d4879cd 225 ret = dev_pm_opp_enable(dev, 1000000000);
e1f60b29
NM
226 else
227 goto try_something_else;
228 }
229
151f4e2b
MCC
230dev_pm_opp_disable
231 Make an OPP to be not available for operation
e1f60b29
NM
232 Example: Lets say that 1GHz OPP is to be disabled if the temperature
233 exceeds a threshold value. The SoC framework implementation might
151f4e2b
MCC
234 choose to do something as follows::
235
e1f60b29
NM
236 if (cur_temp > temp_high_thresh) {
237 /* Disable 1GHz if it was enabled */
5d4879cd 238 opp = dev_pm_opp_find_freq_exact(dev, 1000000000, true);
6185deaa 239 dev_pm_opp_put(opp);
e1f60b29
NM
240 /* just error check */
241 if (!IS_ERR(opp))
5d4879cd 242 ret = dev_pm_opp_disable(dev, 1000000000);
e1f60b29
NM
243 else
244 goto try_something_else;
245 }
246
2475. OPP Data Retrieval Functions
248===============================
249Since OPP library abstracts away the OPP information, a set of functions to pull
250information from the OPP structure is necessary. Once an OPP pointer is
251retrieved using the search functions, the following functions can be used by SoC
252framework to retrieve the information represented inside the OPP layer.
253
151f4e2b
MCC
254dev_pm_opp_get_voltage
255 Retrieve the voltage represented by the opp pointer.
e1f60b29
NM
256 Example: At a cpufreq transition to a different frequency, SoC
257 framework requires to set the voltage represented by the OPP using
258 the regulator framework to the Power Management chip providing the
151f4e2b
MCC
259 voltage::
260
e1f60b29
NM
261 soc_switch_to_freq_voltage(freq)
262 {
263 /* do things */
5d4879cd
NM
264 opp = dev_pm_opp_find_freq_ceil(dev, &freq);
265 v = dev_pm_opp_get_voltage(opp);
6185deaa 266 dev_pm_opp_put(opp);
e1f60b29
NM
267 if (v)
268 regulator_set_voltage(.., v);
269 /* do other things */
270 }
271
151f4e2b
MCC
272dev_pm_opp_get_freq
273 Retrieve the freq represented by the opp pointer.
e1f60b29
NM
274 Example: Lets say the SoC framework uses a couple of helper functions
275 we could pass opp pointers instead of doing additional parameters to
151f4e2b
MCC
276 handle quiet a bit of data parameters::
277
e1f60b29
NM
278 soc_cpufreq_target(..)
279 {
280 /* do things.. */
281 max_freq = ULONG_MAX;
5d4879cd
NM
282 max_opp = dev_pm_opp_find_freq_floor(dev,&max_freq);
283 requested_opp = dev_pm_opp_find_freq_ceil(dev,&freq);
e1f60b29
NM
284 if (!IS_ERR(max_opp) && !IS_ERR(requested_opp))
285 r = soc_test_validity(max_opp, requested_opp);
6185deaa
VK
286 dev_pm_opp_put(max_opp);
287 dev_pm_opp_put(requested_opp);
e1f60b29
NM
288 /* do other things */
289 }
290 soc_test_validity(..)
291 {
5d4879cd 292 if(dev_pm_opp_get_voltage(max_opp) < dev_pm_opp_get_voltage(requested_opp))
e1f60b29 293 return -EINVAL;
5d4879cd 294 if(dev_pm_opp_get_freq(max_opp) < dev_pm_opp_get_freq(requested_opp))
e1f60b29
NM
295 return -EINVAL;
296 /* do things.. */
297 }
298
151f4e2b
MCC
299dev_pm_opp_get_opp_count
300 Retrieve the number of available opps for a device
e1f60b29 301 Example: Lets say a co-processor in the SoC needs to know the available
151f4e2b
MCC
302 frequencies in a table, the main processor can notify as following::
303
e1f60b29
NM
304 soc_notify_coproc_available_frequencies()
305 {
306 /* Do things */
5d4879cd 307 num_available = dev_pm_opp_get_opp_count(dev);
e1f60b29
NM
308 speeds = kzalloc(sizeof(u32) * num_available, GFP_KERNEL);
309 /* populate the table in increasing order */
310 freq = 0;
5d4879cd 311 while (!IS_ERR(opp = dev_pm_opp_find_freq_ceil(dev, &freq))) {
e1f60b29
NM
312 speeds[i] = freq;
313 freq++;
314 i++;
6185deaa 315 dev_pm_opp_put(opp);
e1f60b29 316 }
e1f60b29
NM
317
318 soc_notify_coproc(AVAILABLE_FREQs, speeds, num_available);
319 /* Do other things */
320 }
321
a0dd7b79 3226. Data Structures
e1f60b29
NM
323==================
324Typically an SoC contains multiple voltage domains which are variable. Each
325domain is represented by a device pointer. The relationship to OPP can be
151f4e2b
MCC
326represented as follows::
327
328 SoC
329 |- device 1
330 | |- opp 1 (availability, freq, voltage)
331 | |- opp 2 ..
332 ... ...
333 | `- opp n ..
334 |- device 2
335 ...
336 `- device m
e1f60b29
NM
337
338OPP library maintains a internal list that the SoC framework populates and
339accessed by various functions as described above. However, the structures
340representing the actual OPPs and domains are internal to the OPP library itself
341to allow for suitable abstraction reusable across systems.
342
151f4e2b
MCC
343struct dev_pm_opp
344 The internal data structure of OPP library which is used to
e1f60b29
NM
345 represent an OPP. In addition to the freq, voltage, availability
346 information, it also contains internal book keeping information required
347 for the OPP library to operate on. Pointer to this structure is
348 provided back to the users such as SoC framework to be used as a
349 identifier for OPP in the interactions with OPP layer.
350
151f4e2b
MCC
351 WARNING:
352 The struct dev_pm_opp pointer should not be parsed or modified by the
353 users. The defaults of for an instance is populated by
354 dev_pm_opp_add, but the availability of the OPP can be modified
355 by dev_pm_opp_enable/disable functions.
e1f60b29 356
151f4e2b
MCC
357struct device
358 This is used to identify a domain to the OPP layer. The
1992b66d 359 nature of the device and its implementation is left to the user of
e1f60b29
NM
360 OPP library such as the SoC framework.
361
362Overall, in a simplistic view, the data structure operations is represented as
151f4e2b 363following::
e1f60b29 364
151f4e2b
MCC
365 Initialization / modification:
366 +-----+ /- dev_pm_opp_enable
367 dev_pm_opp_add --> | opp | <-------
368 | +-----+ \- dev_pm_opp_disable
369 \-------> domain_info(device)
e1f60b29 370
151f4e2b
MCC
371 Search functions:
372 /-- dev_pm_opp_find_freq_ceil ---\ +-----+
373 domain_info<---- dev_pm_opp_find_freq_exact -----> | opp |
374 \-- dev_pm_opp_find_freq_floor ---/ +-----+
e1f60b29 375
151f4e2b
MCC
376 Retrieval functions:
377 +-----+ /- dev_pm_opp_get_voltage
378 | opp | <---
379 +-----+ \- dev_pm_opp_get_freq
e1f60b29 380
151f4e2b 381 domain_info <- dev_pm_opp_get_opp_count