1 .. SPDX-License-Identifier: GPL-2.0 2 3 ============================================== 4 How to Implement a new CPUFreq Processor Drive 5 ============================================== 6 7 Authors: 8 9 10 - Dominik Brodowski <linux@brodo.de> 11 - Rafael J. Wysocki <rafael.j.wysocki@i 12 - Viresh Kumar <viresh.kumar@linaro.org 13 14 .. Contents 15 16 1. What To Do? 17 1.1 Initialization 18 1.2 Per-CPU Initialization 19 1.3 verify 20 1.4 target/target_index or setpolicy? 21 1.5 target/target_index 22 1.6 setpolicy 23 1.7 get_intermediate and target_intermedia 24 2. Frequency Table Helpers 25 26 27 28 1. What To Do? 29 ============== 30 31 So, you just got a brand-new CPU / chipset wit 32 add cpufreq support for this CPU / chipset? Gr 33 on what is necessary: 34 35 36 1.1 Initialization 37 ------------------ 38 39 First of all, in an __initcall level 7 (module 40 function check whether this kernel runs on the 41 chipset. If so, register a struct cpufreq_driv 42 using cpufreq_register_driver() 43 44 What shall this struct cpufreq_driver contain? 45 46 .name - The name of this driver. 47 48 .init - A pointer to the per-policy initializ 49 50 .verify - A pointer to a "verification" funct 51 52 .setpolicy _or_ .fast_switch _or_ .target _or 53 below on the differences. 54 55 And optionally 56 57 .flags - Hints for the cpufreq core. 58 59 .driver_data - cpufreq driver specific data. 60 61 .get_intermediate and target_intermediate - U 62 frequency while changing CPU frequency. 63 64 .get - Returns current frequency of the CPU. 65 66 .bios_limit - Returns HW/BIOS max frequency l 67 68 .exit - A pointer to a per-policy cleanup fun 69 CPU_POST_DEAD phase of cpu hotplug process. 70 71 .suspend - A pointer to a per-policy suspend 72 with interrupts disabled and _after_ the gove 73 policy. 74 75 .resume - A pointer to a per-policy resume fu 76 with interrupts disabled and _before_ the gov 77 78 .ready - A pointer to a per-policy ready func 79 the policy is fully initialized. 80 81 .attr - A pointer to a NULL-terminated list o 82 allow to export values to sysfs. 83 84 .boost_enabled - If set, boost frequencies ar 85 86 .set_boost - A pointer to a per-policy functi 87 frequencies. 88 89 90 1.2 Per-CPU Initialization 91 -------------------------- 92 93 Whenever a new CPU is registered with the devi 94 cpufreq driver registers itself, the per-polic 95 cpufreq_driver.init is called if no cpufreq po 96 Note that the .init() and .exit() routines are 97 policy and not for each CPU managed by the pol 98 cpufreq_policy *policy`` as argument. What to 99 100 If necessary, activate the CPUfreq support on 101 102 Then, the driver must fill in the following va 103 104 +-----------------------------------+--------- 105 |policy->cpuinfo.min_freq _and_ | 106 |policy->cpuinfo.max_freq | the mini 107 | | (in kHz) 108 | | this CPU 109 +-----------------------------------+--------- 110 |policy->cpuinfo.transition_latency | the time 111 | | switch b 112 | | nanoseco 113 | | specify 114 +-----------------------------------+--------- 115 |policy->cur | The curr 116 | | this CPU 117 +-----------------------------------+--------- 118 |policy->min, | 119 |policy->max, | 120 |policy->policy and, if necessary, | 121 |policy->governor | must con 122 | | this CPU 123 | | cpufreq_ 124 | | cpufreq_ 125 | | cpufreq_ 126 | | called w 127 +-----------------------------------+--------- 128 |policy->cpus | Update t 129 | | (online 130 | | along wi 131 | | clock/vo 132 +-----------------------------------+--------- 133 134 For setting some of these values (cpuinfo.min[ 135 frequency table helpers might be helpful. See 136 on them. 137 138 139 1.3 verify 140 ---------- 141 142 When the user decides a new policy (consisting 143 "policy,governor,min,max") shall be set, this 144 so that incompatible values can be corrected. 145 values cpufreq_verify_within_limits(``struct c 146 ``unsigned int min_freq``, ``unsigned int max_ 147 See section 2 for details on frequency table h 148 149 You need to make sure that at least one valid 150 range) is within policy->min and policy->max. 151 policy->max first, and only if this is no solu 152 153 154 1.4 target or target_index or setpolicy or fas 155 ---------------------------------------------- 156 157 Most cpufreq drivers or even most cpu frequenc 158 only allow the CPU frequency to be set to pred 159 these, you use the ->target(), ->target_index( 160 callbacks. 161 162 Some cpufreq capable processors switch the fre 163 limits on their own. These shall use the ->set 164 165 166 1.5. target/target_index 167 ------------------------ 168 169 The target_index call has two arguments: ``str 170 and ``unsigned int`` index (into the exposed f 171 172 The CPUfreq driver must set the new frequency 173 actual frequency must be determined by freq_ta 174 175 It should always restore to earlier frequency 176 case of errors, even if we switched to interme 177 178 Deprecated 179 ---------- 180 The target call has three arguments: ``struct 181 unsigned int target_frequency, unsigned int re 182 183 The CPUfreq driver must set the new frequency 184 actual frequency must be determined using the 185 186 - keep close to "target_freq" 187 - policy->min <= new_freq <= policy->max (THIS 188 - if relation==CPUFREQ_REL_L, try to select a 189 target_freq. ("L for lowest, but no lower th 190 - if relation==CPUFREQ_REL_H, try to select a 191 target_freq. ("H for highest, but no higher 192 193 Here again the frequency table helper might as 194 for details. 195 196 1.6. fast_switch 197 ---------------- 198 199 This function is used for frequency switching 200 Not all drivers are expected to implement it, 201 this callback isn't allowed. This callback mus 202 do switching as fast as possible. 203 204 This function has two arguments: ``struct cpuf 205 ``unsigned int target_frequency``. 206 207 208 1.7 setpolicy 209 ------------- 210 211 The setpolicy call only takes a ``struct cpufr 212 argument. You need to set the lower limit of t 213 in-chipset dynamic frequency switching to poli 214 to policy->max, and -if supported- select a pe 215 setting when policy->policy is CPUFREQ_POLICY_ 216 powersaving-oriented setting when CPUFREQ_POLI 217 the reference implementation in drivers/cpufre 218 219 1.8 get_intermediate and target_intermediate 220 -------------------------------------------- 221 222 Only for drivers with target_index() and CPUFR 223 224 get_intermediate should return a stable interm 225 switch to, and target_intermediate() should se 226 jumping to the frequency corresponding to 'ind 227 sending notifications and driver doesn't have 228 target_intermediate() or target_index(). 229 230 Drivers can return '0' from get_intermediate() 231 to intermediate frequency for some target freq 232 directly call ->target_index(). 233 234 NOTE: ->target_index() should restore to polic 235 failures as core would send notifications for 236 237 238 2. Frequency Table Helpers 239 ========================== 240 241 As most cpufreq processors only allow for bein 242 frequencies, a "frequency table" with some fun 243 some work of the processor driver. Such a "fre 244 an array of struct cpufreq_frequency_table ent 245 values in "driver_data", the corresponding fre 246 flags set. At the end of the table, you need t 247 cpufreq_frequency_table entry with frequency s 248 And if you want to skip one entry in the table 249 CPUFREQ_ENTRY_INVALID. The entries don't need 250 particular order, but if they are cpufreq core 251 quickly for them as search for best match is f 252 253 The cpufreq table is verified automatically by 254 valid pointer in its policy->freq_table field. 255 256 cpufreq_frequency_table_verify() assures that 257 frequency is within policy->min and policy->ma 258 are met. This is helpful for the ->verify call 259 260 cpufreq_frequency_table_target() is the corres 261 helper for the ->target stage. Just pass the v 262 and this function returns the of the frequency 263 contains the frequency the CPU shall be set to 264 265 The following macros can be used as iterators 266 267 cpufreq_for_each_entry(pos, table) - iterates 268 table. 269 270 cpufreq_for_each_valid_entry(pos, table) - ite 271 excluding CPUFREQ_ENTRY_INVALID frequencies. 272 Use arguments "pos" - a ``cpufreq_frequency_ta 273 "table" - the ``cpufreq_frequency_table *`` yo 274 275 For example:: 276 277 struct cpufreq_frequency_table *pos, * 278 279 cpufreq_for_each_entry(pos, driver_fre 280 /* Do something with pos */ 281 pos->frequency = ... 282 } 283 284 If you need to work with the position of pos w 285 do not subtract the pointers, as it is quite c 286 macros cpufreq_for_each_entry_idx() and cpufre
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.