Commit | Line | Data |
---|---|---|
c460f972 | 1 | .. SPDX-License-Identifier: GPL-2.0 |
1da177e4 | 2 | |
c460f972 MCC |
3 | ============================================================= |
4 | General description of the CPUFreq core and CPUFreq notifiers | |
5 | ============================================================= | |
1da177e4 | 6 | |
c460f972 MCC |
7 | Authors: |
8 | - Dominik Brodowski <linux@brodo.de> | |
9 | - David Kimdon <dwhedon@debian.org> | |
10 | - Rafael J. Wysocki <rafael.j.wysocki@intel.com> | |
11 | - Viresh Kumar <viresh.kumar@linaro.org> | |
1da177e4 | 12 | |
c460f972 | 13 | .. Contents: |
1da177e4 | 14 | |
c460f972 MCC |
15 | 1. CPUFreq core and interfaces |
16 | 2. CPUFreq notifiers | |
17 | 3. CPUFreq Table Generation with Operating Performance Point (OPP) | |
1da177e4 LT |
18 | |
19 | 1. General Information | |
c460f972 | 20 | ====================== |
1da177e4 | 21 | |
eff0df65 | 22 | The CPUFreq core code is located in drivers/cpufreq/cpufreq.c. This |
1da177e4 LT |
23 | cpufreq code offers a standardized interface for the CPUFreq |
24 | architecture drivers (those pieces of code that do actual | |
25 | frequency transitions), as well as to "notifiers". These are device | |
26 | drivers or other part of the kernel that need to be informed of | |
27 | policy changes (ex. thermal modules like ACPI) or of all | |
28 | frequency changes (ex. timing code) or even need to force certain | |
29 | speed limits (like LCD drivers on ARM architecture). Additionally, the | |
30 | kernel "constant" loops_per_jiffy is updated on frequency changes | |
31 | here. | |
32 | ||
7de962c0 VK |
33 | Reference counting of the cpufreq policies is done by cpufreq_cpu_get |
34 | and cpufreq_cpu_put, which make sure that the cpufreq driver is | |
35 | correctly registered with the core, and will not be unloaded until | |
36 | cpufreq_put_cpu is called. That also ensures that the respective cpufreq | |
37 | policy doesn't get freed while being used. | |
1da177e4 LT |
38 | |
39 | 2. CPUFreq notifiers | |
40 | ==================== | |
41 | ||
42 | CPUFreq notifiers conform to the standard kernel notifier interface. | |
43 | See linux/include/linux/notifier.h for details on notifiers. | |
44 | ||
45 | There are two different CPUFreq notifiers - policy notifiers and | |
46 | transition notifiers. | |
47 | ||
48 | ||
49 | 2.1 CPUFreq policy notifiers | |
50 | ---------------------------- | |
51 | ||
c27c38af | 52 | These are notified when a new policy is created or removed. |
1da177e4 | 53 | |
c27c38af VK |
54 | The phase is specified in the second argument to the notifier. The phase is |
55 | CPUFREQ_CREATE_POLICY when the policy is first created and it is | |
56 | CPUFREQ_REMOVE_POLICY when the policy is removed. | |
1da177e4 | 57 | |
c460f972 | 58 | The third argument, a ``void *pointer``, points to a struct cpufreq_policy |
7de962c0 VK |
59 | consisting of several values, including min, max (the lower and upper |
60 | frequencies (in kHz) of the new policy). | |
1da177e4 LT |
61 | |
62 | ||
63 | 2.2 CPUFreq transition notifiers | |
64 | -------------------------------- | |
65 | ||
7de962c0 VK |
66 | These are notified twice for each online CPU in the policy, when the |
67 | CPUfreq driver switches the CPU core frequency and this change has no | |
68 | any external implications. | |
1da177e4 LT |
69 | |
70 | The second argument specifies the phase - CPUFREQ_PRECHANGE or | |
71 | CPUFREQ_POSTCHANGE. | |
72 | ||
73 | The third argument is a struct cpufreq_freqs with the following | |
74 | values: | |
c460f972 | 75 | |
a15b8cd7 TY |
76 | ====== ====================================== |
77 | policy a pointer to the struct cpufreq_policy | |
c460f972 MCC |
78 | old old frequency |
79 | new new frequency | |
80 | flags flags of the cpufreq driver | |
a15b8cd7 | 81 | ====== ====================================== |
a0dd7b79 NM |
82 | |
83 | 3. CPUFreq Table Generation with Operating Performance Point (OPP) | |
84 | ================================================================== | |
151f4e2b | 85 | For details about OPP, see Documentation/power/opp.rst |
a0dd7b79 | 86 | |
2dd0df84 VK |
87 | dev_pm_opp_init_cpufreq_table - |
88 | This function provides a ready to use conversion routine to translate | |
89 | the OPP layer's internal information about the available frequencies | |
90 | into a format readily providable to cpufreq. | |
a0dd7b79 | 91 | |
c460f972 MCC |
92 | .. Warning:: |
93 | ||
94 | Do not use this function in interrupt context. | |
95 | ||
96 | Example:: | |
a0dd7b79 | 97 | |
a0dd7b79 NM |
98 | soc_pm_init() |
99 | { | |
100 | /* Do things */ | |
101 | r = dev_pm_opp_init_cpufreq_table(dev, &freq_table); | |
102 | if (!r) | |
2dd0df84 | 103 | policy->freq_table = freq_table; |
a0dd7b79 NM |
104 | /* Do other things */ |
105 | } | |
106 | ||
c460f972 MCC |
107 | .. note:: |
108 | ||
109 | This function is available only if CONFIG_CPU_FREQ is enabled in | |
110 | addition to CONFIG_PM_OPP. | |
a0dd7b79 | 111 | |
c460f972 MCC |
112 | dev_pm_opp_free_cpufreq_table |
113 | Free up the table allocated by dev_pm_opp_init_cpufreq_table |