CPU frequency and voltage scaling code in the Linux(TM) kernel L i n u x C P U F r e q U S E R G U I D E Dominik Brodowski <linux@brodo.de> 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. Supported Architectures and Processors 1.1 ARM 1.2 x86 1.3 sparc64 1.4 ppc 1.5 SuperH 2. "Policy" / "Governor"? 2.1 Policy 2.2 Governor 3. How to change the CPU cpufreq policy and/or speed 3.1 Preferred interface: sysfs 3.2 Deprecated interfaces 1. Supported Architectures and Processors ========================================= 1.1 ARM ------- The following ARM processors are supported by cpufreq: ARM Integrator ARM-SA1100 ARM-SA1110 1.2 x86 ------- The following processors for the x86 architecture are supported by cpufreq: AMD Elan - SC400, SC410 AMD mobile K6-2+ AMD mobile K6-3+ AMD mobile Duron AMD mobile Athlon AMD Opteron AMD Athlon 64 Cyrix Media GXm Intel mobile PIII and Intel mobile PIII-M on certain chipsets Intel Pentium 4, Intel Xeon Intel Pentium M (Centrino) National Semiconductors Geode GX Transmeta Crusoe Transmeta Efficeon VIA Cyrix 3 / C3 various processors on some ACPI 2.0-compatible systems [*] [*] Only if "ACPI Processor Performance States" are available to the ACPI<->BIOS interface. 1.3 sparc64 ----------- The following processors for the sparc64 architecture are supported by cpufreq: UltraSPARC-III 1.4 ppc ------- Several "PowerBook" and "iBook2" notebooks are supported. 1.5 SuperH ---------- The following SuperH processors are supported by cpufreq: SH-3 SH-4 2. "Policy" / "Governor" ? ========================== Some CPU frequency scaling-capable processor switch between various frequencies and operating voltages "on the fly" without any kernel or user involvement. This guarantees very fast switching to a frequency which is high enough to serve the user's needs, but low enough to save power. 2.1 Policy ---------- On these systems, all you can do is select the lower and upper frequency limit as well as whether you want more aggressive power-saving or more instantly available processing power. 2.2 Governor ------------ On all other cpufreq implementations, these boundaries still need to be set. Then, a "governor" must be selected. Such a "governor" decides what speed the processor shall run within the boundaries. One such "governor" is the "userspace" governor. This one allows the user - or a yet-to-implement userspace program - to decide what specific speed the processor shall run at. 3. How to change the CPU cpufreq policy and/or speed ==================================================== 3.1 Preferred Interface: sysfs ------------------------------ The preferred interface is located in the sysfs filesystem. If you mounted it at /sys, the cpufreq interface is located in a subdirectory "cpufreq" within the cpu-device directory (e.g. /sys/devices/system/cpu/cpu0/cpufreq/ for the first CPU). cpuinfo_min_freq : this file shows the minimum operating frequency the processor can run at(in kHz) cpuinfo_max_freq : this file shows the maximum operating frequency the processor can run at(in kHz) scaling_driver : this file shows what cpufreq driver is used to set the frequency on this CPU scaling_available_governors : this file shows the CPUfreq governors available in this kernel. You can see the currently activated governor in scaling_governor, and by "echoing" the name of another governor you can change it. Please note that some governors won't load - they only work on some specific architectures or processors. scaling_min_freq and scaling_max_freq show the current "policy limits" (in kHz). By echoing new values into these files, you can change these limits. NOTE: when setting a policy you need to first set scaling_max_freq, then scaling_min_freq. If you have selected the "userspace" governor which allows you to set the CPU operating frequency to a specific value, you can read out the current frequency in scaling_setspeed. By "echoing" a new frequency into this you can change the speed of the CPU, but only within the limits of scaling_min_freq and scaling_max_freq. 3.2 Deprecated Interfaces ------------------------- Depending on your kernel configuration, you might find the following cpufreq-related files: /proc/cpufreq /proc/sys/cpu/*/speed /proc/sys/cpu/*/speed-min /proc/sys/cpu/*/speed-max These are files for deprecated interfaces to cpufreq, which offer far less functionality. Because of this, these interfaces aren't described here.