123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- CPU frequency and voltage scaling code in the Linux(TM) kernel
- L i n u x C P U F r e q
- C P U F r e q C o r e
- Dominik Brodowski <linux@brodo.de>
- David Kimdon <dwhedon@debian.org>
- Clock scaling allows you to change the clock speed of the CPUs on the
- fly. This is a nice method to save battery power, because the lower
- the clock speed, the less power the CPU consumes.
- Contents:
- ---------
- 1. CPUFreq core and interfaces
- 2. CPUFreq notifiers
- 3. CPUFreq Table Generation with Operating Performance Point (OPP)
- 1. General Information
- =======================
- The CPUFreq core code is located in drivers/cpufreq/cpufreq.c. This
- cpufreq code offers a standardized interface for the CPUFreq
- architecture drivers (those pieces of code that do actual
- frequency transitions), as well as to "notifiers". These are device
- drivers or other part of the kernel that need to be informed of
- policy changes (ex. thermal modules like ACPI) or of all
- frequency changes (ex. timing code) or even need to force certain
- speed limits (like LCD drivers on ARM architecture). Additionally, the
- kernel "constant" loops_per_jiffy is updated on frequency changes
- here.
- Reference counting is done by cpufreq_get_cpu and cpufreq_put_cpu,
- which make sure that the cpufreq processor driver is correctly
- registered with the core, and will not be unloaded until
- cpufreq_put_cpu is called.
- 2. CPUFreq notifiers
- ====================
- CPUFreq notifiers conform to the standard kernel notifier interface.
- See linux/include/linux/notifier.h for details on notifiers.
- There are two different CPUFreq notifiers - policy notifiers and
- transition notifiers.
- 2.1 CPUFreq policy notifiers
- ----------------------------
- These are notified when a new policy is intended to be set. Each
- CPUFreq policy notifier is called twice for a policy transition:
- 1.) During CPUFREQ_ADJUST all CPUFreq notifiers may change the limit if
- they see a need for this - may it be thermal considerations or
- hardware limitations.
- 2.) And during CPUFREQ_NOTIFY all notifiers are informed of the new policy
- - if two hardware drivers failed to agree on a new policy before this
- stage, the incompatible hardware shall be shut down, and the user
- informed of this.
- The phase is specified in the second argument to the notifier.
- The third argument, a void *pointer, points to a struct cpufreq_policy
- consisting of five values: cpu, min, max, policy and max_cpu_freq. min
- and max are the lower and upper frequencies (in kHz) of the new
- policy, policy the new policy, cpu the number of the affected CPU; and
- max_cpu_freq the maximum supported CPU frequency. This value is given
- for informational purposes only.
- 2.2 CPUFreq transition notifiers
- --------------------------------
- These are notified twice when the CPUfreq driver switches the CPU core
- frequency and this change has any external implications.
- The second argument specifies the phase - CPUFREQ_PRECHANGE or
- CPUFREQ_POSTCHANGE.
- The third argument is a struct cpufreq_freqs with the following
- values:
- cpu - number of the affected CPU
- old - old frequency
- new - new frequency
- 3. CPUFreq Table Generation with Operating Performance Point (OPP)
- ==================================================================
- For details about OPP, see Documentation/power/opp.txt
- dev_pm_opp_init_cpufreq_table - cpufreq framework typically is initialized with
- cpufreq_frequency_table_cpuinfo which is provided with the list of
- frequencies that are available for operation. This function provides
- a ready to use conversion routine to translate the OPP layer's internal
- information about the available frequencies into a format readily
- providable to cpufreq.
- WARNING: Do not use this function in interrupt context.
- Example:
- soc_pm_init()
- {
- /* Do things */
- r = dev_pm_opp_init_cpufreq_table(dev, &freq_table);
- if (!r)
- cpufreq_frequency_table_cpuinfo(policy, freq_table);
- /* Do other things */
- }
- NOTE: This function is available only if CONFIG_CPU_FREQ is enabled in
- addition to CONFIG_PM_OPP.
- dev_pm_opp_free_cpufreq_table - Free up the table allocated by dev_pm_opp_init_cpufreq_table
|