1c3df47e0SNate Lawson.\" Copyright (c) 2005 Nate Lawson 2c3df47e0SNate Lawson.\" All rights reserved. 3c3df47e0SNate Lawson.\" 4c3df47e0SNate Lawson.\" Redistribution and use in source and binary forms, with or without 5c3df47e0SNate Lawson.\" modification, are permitted provided that the following conditions 6c3df47e0SNate Lawson.\" are met: 7c3df47e0SNate Lawson.\" 1. Redistributions of source code must retain the above copyright 8c3df47e0SNate Lawson.\" notice, this list of conditions and the following disclaimer. 9c3df47e0SNate Lawson.\" 2. Redistributions in binary form must reproduce the above copyright 10c3df47e0SNate Lawson.\" notice, this list of conditions and the following disclaimer in the 11c3df47e0SNate Lawson.\" documentation and/or other materials provided with the distribution. 12c3df47e0SNate Lawson.\" 13c3df47e0SNate Lawson.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14c3df47e0SNate Lawson.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15c3df47e0SNate Lawson.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16c3df47e0SNate Lawson.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17c3df47e0SNate Lawson.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18c3df47e0SNate Lawson.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19c3df47e0SNate Lawson.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20c3df47e0SNate Lawson.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21c3df47e0SNate Lawson.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22c3df47e0SNate Lawson.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23c3df47e0SNate Lawson.\" SUCH DAMAGE. 24c3df47e0SNate Lawson.\" 25c3df47e0SNate Lawson.\" $FreeBSD$ 26c3df47e0SNate Lawson.\" 27edd0e4caSNate Lawson.Dd February 20, 2005 28c3df47e0SNate Lawson.Dt CPUFREQ 4 29c3df47e0SNate Lawson.Os 30c3df47e0SNate Lawson.Sh NAME 31c3df47e0SNate Lawson.Nm cpufreq 32c3df47e0SNate Lawson.Nd CPU frequency control framework 33c3df47e0SNate Lawson.Sh SYNOPSIS 34c3df47e0SNate Lawson.Cd "device cpufreq" 35c3df47e0SNate Lawson.Pp 36c3df47e0SNate Lawson.In sys/cpu.h 37c3df47e0SNate Lawson.Ft int 384aff7744SRuslan Ermilov.Fn cpufreq_levels "device_t dev" "struct cf_level *levels" "int *count" 39c3df47e0SNate Lawson.Ft int 404aff7744SRuslan Ermilov.Fn cpufreq_set "device_t dev" "const struct cf_level *level" "int priority" 41c3df47e0SNate Lawson.Ft int 424aff7744SRuslan Ermilov.Fn cpufreq_get "device_t dev" "struct cf_level *level" 43c3df47e0SNate Lawson.Ft int 44c3df47e0SNate Lawson.Fo cpufreq_drv_settings 45c3df47e0SNate Lawson.Fa "device_t dev" 46c3df47e0SNate Lawson.Fa "struct cf_setting *sets" 47c3df47e0SNate Lawson.Fa "int *count" 48c3df47e0SNate Lawson.Fc 49c3df47e0SNate Lawson.Ft int 507b6b7181SNate Lawson.Fn cpufreq_drv_type "device_t dev" "int *type" 517b6b7181SNate Lawson.Ft int 524aff7744SRuslan Ermilov.Fn cpufreq_drv_set "device_t dev" "const struct cf_setting *set" 53c3df47e0SNate Lawson.Ft int 544aff7744SRuslan Ermilov.Fn cpufreq_drv_get "device_t dev" "struct cf_setting *set" 55c3df47e0SNate Lawson.Sh DESCRIPTION 56c3df47e0SNate LawsonThe 57c3df47e0SNate Lawson.Nm 58c3df47e0SNate Lawsondriver provides a unified kernel and user interface to CPU frequency 59c3df47e0SNate Lawsoncontrol drivers. 60c3df47e0SNate LawsonIt combines multiple drivers offering different settings into a single 61c3df47e0SNate Lawsoninterface of all possible levels. 62c3df47e0SNate LawsonUsers can access this interface directly via 63c3df47e0SNate Lawson.Xr sysctl 8 64c3df47e0SNate Lawsonor by indicating to 65c3df47e0SNate Lawson.Xr power_profile 8 66c3df47e0SNate Lawsonthat it should switch settings when the AC line state changes via 67c3df47e0SNate Lawson.Xr rc.conf 5 . 68c3df47e0SNate Lawson.Sh SYSCTLS 69c3df47e0SNate LawsonThese settings may be overridden by kernel drivers requesting alternate 70c3df47e0SNate Lawsonsettings. 71c3df47e0SNate LawsonIf this occurs, the original values will be restored once the condition 724aff7744SRuslan Ermilovhas passed (e.g., the system has cooled sufficiently). 734aff7744SRuslan ErmilovIf a sysctl cannot be set due to an override condition, it will return 744aff7744SRuslan Ermilov.Er EPERM . 75c3df47e0SNate Lawson.Bl -tag -width indent 76c3df47e0SNate Lawson.It Va dev.cpu.%d.freq 77c3df47e0SNate LawsonCurrent active CPU frequency in MHz. 78c3df47e0SNate Lawson.It Va dev.cpu.%d.freq_levels 79c3df47e0SNate LawsonCurrently available levels for the CPU frequency and power usage for each. 80c3df47e0SNate LawsonValues are in units of MHz and milliwatts. 81c3df47e0SNate Lawson.El 82c3df47e0SNate Lawson.Sh SUPPORTED DRIVERS 83c3df47e0SNate LawsonThe following device drivers offer absolute frequency control via the 84c3df47e0SNate Lawson.Nm 85c3df47e0SNate Lawsoninterface. 86c3df47e0SNate LawsonUsually, only one of these can be active at a time. 87c3df47e0SNate Lawson.Pp 88c3df47e0SNate Lawson.Bl -tag -compact -width ".Xr acpi_perf 4" 89c3df47e0SNate Lawson.It Xr acpi_perf 4 90c3df47e0SNate LawsonACPI CPU performance states 91edd0e4caSNate Lawson.It Xr est 4 92edd0e4caSNate LawsonIntel Enhanced SpeedStep 93c3df47e0SNate Lawson.It Xr ichss 4 94c3df47e0SNate LawsonIntel SpeedStep for ICH 95c3df47e0SNate Lawson.El 96c3df47e0SNate Lawson.Pp 97c3df47e0SNate LawsonThe following device drivers offer relative frequency control and 98c3df47e0SNate Lawsonhave an additive effect: 99c3df47e0SNate Lawson.Pp 1004aff7744SRuslan Ermilov.Bl -tag -compact -width ".Xr acpi_throttle 4" 101c3df47e0SNate Lawson.It Xr acpi_throttle 4 102c3df47e0SNate LawsonACPI CPU throttling 103c3df47e0SNate Lawson.El 104c3df47e0SNate Lawson.Sh KERNEL INTERFACE 105c3df47e0SNate LawsonKernel components can query and set CPU frequencies through the 106c3df47e0SNate Lawson.Nm 107c3df47e0SNate Lawsonkernel interface. 108c3df47e0SNate LawsonThis involves obtaining a 109c3df47e0SNate Lawson.Nm 110c3df47e0SNate Lawsondevice, calling 111c3df47e0SNate Lawson.Fn cpufreq_levels 112c3df47e0SNate Lawsonto get the currently available frequency levels, 113c3df47e0SNate Lawsonchecking the current level with 114c3df47e0SNate Lawson.Fn cpufreq_get , 115c3df47e0SNate Lawsonand setting a new one from the list with 116c3df47e0SNate Lawson.Fn cpufreq_set . 117c3df47e0SNate LawsonEach level may actually reference more than one 118c3df47e0SNate Lawson.Nm 119c3df47e0SNate Lawsondriver but kernel components do not need to be aware of this. 120c3df47e0SNate LawsonThe 1214aff7744SRuslan Ermilov.Va total_set 122c3df47e0SNate Lawsonelement of 1234aff7744SRuslan Ermilov.Vt "struct cf_level" 124c3df47e0SNate Lawsonprovides a summary of the frequency and power for this level. 125c3df47e0SNate LawsonUnknown or irrelevant values are set to 1264aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN . 127c3df47e0SNate Lawson.Pp 128c3df47e0SNate LawsonThe 129c3df47e0SNate Lawson.Fn cpufreq_levels 130c3df47e0SNate Lawsonmethod takes a 131c3df47e0SNate Lawson.Nm 132c3df47e0SNate Lawsondevice and an empty array of 1334aff7744SRuslan Ermilov.Fa levels . 134c3df47e0SNate LawsonThe 1354aff7744SRuslan Ermilov.Fa count 136c3df47e0SNate Lawsonvalue should be set to the number of levels available and after the 137c3df47e0SNate Lawsonfunction completes, will be set to the actual number of levels returned. 138c3df47e0SNate LawsonIf there are more levels than 1394aff7744SRuslan Ermilov.Fa count 1404aff7744SRuslan Ermilovwill allow, it should return 1414aff7744SRuslan Ermilov.Er E2BIG . 142c3df47e0SNate Lawson.Pp 143c3df47e0SNate LawsonThe 144c3df47e0SNate Lawson.Fn cpufreq_get 145c3df47e0SNate Lawsonmethod takes a pointer to space to store a 1464aff7744SRuslan Ermilov.Fa level . 147c3df47e0SNate LawsonAfter successful completion, the output will be the current active level 148c3df47e0SNate Lawsonand is equal to one of the levels returned by 149c3df47e0SNate Lawson.Fn cpufreq_levels . 150c3df47e0SNate Lawson.Pp 151c3df47e0SNate LawsonThe 152c3df47e0SNate Lawson.Fn cpufreq_set 153c3df47e0SNate Lawsonmethod takes a pointer a 1544aff7744SRuslan Ermilov.Fa level 155c3df47e0SNate Lawsonand attempts to activate it. 156c3df47e0SNate LawsonThe 1574aff7744SRuslan Ermilov.Fa priority 1584aff7744SRuslan Ermilov(i.e., 1594aff7744SRuslan Ermilov.Dv CPUFREQ_PRIO_KERN ) 160c3df47e0SNate Lawsontells 161c3df47e0SNate Lawson.Nm 162c3df47e0SNate Lawsonwhether to override previous settings while activating this level. 163c3df47e0SNate LawsonIf 1644aff7744SRuslan Ermilov.Fa priority 165c3df47e0SNate Lawsonis higher than the current active level, that level will be saved and 166c3df47e0SNate Lawsonoverridden with the new level. 167952a0376SNate LawsonIf a level is already saved, the new level is set without overwriting 168952a0376SNate Lawsonthe older saved level. 169c3df47e0SNate LawsonIf 170c3df47e0SNate Lawson.Fn cpufreq_set 1714aff7744SRuslan Ermilovis called with a 1724aff7744SRuslan Ermilov.Dv NULL 1734aff7744SRuslan Ermilov.Fa level , 174952a0376SNate Lawsonthe saved level will be restored. 175952a0376SNate LawsonIf there is no saved level, 176952a0376SNate Lawson.Fn cpufreq_set 177952a0376SNate Lawsonwill return 178952a0376SNate Lawson.Er ENXIO . 179c3df47e0SNate LawsonIf 1804aff7744SRuslan Ermilov.Fa priority 181c3df47e0SNate Lawsonis lower than the current active level's priority, this method returns 1824aff7744SRuslan Ermilov.Er EPERM . 183c3df47e0SNate Lawson.Sh DRIVER INTERFACE 184c3df47e0SNate LawsonKernel drivers offering hardware-specific CPU frequency control export 185c3df47e0SNate Lawsontheir individual settings through the 186c3df47e0SNate Lawson.Nm 187c3df47e0SNate Lawsondriver interface. 1887b6b7181SNate LawsonThis involves implementing these methods: 189c3df47e0SNate Lawson.Fn cpufreq_drv_settings , 1907b6b7181SNate Lawson.Fn cpufreq_drv_type , 191c3df47e0SNate Lawson.Fn cpufreq_drv_set , 192c3df47e0SNate Lawsonand 193c3df47e0SNate Lawson.Fn cpufreq_drv_get . 194c3df47e0SNate LawsonAdditionally, the driver must attach a device as a child of a CPU 195c3df47e0SNate Lawsondevice so that these methods can be called by the 196c3df47e0SNate Lawson.Nm 197c3df47e0SNate Lawsonframework. 198c3df47e0SNate Lawson.Pp 199c3df47e0SNate LawsonThe 200c3df47e0SNate Lawson.Fn cpufreq_drv_settings 201c3df47e0SNate Lawsonmethod returns an array of currently available settings, each of type 2024aff7744SRuslan Ermilov.Vt "struct cf_setting" . 203c3df47e0SNate LawsonThe driver should set unknown or irrelevant values to 2044aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN . 205c3df47e0SNate LawsonAll the following elements for each setting should be returned: 206c3df47e0SNate Lawson.Bd -literal 207c3df47e0SNate Lawsonstruct cf_setting { 208c3df47e0SNate Lawson int freq; /* CPU clock in Mhz or 100ths of a percent. */ 209c3df47e0SNate Lawson int volts; /* Voltage in mV. */ 210c3df47e0SNate Lawson int power; /* Power consumed in mW. */ 211c3df47e0SNate Lawson int lat; /* Transition latency in us. */ 212c3df47e0SNate Lawson device_t dev; /* Driver providing this setting. */ 213c3df47e0SNate Lawson}; 214c3df47e0SNate Lawson.Ed 215c3df47e0SNate Lawson.Pp 216c3df47e0SNate LawsonOn entry to this method, 2174aff7744SRuslan Ermilov.Fa count 218c3df47e0SNate Lawsoncontains the number of settings that can be returned. 219c3df47e0SNate LawsonOn successful completion, the driver sets it to the actual number of 220c3df47e0SNate Lawsonsettings returned. 221c3df47e0SNate LawsonIf the driver offers more settings than 2224aff7744SRuslan Ermilov.Fa count 2234aff7744SRuslan Ermilovwill allow, it should return 2244aff7744SRuslan Ermilov.Er E2BIG . 2257b6b7181SNate Lawson.Pp 2267b6b7181SNate LawsonThe 2277b6b7181SNate Lawson.Fn cpufreq_drv_type 2287b6b7181SNate Lawsonmethod indicates the type of settings it offers, either 2294aff7744SRuslan Ermilov.Dv CPUFREQ_TYPE_ABSOLUTE 230c3df47e0SNate Lawsonor 2314aff7744SRuslan Ermilov.Dv CPUFREQ_TYPE_RELATIVE . 2327b6b7181SNate LawsonAdditionally, the driver may set the 2337b6b7181SNate Lawson.Dv CPUFREQ_FLAG_INFO_ONLY 2347b6b7181SNate Lawsonflag if the settings it provides are information for other drivers only 2357b6b7181SNate Lawsonand cannot be passed to 2367b6b7181SNate Lawson.Fn cpufreq_drv_set 2377b6b7181SNate Lawsonto activate them. 238c3df47e0SNate Lawson.Pp 239c3df47e0SNate LawsonThe 240c3df47e0SNate Lawson.Fn cpufreq_drv_set 241c3df47e0SNate Lawsonmethod takes a driver setting and makes it active. 242c3df47e0SNate LawsonIf the setting is invalid or not currently available, it should return 2434aff7744SRuslan Ermilov.Er EINVAL . 244c3df47e0SNate Lawson.Pp 245c3df47e0SNate LawsonThe 246c3df47e0SNate Lawson.Fn cpufreq_drv_get 247c3df47e0SNate Lawsonmethod returns the currently-active driver setting. 248c3df47e0SNate LawsonThe 2494aff7744SRuslan Ermilov.Vt "struct cf_setting" 250c3df47e0SNate Lawsonreturned must be valid for passing to 251c3df47e0SNate Lawson.Fn cpufreq_drv_set , 252c3df47e0SNate Lawsonincluding all elements being filled out correctly. 253c3df47e0SNate LawsonIf the driver cannot infer the current setting 254c3df47e0SNate Lawson(even by estimating it with 255c3df47e0SNate Lawson.Fn cpu_est_clockrate ) 256c3df47e0SNate Lawsonthen it should set all elements to 2574aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN . 2584aff7744SRuslan Ermilov.Sh SEE ALSO 2594aff7744SRuslan Ermilov.Xr acpi 4 , 2604aff7744SRuslan Ermilov.Xr sysctl 8 2614aff7744SRuslan Ermilov.Sh AUTHORS 2624aff7744SRuslan Ermilov.An Nate Lawson 263c3df47e0SNate Lawson.Sh BUGS 264c3df47e0SNate LawsonThe following drivers have not yet been converted to the 265c3df47e0SNate Lawson.Nm 266c3df47e0SNate Lawsoninterface: 267c3df47e0SNate Lawson.Xr longrun 4 , 268c3df47e0SNate Lawson.Xr p4tcc 4 . 269c3df47e0SNate Lawson.Pp 270952a0376SNate LawsonNotification of CPU and bus frequency changes is not implemented yet. 271c3df47e0SNate Lawson.Pp 272c3df47e0SNate LawsonWhen multiple CPUs offer frequency control, they cannot be set to different 273c3df47e0SNate Lawsonlevels and must all offer the same frequency settings. 274