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.\" 27*963a032bSMateusz Piotrowski.Dd April 4, 2022 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 654f068961SRuslan Ermilov.Pa /etc/rc.d/power_profile 66c3df47e0SNate Lawsonthat it should switch settings when the AC line state changes via 67c3df47e0SNate Lawson.Xr rc.conf 5 . 6844cb3ab0SHiroki Sato.Sh SYSCTL VARIABLES 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 . 75eb2336ddSMarcus Alves Grando.Pp 7643524989SConrad MeyerThe frequency cannot be changed if TSC is in use as the timecounter and the 7743524989SConrad Meyerhardware does not support invariant TSC. 78eb2336ddSMarcus Alves GrandoThis is because the timecounter system needs to use a source that has a 792b0b822eSMarcus Alves Grandoconstant rate. 8043524989SConrad Meyer(On invariant TSC hardware, the TSC runs at the P0 rate regardless of the 8143524989SConrad Meyerconfigured P-state.) 8243524989SConrad MeyerModern hardware mostly has invariant TSC. 832b0b822eSMarcus Alves GrandoThe timecounter source can be changed with the 84eb2336ddSMarcus Alves Grando.Pa kern.timecounter.hardware 852b0b822eSMarcus Alves Grandosysctl. 862b0b822eSMarcus Alves GrandoAvailable modes are in 87eb2336ddSMarcus Alves Grando.Pa kern.timecounter.choice 88eb2336ddSMarcus Alves Grandosysctl entry. 89c3df47e0SNate Lawson.Bl -tag -width indent 90c3df47e0SNate Lawson.It Va dev.cpu.%d.freq 91c3df47e0SNate LawsonCurrent active CPU frequency in MHz. 924577cf37SConrad Meyer.It Va dev.cpu.%d.freq_driver 934577cf37SConrad MeyerThe specific 944577cf37SConrad Meyer.Nm 954577cf37SConrad Meyerdriver used by this cpu. 96c3df47e0SNate Lawson.It Va dev.cpu.%d.freq_levels 9770610c87SNate LawsonCurrently available levels for the CPU (frequency/power usage). 98c3df47e0SNate LawsonValues are in units of MHz and milliwatts. 9970610c87SNate Lawson.It Va dev.DEVICE.%d.freq_settings 10070610c87SNate LawsonCurrently available settings for the driver (frequency/power usage). 10170610c87SNate LawsonValues are in units of MHz and milliwatts. 10270610c87SNate LawsonThis is helpful for understanding which settings are offered by which 10370610c87SNate Lawsondriver for debugging purposes. 10470610c87SNate Lawson.It Va debug.cpufreq.lowest 10570610c87SNate LawsonLowest CPU frequency in MHz to offer to users. 10670610c87SNate LawsonThis setting is also accessible via a tunable with the same name. 107f41eb02cSNate LawsonThis can be used to disable very low levels that may be unusable on 108f41eb02cSNate Lawsonsome systems. 109f41eb02cSNate Lawson.It Va debug.cpufreq.verbose 110f41eb02cSNate LawsonPrint verbose messages. 111f41eb02cSNate LawsonThis setting is also accessible via a tunable with the same name. 11243524989SConrad Meyer.It Va debug.hwpstate_pstate_limit 11343524989SConrad MeyerIf enabled, the AMD hwpstate driver limits administrative control of P-states 11443524989SConrad Meyer(including by 11543524989SConrad Meyer.Xr powerd 8 ) 11643524989SConrad Meyerto the value in the 0xc0010061 MSR, known as "PStateCurLim[CurPstateLimit]." 11743524989SConrad MeyerIt is disabled (0) by default. 11843524989SConrad MeyerOn some hardware, the limit register seems to simply follow the configured 11943524989SConrad MeyerP-state, which results in the inability to ever raise the P-state back to P0 12043524989SConrad Meyerfrom a reduced frequency state. 121c3df47e0SNate Lawson.El 122c3df47e0SNate Lawson.Sh SUPPORTED DRIVERS 123c3df47e0SNate LawsonThe following device drivers offer absolute frequency control via the 124c3df47e0SNate Lawson.Nm 125c3df47e0SNate Lawsoninterface. 126c3df47e0SNate LawsonUsually, only one of these can be active at a time. 127c3df47e0SNate Lawson.Pp 128*963a032bSMateusz Piotrowski.Bl -tag -compact -width "hwpstate_intel(4)" 129*963a032bSMateusz Piotrowski.It acpi_perf 130c3df47e0SNate LawsonACPI CPU performance states 131*963a032bSMateusz Piotrowski.It Xr est 4 132edd0e4caSNate LawsonIntel Enhanced SpeedStep 133*963a032bSMateusz Piotrowski.It hwpstate 13443524989SConrad MeyerAMD Cool'n'Quiet2 used in K10 through Family 17h 135*963a032bSMateusz Piotrowski.It Xr hwpstate_intel 4 13643524989SConrad MeyerIntel SpeedShift driver 137*963a032bSMateusz Piotrowski.It ichss 138c3df47e0SNate LawsonIntel SpeedStep for ICH 139*963a032bSMateusz Piotrowski.It powernow 140259c7688SChristian BruefferAMD PowerNow!\& and Cool'n'Quiet for K7 and K8 141*963a032bSMateusz Piotrowski.It smist 142f8420b58SNate LawsonIntel SMI-based SpeedStep for PIIX4 143c3df47e0SNate Lawson.El 144c3df47e0SNate Lawson.Pp 145c3df47e0SNate LawsonThe following device drivers offer relative frequency control and 146c3df47e0SNate Lawsonhave an additive effect: 147c3df47e0SNate Lawson.Pp 148*963a032bSMateusz Piotrowski.Bl -tag -compact -width "acpi_throttle" 149*963a032bSMateusz Piotrowski.It acpi_throttle 150c3df47e0SNate LawsonACPI CPU throttling 151*963a032bSMateusz Piotrowski.It p4tcc 15270610c87SNate LawsonPentium 4 Thermal Control Circuitry 153c3df47e0SNate Lawson.El 154c3df47e0SNate Lawson.Sh KERNEL INTERFACE 155c3df47e0SNate LawsonKernel components can query and set CPU frequencies through the 156c3df47e0SNate Lawson.Nm 157c3df47e0SNate Lawsonkernel interface. 158c3df47e0SNate LawsonThis involves obtaining a 159c3df47e0SNate Lawson.Nm 160c3df47e0SNate Lawsondevice, calling 161c3df47e0SNate Lawson.Fn cpufreq_levels 162c3df47e0SNate Lawsonto get the currently available frequency levels, 163c3df47e0SNate Lawsonchecking the current level with 164c3df47e0SNate Lawson.Fn cpufreq_get , 165c3df47e0SNate Lawsonand setting a new one from the list with 166c3df47e0SNate Lawson.Fn cpufreq_set . 167c3df47e0SNate LawsonEach level may actually reference more than one 168c3df47e0SNate Lawson.Nm 169c3df47e0SNate Lawsondriver but kernel components do not need to be aware of this. 170c3df47e0SNate LawsonThe 1714aff7744SRuslan Ermilov.Va total_set 172c3df47e0SNate Lawsonelement of 1734aff7744SRuslan Ermilov.Vt "struct cf_level" 174c3df47e0SNate Lawsonprovides a summary of the frequency and power for this level. 175c3df47e0SNate LawsonUnknown or irrelevant values are set to 1764aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN . 177c3df47e0SNate Lawson.Pp 178c3df47e0SNate LawsonThe 179c3df47e0SNate Lawson.Fn cpufreq_levels 180c3df47e0SNate Lawsonmethod takes a 181c3df47e0SNate Lawson.Nm 182c3df47e0SNate Lawsondevice and an empty array of 1834aff7744SRuslan Ermilov.Fa levels . 184c3df47e0SNate LawsonThe 1854aff7744SRuslan Ermilov.Fa count 186c3df47e0SNate Lawsonvalue should be set to the number of levels available and after the 187c3df47e0SNate Lawsonfunction completes, will be set to the actual number of levels returned. 188c3df47e0SNate LawsonIf there are more levels than 1894aff7744SRuslan Ermilov.Fa count 1904aff7744SRuslan Ermilovwill allow, it should return 1914aff7744SRuslan Ermilov.Er E2BIG . 192c3df47e0SNate Lawson.Pp 193c3df47e0SNate LawsonThe 194c3df47e0SNate Lawson.Fn cpufreq_get 195c3df47e0SNate Lawsonmethod takes a pointer to space to store a 1964aff7744SRuslan Ermilov.Fa level . 197c3df47e0SNate LawsonAfter successful completion, the output will be the current active level 198c3df47e0SNate Lawsonand is equal to one of the levels returned by 199c3df47e0SNate Lawson.Fn cpufreq_levels . 200c3df47e0SNate Lawson.Pp 201c3df47e0SNate LawsonThe 202c3df47e0SNate Lawson.Fn cpufreq_set 203c3df47e0SNate Lawsonmethod takes a pointer a 2044aff7744SRuslan Ermilov.Fa level 205c3df47e0SNate Lawsonand attempts to activate it. 206c3df47e0SNate LawsonThe 2074aff7744SRuslan Ermilov.Fa priority 2084aff7744SRuslan Ermilov(i.e., 2094aff7744SRuslan Ermilov.Dv CPUFREQ_PRIO_KERN ) 210c3df47e0SNate Lawsontells 211c3df47e0SNate Lawson.Nm 212c3df47e0SNate Lawsonwhether to override previous settings while activating this level. 213c3df47e0SNate LawsonIf 2144aff7744SRuslan Ermilov.Fa priority 215c3df47e0SNate Lawsonis higher than the current active level, that level will be saved and 216c3df47e0SNate Lawsonoverridden with the new level. 217952a0376SNate LawsonIf a level is already saved, the new level is set without overwriting 218952a0376SNate Lawsonthe older saved level. 219c3df47e0SNate LawsonIf 220c3df47e0SNate Lawson.Fn cpufreq_set 2214aff7744SRuslan Ermilovis called with a 2224aff7744SRuslan Ermilov.Dv NULL 2234aff7744SRuslan Ermilov.Fa level , 224952a0376SNate Lawsonthe saved level will be restored. 225952a0376SNate LawsonIf there is no saved level, 226952a0376SNate Lawson.Fn cpufreq_set 227952a0376SNate Lawsonwill return 228952a0376SNate Lawson.Er ENXIO . 229c3df47e0SNate LawsonIf 2304aff7744SRuslan Ermilov.Fa priority 231c3df47e0SNate Lawsonis lower than the current active level's priority, this method returns 2324aff7744SRuslan Ermilov.Er EPERM . 233c3df47e0SNate Lawson.Sh DRIVER INTERFACE 234c3df47e0SNate LawsonKernel drivers offering hardware-specific CPU frequency control export 235c3df47e0SNate Lawsontheir individual settings through the 236c3df47e0SNate Lawson.Nm 237c3df47e0SNate Lawsondriver interface. 2387b6b7181SNate LawsonThis involves implementing these methods: 239c3df47e0SNate Lawson.Fn cpufreq_drv_settings , 2407b6b7181SNate Lawson.Fn cpufreq_drv_type , 241c3df47e0SNate Lawson.Fn cpufreq_drv_set , 242c3df47e0SNate Lawsonand 243c3df47e0SNate Lawson.Fn cpufreq_drv_get . 244c3df47e0SNate LawsonAdditionally, the driver must attach a device as a child of a CPU 245c3df47e0SNate Lawsondevice so that these methods can be called by the 246c3df47e0SNate Lawson.Nm 247c3df47e0SNate Lawsonframework. 248c3df47e0SNate Lawson.Pp 249c3df47e0SNate LawsonThe 250c3df47e0SNate Lawson.Fn cpufreq_drv_settings 251c3df47e0SNate Lawsonmethod returns an array of currently available settings, each of type 2524aff7744SRuslan Ermilov.Vt "struct cf_setting" . 253c3df47e0SNate LawsonThe driver should set unknown or irrelevant values to 2544aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN . 255c3df47e0SNate LawsonAll the following elements for each setting should be returned: 256c3df47e0SNate Lawson.Bd -literal 257c3df47e0SNate Lawsonstruct cf_setting { 25879649302SGavin Atkinson int freq; /* CPU clock in MHz or 100ths of a percent. */ 259c3df47e0SNate Lawson int volts; /* Voltage in mV. */ 260c3df47e0SNate Lawson int power; /* Power consumed in mW. */ 261c3df47e0SNate Lawson int lat; /* Transition latency in us. */ 262c3df47e0SNate Lawson device_t dev; /* Driver providing this setting. */ 263c3df47e0SNate Lawson}; 264c3df47e0SNate Lawson.Ed 265c3df47e0SNate Lawson.Pp 266c3df47e0SNate LawsonOn entry to this method, 2674aff7744SRuslan Ermilov.Fa count 268c3df47e0SNate Lawsoncontains the number of settings that can be returned. 269c3df47e0SNate LawsonOn successful completion, the driver sets it to the actual number of 270c3df47e0SNate Lawsonsettings returned. 271c3df47e0SNate LawsonIf the driver offers more settings than 2724aff7744SRuslan Ermilov.Fa count 2734aff7744SRuslan Ermilovwill allow, it should return 2744aff7744SRuslan Ermilov.Er E2BIG . 2757b6b7181SNate Lawson.Pp 2767b6b7181SNate LawsonThe 2777b6b7181SNate Lawson.Fn cpufreq_drv_type 2787b6b7181SNate Lawsonmethod indicates the type of settings it offers, either 2794aff7744SRuslan Ermilov.Dv CPUFREQ_TYPE_ABSOLUTE 280c3df47e0SNate Lawsonor 2814aff7744SRuslan Ermilov.Dv CPUFREQ_TYPE_RELATIVE . 2827b6b7181SNate LawsonAdditionally, the driver may set the 2837b6b7181SNate Lawson.Dv CPUFREQ_FLAG_INFO_ONLY 2847b6b7181SNate Lawsonflag if the settings it provides are information for other drivers only 2857b6b7181SNate Lawsonand cannot be passed to 2867b6b7181SNate Lawson.Fn cpufreq_drv_set 2877b6b7181SNate Lawsonto activate them. 288c3df47e0SNate Lawson.Pp 289c3df47e0SNate LawsonThe 290c3df47e0SNate Lawson.Fn cpufreq_drv_set 291c3df47e0SNate Lawsonmethod takes a driver setting and makes it active. 292c3df47e0SNate LawsonIf the setting is invalid or not currently available, it should return 2934aff7744SRuslan Ermilov.Er EINVAL . 294c3df47e0SNate Lawson.Pp 295c3df47e0SNate LawsonThe 296c3df47e0SNate Lawson.Fn cpufreq_drv_get 297c3df47e0SNate Lawsonmethod returns the currently-active driver setting. 298c3df47e0SNate LawsonThe 2994aff7744SRuslan Ermilov.Vt "struct cf_setting" 300c3df47e0SNate Lawsonreturned must be valid for passing to 301c3df47e0SNate Lawson.Fn cpufreq_drv_set , 302c3df47e0SNate Lawsonincluding all elements being filled out correctly. 303c3df47e0SNate LawsonIf the driver cannot infer the current setting 304c3df47e0SNate Lawson(even by estimating it with 305c3df47e0SNate Lawson.Fn cpu_est_clockrate ) 306c3df47e0SNate Lawsonthen it should set all elements to 3074aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN . 3084aff7744SRuslan Ermilov.Sh SEE ALSO 3094aff7744SRuslan Ermilov.Xr acpi 4 , 310f89d8b9aSSean Bruno.Xr est 4 , 311e3bf726bSAlexander Motin.Xr timecounters 4 , 3121d9fef71SDaniel Gerzo.Xr powerd 8 , 3134aff7744SRuslan Ermilov.Xr sysctl 8 3144aff7744SRuslan Ermilov.Sh AUTHORS 3154aff7744SRuslan Ermilov.An Nate Lawson 316f41eb02cSNate Lawson.An Bruno Ducrot 317f41eb02cSNate Lawsoncontributed the 318f41eb02cSNate Lawson.Pa powernow 319f41eb02cSNate Lawsondriver. 320c3df47e0SNate Lawson.Sh BUGS 321c3df47e0SNate LawsonThe following drivers have not yet been converted to the 322c3df47e0SNate Lawson.Nm 323c3df47e0SNate Lawsoninterface: 32470610c87SNate Lawson.Xr longrun 4 . 325c3df47e0SNate Lawson.Pp 326952a0376SNate LawsonNotification of CPU and bus frequency changes is not implemented yet. 327c3df47e0SNate Lawson.Pp 328c3df47e0SNate LawsonWhen multiple CPUs offer frequency control, they cannot be set to different 329c3df47e0SNate Lawsonlevels and must all offer the same frequency settings. 330