linux/Documentation/cpu-freq/cpu-drivers.txt
<<
>>
Prefs
   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   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
  261.4  target/target_index or setpolicy?
  271.5  target/target_index
  281.6  setpolicy
  292.   Frequency Table Helpers
  30
  31
  32
  331. What To Do?
  34==============
  35
  36So, you just got a brand-new CPU / chipset with datasheets and want to
  37add cpufreq support for this CPU / chipset? Great. Here are some hints
  38on what is necessary:
  39
  40
  411.1 Initialization
  42------------------
  43
  44First of all, in an __initcall level 7 (module_init()) or later
  45function check whether this kernel runs on the right CPU and the right
  46chipset. If so, register a struct cpufreq_driver with the CPUfreq core
  47using cpufreq_register_driver()
  48
  49What shall this struct cpufreq_driver contain? 
  50
  51cpufreq_driver.name -           The name of this driver.
  52
  53cpufreq_driver.init -           A pointer to the per-CPU initialization 
  54                                function.
  55
  56cpufreq_driver.verify -         A pointer to a "verification" function.
  57
  58cpufreq_driver.setpolicy _or_ 
  59cpufreq_driver.target/
  60target_index            -       See below on the differences.
  61
  62And optionally
  63
  64cpufreq_driver.exit -           A pointer to a per-CPU cleanup
  65                                function called during CPU_POST_DEAD
  66                                phase of cpu hotplug process.
  67
  68cpufreq_driver.stop_cpu -       A pointer to a per-CPU stop function
  69                                called during CPU_DOWN_PREPARE phase of
  70                                cpu hotplug process.
  71
  72cpufreq_driver.resume -         A pointer to a per-CPU resume function
  73                                which is called with interrupts disabled
  74                                and _before_ the pre-suspend frequency
  75                                and/or policy is restored by a call to
  76                                ->target/target_index or ->setpolicy.
  77
  78cpufreq_driver.attr -           A pointer to a NULL-terminated list of
  79                                "struct freq_attr" which allow to
  80                                export values to sysfs.
  81
  82
  831.2 Per-CPU Initialization
  84--------------------------
  85
  86Whenever a new CPU is registered with the device model, or after the
  87cpufreq driver registers itself, the per-CPU initialization function 
  88cpufreq_driver.init is called. It takes a struct cpufreq_policy
  89*policy as argument. What to do now?
  90
  91If necessary, activate the CPUfreq support on your CPU.
  92
  93Then, the driver must fill in the following values:
  94
  95policy->cpuinfo.min_freq _and_
  96policy->cpuinfo.max_freq -      the minimum and maximum frequency 
  97                                (in kHz) which is supported by 
  98                                this CPU
  99policy->cpuinfo.transition_latency   the time it takes on this CPU to
 100                                switch between two frequencies in
 101                                nanoseconds (if appropriate, else
 102                                specify CPUFREQ_ETERNAL)
 103
 104policy->cur                     The current operating frequency of
 105                                this CPU (if appropriate)
 106policy->min, 
 107policy->max, 
 108policy->policy and, if necessary,
 109policy->governor                must contain the "default policy" for
 110                                this CPU. A few moments later,
 111                                cpufreq_driver.verify and either
 112                                cpufreq_driver.setpolicy or
 113                                cpufreq_driver.target/target_index is called
 114                                with these values.
 115
 116For setting some of these values (cpuinfo.min[max]_freq, policy->min[max]), the
 117frequency table helpers might be helpful. See the section 2 for more information
 118on them.
 119
 120SMP systems normally have same clock source for a group of cpus. For these the
 121.init() would be called only once for the first online cpu. Here the .init()
 122routine must initialize policy->cpus with mask of all possible cpus (Online +
 123Offline) that share the clock. Then the core would copy this mask onto
 124policy->related_cpus and will reset policy->cpus to carry only online cpus.
 125
 126
 1271.3 verify
 128------------
 129
 130When the user decides a new policy (consisting of
 131"policy,governor,min,max") shall be set, this policy must be validated
 132so that incompatible values can be corrected. For verifying these
 133values, a frequency table helper and/or the
 134cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned
 135int min_freq, unsigned int max_freq) function might be helpful. See
 136section 2 for details on frequency table helpers.
 137
 138You need to make sure that at least one valid frequency (or operating
 139range) is within policy->min and policy->max. If necessary, increase
 140policy->max first, and only if this is no solution, decrease policy->min.
 141
 142
 1431.4 target/target_index or setpolicy?
 144----------------------------
 145
 146Most cpufreq drivers or even most cpu frequency scaling algorithms 
 147only allow the CPU to be set to one frequency. For these, you use the
 148->target/target_index call.
 149
 150Some cpufreq-capable processors switch the frequency between certain
 151limits on their own. These shall use the ->setpolicy call
 152
 153
 1541.4. target/target_index
 155-------------
 156
 157The target_index call has two arguments: struct cpufreq_policy *policy,
 158and unsigned int index (into the exposed frequency table).
 159
 160The CPUfreq driver must set the new frequency when called here. The
 161actual frequency must be determined by freq_table[index].frequency.
 162
 163Deprecated:
 164----------
 165The target call has three arguments: struct cpufreq_policy *policy,
 166unsigned int target_frequency, unsigned int relation.
 167
 168The CPUfreq driver must set the new frequency when called here. The
 169actual frequency must be determined using the following rules:
 170
 171- keep close to "target_freq"
 172- policy->min <= new_freq <= policy->max (THIS MUST BE VALID!!!)
 173- if relation==CPUFREQ_REL_L, try to select a new_freq higher than or equal
 174  target_freq. ("L for lowest, but no lower than")
 175- if relation==CPUFREQ_REL_H, try to select a new_freq lower than or equal
 176  target_freq. ("H for highest, but no higher than")
 177
 178Here again the frequency table helper might assist you - see section 2
 179for details.
 180
 181
 1821.5 setpolicy
 183---------------
 184
 185The setpolicy call only takes a struct cpufreq_policy *policy as
 186argument. You need to set the lower limit of the in-processor or
 187in-chipset dynamic frequency switching to policy->min, the upper limit
 188to policy->max, and -if supported- select a performance-oriented
 189setting when policy->policy is CPUFREQ_POLICY_PERFORMANCE, and a
 190powersaving-oriented setting when CPUFREQ_POLICY_POWERSAVE. Also check
 191the reference implementation in drivers/cpufreq/longrun.c
 192
 193
 194
 1952. Frequency Table Helpers
 196==========================
 197
 198As most cpufreq processors only allow for being set to a few specific
 199frequencies, a "frequency table" with some functions might assist in
 200some work of the processor driver. Such a "frequency table" consists
 201of an array of struct cpufreq_frequency_table entries, with any value in
 202"driver_data" you want to use, and the corresponding frequency in
 203"frequency". At the end of the table, you need to add a
 204cpufreq_frequency_table entry with frequency set to CPUFREQ_TABLE_END. And
 205if you want to skip one entry in the table, set the frequency to 
 206CPUFREQ_ENTRY_INVALID. The entries don't need to be in ascending
 207order.
 208
 209By calling cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 210                                        struct cpufreq_frequency_table *table);
 211the cpuinfo.min_freq and cpuinfo.max_freq values are detected, and
 212policy->min and policy->max are set to the same values. This is
 213helpful for the per-CPU initialization stage.
 214
 215int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
 216                                   struct cpufreq_frequency_table *table);
 217assures that at least one valid frequency is within policy->min and
 218policy->max, and all other criteria are met. This is helpful for the
 219->verify call.
 220
 221int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
 222                                   struct cpufreq_frequency_table *table,
 223                                   unsigned int target_freq,
 224                                   unsigned int relation,
 225                                   unsigned int *index);
 226
 227is the corresponding frequency table helper for the ->target
 228stage. Just pass the values to this function, and the unsigned int
 229index returns the number of the frequency table entry which contains
 230the frequency the CPU shall be set to.
 231
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.