Commit 8f920589 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Rafael J. Wysocki

docs: cpu-freq: convert cpu-drivers.txt to ReST

- Add a SPDX header;
- Add a document title, based on the original contents of
  cpu-freq/index.txt;
- Use lists where needed;
- Comment out the existing text-only index;
- Adjust some title marks;
- Add table markups;
- Add notes markups;
- Mark literal blocks as such;
- use ``foo`` for literal texts;
- Some whitespace fixes and new line breaks;
- Add it to cpu-freq/index.rst.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent c460f972
CPU frequency and voltage scaling code in the Linux(TM) kernel .. SPDX-License-Identifier: GPL-2.0
===============================================
How to Implement a new CPUFreq Processor Driver
===============================================
L i n u x C P U F r e q Authors:
C P U D r i v e r s
- information for developers - - Dominik Brodowski <linux@brodo.de>
- Rafael J. Wysocki <rafael.j.wysocki@intel.com>
- Viresh Kumar <viresh.kumar@linaro.org>
.. Contents
Dominik Brodowski <linux@brodo.de> 1. What To Do?
Rafael J. Wysocki <rafael.j.wysocki@intel.com> 1.1 Initialization
Viresh Kumar <viresh.kumar@linaro.org> 1.2 Per-CPU Initialization
1.3 verify
1.4 target/target_index or setpolicy?
1.5 target/target_index
Clock scaling allows you to change the clock speed of the CPUs on the 1.6 setpolicy
fly. This is a nice method to save battery power, because the lower 1.7 get_intermediate and target_intermediate
the clock speed, the less power the CPU consumes. 2. Frequency Table Helpers
Contents:
---------
1. What To Do?
1.1 Initialization
1.2 Per-CPU Initialization
1.3 verify
1.4 target/target_index or setpolicy?
1.5 target/target_index
1.6 setpolicy
1.7 get_intermediate and target_intermediate
2. Frequency Table Helpers
...@@ -108,37 +100,42 @@ Whenever a new CPU is registered with the device model, or after the ...@@ -108,37 +100,42 @@ Whenever a new CPU is registered with the device model, or after the
cpufreq driver registers itself, the per-policy initialization function cpufreq driver registers itself, the per-policy initialization function
cpufreq_driver.init is called if no cpufreq policy existed for the CPU. cpufreq_driver.init is called if no cpufreq policy existed for the CPU.
Note that the .init() and .exit() routines are called only once for the Note that the .init() and .exit() routines are called only once for the
policy and not for each CPU managed by the policy. It takes a struct policy and not for each CPU managed by the policy. It takes a ``struct
cpufreq_policy *policy as argument. What to do now? cpufreq_policy *policy`` as argument. What to do now?
If necessary, activate the CPUfreq support on your CPU. If necessary, activate the CPUfreq support on your CPU.
Then, the driver must fill in the following values: Then, the driver must fill in the following values:
policy->cpuinfo.min_freq _and_ +-----------------------------------+--------------------------------------+
policy->cpuinfo.max_freq - the minimum and maximum frequency |policy->cpuinfo.min_freq _and_ | |
(in kHz) which is supported by |policy->cpuinfo.max_freq | the minimum and maximum frequency |
this CPU | | (in kHz) which is supported by |
policy->cpuinfo.transition_latency the time it takes on this CPU to | | this CPU |
switch between two frequencies in +-----------------------------------+--------------------------------------+
nanoseconds (if appropriate, else |policy->cpuinfo.transition_latency | the time it takes on this CPU to |
specify CPUFREQ_ETERNAL) | | switch between two frequencies in |
| | nanoseconds (if appropriate, else |
policy->cur The current operating frequency of | | specify CPUFREQ_ETERNAL) |
this CPU (if appropriate) +-----------------------------------+--------------------------------------+
policy->min, |policy->cur | The current operating frequency of |
policy->max, | | this CPU (if appropriate) |
policy->policy and, if necessary, +-----------------------------------+--------------------------------------+
policy->governor must contain the "default policy" for |policy->min, | |
this CPU. A few moments later, |policy->max, | |
cpufreq_driver.verify and either |policy->policy and, if necessary, | |
cpufreq_driver.setpolicy or |policy->governor | must contain the "default policy" for|
cpufreq_driver.target/target_index is called | | this CPU. A few moments later, |
with these values. | | cpufreq_driver.verify and either |
policy->cpus Update this with the masks of the | | cpufreq_driver.setpolicy or |
(online + offline) CPUs that do DVFS | | cpufreq_driver.target/target_index is|
along with this CPU (i.e. that share | | called with these values. |
clock/voltage rails with it). +-----------------------------------+--------------------------------------+
|policy->cpus | Update this with the masks of the |
| | (online + offline) CPUs that do DVFS |
| | along with this CPU (i.e. that share|
| | clock/voltage rails with it). |
+-----------------------------------+--------------------------------------+
For setting some of these values (cpuinfo.min[max]_freq, policy->min[max]), the For setting some of these values (cpuinfo.min[max]_freq, policy->min[max]), the
frequency table helpers might be helpful. See the section 2 for more information frequency table helpers might be helpful. See the section 2 for more information
...@@ -151,8 +148,8 @@ on them. ...@@ -151,8 +148,8 @@ on them.
When the user decides a new policy (consisting of When the user decides a new policy (consisting of
"policy,governor,min,max") shall be set, this policy must be validated "policy,governor,min,max") shall be set, this policy must be validated
so that incompatible values can be corrected. For verifying these so that incompatible values can be corrected. For verifying these
values cpufreq_verify_within_limits(struct cpufreq_policy *policy, values cpufreq_verify_within_limits(``struct cpufreq_policy *policy``,
unsigned int min_freq, unsigned int max_freq) function might be helpful. ``unsigned int min_freq``, ``unsigned int max_freq``) function might be helpful.
See section 2 for details on frequency table helpers. See section 2 for details on frequency table helpers.
You need to make sure that at least one valid frequency (or operating You need to make sure that at least one valid frequency (or operating
...@@ -175,8 +172,8 @@ limits on their own. These shall use the ->setpolicy() callback. ...@@ -175,8 +172,8 @@ limits on their own. These shall use the ->setpolicy() callback.
1.5. target/target_index 1.5. target/target_index
------------------------ ------------------------
The target_index call has two arguments: struct cpufreq_policy *policy, The target_index call has two arguments: ``struct cpufreq_policy *policy``,
and unsigned int index (into the exposed frequency table). and ``unsigned int`` index (into the exposed frequency table).
The CPUfreq driver must set the new frequency when called here. The The CPUfreq driver must set the new frequency when called here. The
actual frequency must be determined by freq_table[index].frequency. actual frequency must be determined by freq_table[index].frequency.
...@@ -184,9 +181,9 @@ actual frequency must be determined by freq_table[index].frequency. ...@@ -184,9 +181,9 @@ actual frequency must be determined by freq_table[index].frequency.
It should always restore to earlier frequency (i.e. policy->restore_freq) in It should always restore to earlier frequency (i.e. policy->restore_freq) in
case of errors, even if we switched to intermediate frequency earlier. case of errors, even if we switched to intermediate frequency earlier.
Deprecated: Deprecated
---------- ----------
The target call has three arguments: struct cpufreq_policy *policy, The target call has three arguments: ``struct cpufreq_policy *policy``,
unsigned int target_frequency, unsigned int relation. unsigned int target_frequency, unsigned int relation.
The CPUfreq driver must set the new frequency when called here. The The CPUfreq driver must set the new frequency when called here. The
...@@ -210,14 +207,14 @@ Not all drivers are expected to implement it, as sleeping from within ...@@ -210,14 +207,14 @@ Not all drivers are expected to implement it, as sleeping from within
this callback isn't allowed. This callback must be highly optimized to this callback isn't allowed. This callback must be highly optimized to
do switching as fast as possible. do switching as fast as possible.
This function has two arguments: struct cpufreq_policy *policy and This function has two arguments: ``struct cpufreq_policy *policy`` and
unsigned int target_frequency. ``unsigned int target_frequency``.
1.7 setpolicy 1.7 setpolicy
------------- -------------
The setpolicy call only takes a struct cpufreq_policy *policy as The setpolicy call only takes a ``struct cpufreq_policy *policy`` as
argument. You need to set the lower limit of the in-processor or argument. You need to set the lower limit of the in-processor or
in-chipset dynamic frequency switching to policy->min, the upper limit in-chipset dynamic frequency switching to policy->min, the upper limit
to policy->max, and -if supported- select a performance-oriented to policy->max, and -if supported- select a performance-oriented
...@@ -278,10 +275,10 @@ table. ...@@ -278,10 +275,10 @@ table.
cpufreq_for_each_valid_entry(pos, table) - iterates over all entries, cpufreq_for_each_valid_entry(pos, table) - iterates over all entries,
excluding CPUFREQ_ENTRY_INVALID frequencies. excluding CPUFREQ_ENTRY_INVALID frequencies.
Use arguments "pos" - a cpufreq_frequency_table * as a loop cursor and Use arguments "pos" - a ``cpufreq_frequency_table *`` as a loop cursor and
"table" - the cpufreq_frequency_table * you want to iterate over. "table" - the ``cpufreq_frequency_table *`` you want to iterate over.
For example: For example::
struct cpufreq_frequency_table *pos, *driver_freq_table; struct cpufreq_frequency_table *pos, *driver_freq_table;
......
...@@ -15,6 +15,7 @@ Author: Dominik Brodowski <linux@brodo.de> ...@@ -15,6 +15,7 @@ Author: Dominik Brodowski <linux@brodo.de>
:maxdepth: 1 :maxdepth: 1
core core
cpu-drivers
Mailing List Mailing List
------------ ------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment