Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | 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 F r e q C o r e | |
7 | ||
8 | ||
9 | Dominik Brodowski <linux@brodo.de> | |
10 | David Kimdon <dwhedon@debian.org> | |
11 | ||
12 | ||
13 | ||
14 | Clock scaling allows you to change the clock speed of the CPUs on the | |
15 | fly. This is a nice method to save battery power, because the lower | |
16 | the clock speed, the less power the CPU consumes. | |
17 | ||
18 | ||
19 | Contents: | |
20 | --------- | |
21 | 1. CPUFreq core and interfaces | |
22 | 2. CPUFreq notifiers | |
a0dd7b79 | 23 | 3. CPUFreq Table Generation with Operating Performance Point (OPP) |
1da177e4 LT |
24 | |
25 | 1. General Information | |
26 | ======================= | |
27 | ||
eff0df65 | 28 | The CPUFreq core code is located in drivers/cpufreq/cpufreq.c. This |
1da177e4 LT |
29 | cpufreq code offers a standardized interface for the CPUFreq |
30 | architecture drivers (those pieces of code that do actual | |
31 | frequency transitions), as well as to "notifiers". These are device | |
32 | drivers or other part of the kernel that need to be informed of | |
33 | policy changes (ex. thermal modules like ACPI) or of all | |
34 | frequency changes (ex. timing code) or even need to force certain | |
35 | speed limits (like LCD drivers on ARM architecture). Additionally, the | |
36 | kernel "constant" loops_per_jiffy is updated on frequency changes | |
37 | here. | |
38 | ||
39 | Reference counting is done by cpufreq_get_cpu and cpufreq_put_cpu, | |
40 | which make sure that the cpufreq processor driver is correctly | |
41 | registered with the core, and will not be unloaded until | |
42 | cpufreq_put_cpu is called. | |
43 | ||
44 | 2. CPUFreq notifiers | |
45 | ==================== | |
46 | ||
47 | CPUFreq notifiers conform to the standard kernel notifier interface. | |
48 | See linux/include/linux/notifier.h for details on notifiers. | |
49 | ||
50 | There are two different CPUFreq notifiers - policy notifiers and | |
51 | transition notifiers. | |
52 | ||
53 | ||
54 | 2.1 CPUFreq policy notifiers | |
55 | ---------------------------- | |
56 | ||
57 | These are notified when a new policy is intended to be set. Each | |
58 | CPUFreq policy notifier is called three times for a policy transition: | |
59 | ||
60 | 1.) During CPUFREQ_ADJUST all CPUFreq notifiers may change the limit if | |
61 | they see a need for this - may it be thermal considerations or | |
62 | hardware limitations. | |
63 | ||
64 | 2.) During CPUFREQ_INCOMPATIBLE only changes may be done in order to avoid | |
65 | hardware failure. | |
66 | ||
67 | 3.) And during CPUFREQ_NOTIFY all notifiers are informed of the new policy | |
68 | - if two hardware drivers failed to agree on a new policy before this | |
69 | stage, the incompatible hardware shall be shut down, and the user | |
70 | informed of this. | |
71 | ||
72 | The phase is specified in the second argument to the notifier. | |
73 | ||
74 | The third argument, a void *pointer, points to a struct cpufreq_policy | |
75 | consisting of five values: cpu, min, max, policy and max_cpu_freq. min | |
76 | and max are the lower and upper frequencies (in kHz) of the new | |
77 | policy, policy the new policy, cpu the number of the affected CPU; and | |
78 | max_cpu_freq the maximum supported CPU frequency. This value is given | |
79 | for informational purposes only. | |
80 | ||
81 | ||
82 | 2.2 CPUFreq transition notifiers | |
83 | -------------------------------- | |
84 | ||
85 | These are notified twice when the CPUfreq driver switches the CPU core | |
86 | frequency and this change has any external implications. | |
87 | ||
88 | The second argument specifies the phase - CPUFREQ_PRECHANGE or | |
89 | CPUFREQ_POSTCHANGE. | |
90 | ||
91 | The third argument is a struct cpufreq_freqs with the following | |
92 | values: | |
93 | cpu - number of the affected CPU | |
94 | old - old frequency | |
95 | new - new frequency | |
a0dd7b79 NM |
96 | |
97 | 3. CPUFreq Table Generation with Operating Performance Point (OPP) | |
98 | ================================================================== | |
99 | For details about OPP, see Documentation/power/opp.txt | |
100 | ||
101 | dev_pm_opp_init_cpufreq_table - cpufreq framework typically is initialized with | |
102 | cpufreq_frequency_table_cpuinfo which is provided with the list of | |
103 | frequencies that are available for operation. This function provides | |
104 | a ready to use conversion routine to translate the OPP layer's internal | |
105 | information about the available frequencies into a format readily | |
106 | providable to cpufreq. | |
107 | ||
108 | WARNING: Do not use this function in interrupt context. | |
109 | ||
110 | Example: | |
111 | soc_pm_init() | |
112 | { | |
113 | /* Do things */ | |
114 | r = dev_pm_opp_init_cpufreq_table(dev, &freq_table); | |
115 | if (!r) | |
116 | cpufreq_frequency_table_cpuinfo(policy, freq_table); | |
117 | /* Do other things */ | |
118 | } | |
119 | ||
120 | NOTE: This function is available only if CONFIG_CPU_FREQ is enabled in | |
121 | addition to CONFIG_PM_OPP. | |
122 | ||
123 | dev_pm_opp_free_cpufreq_table - Free up the table allocated by dev_pm_opp_init_cpufreq_table |