xref: /freebsd/share/man/man4/cpufreq.4 (revision 952a03767bb63cc394eadd9d5656a6f18cd2e881)
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.\"
27952a0376SNate Lawson.Dd February 14, 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.Fa "int *type"
49c3df47e0SNate Lawson.Fc
50c3df47e0SNate Lawson.Ft int
514aff7744SRuslan Ermilov.Fn cpufreq_drv_set "device_t dev" "const struct cf_setting *set"
52c3df47e0SNate Lawson.Ft int
534aff7744SRuslan Ermilov.Fn cpufreq_drv_get "device_t dev" "struct cf_setting *set"
54c3df47e0SNate Lawson.Sh DESCRIPTION
55c3df47e0SNate LawsonThe
56c3df47e0SNate Lawson.Nm
57c3df47e0SNate Lawsondriver provides a unified kernel and user interface to CPU frequency
58c3df47e0SNate Lawsoncontrol drivers.
59c3df47e0SNate LawsonIt combines multiple drivers offering different settings into a single
60c3df47e0SNate Lawsoninterface of all possible levels.
61c3df47e0SNate LawsonUsers can access this interface directly via
62c3df47e0SNate Lawson.Xr sysctl 8
63c3df47e0SNate Lawsonor by indicating to
64c3df47e0SNate Lawson.Xr power_profile 8
65c3df47e0SNate Lawsonthat it should switch settings when the AC line state changes via
66c3df47e0SNate Lawson.Xr rc.conf 5 .
67c3df47e0SNate Lawson.Sh SYSCTLS
68c3df47e0SNate LawsonThese settings may be overridden by kernel drivers requesting alternate
69c3df47e0SNate Lawsonsettings.
70c3df47e0SNate LawsonIf this occurs, the original values will be restored once the condition
714aff7744SRuslan Ermilovhas passed (e.g., the system has cooled sufficiently).
724aff7744SRuslan ErmilovIf a sysctl cannot be set due to an override condition, it will return
734aff7744SRuslan Ermilov.Er EPERM .
74c3df47e0SNate Lawson.Bl -tag -width indent
75c3df47e0SNate Lawson.It Va dev.cpu.%d.freq
76c3df47e0SNate LawsonCurrent active CPU frequency in MHz.
77c3df47e0SNate Lawson.It Va dev.cpu.%d.freq_levels
78c3df47e0SNate LawsonCurrently available levels for the CPU frequency and power usage for each.
79c3df47e0SNate LawsonValues are in units of MHz and milliwatts.
80c3df47e0SNate Lawson.El
81c3df47e0SNate Lawson.Sh SUPPORTED DRIVERS
82c3df47e0SNate LawsonThe following device drivers offer absolute frequency control via the
83c3df47e0SNate Lawson.Nm
84c3df47e0SNate Lawsoninterface.
85c3df47e0SNate LawsonUsually, only one of these can be active at a time.
86c3df47e0SNate Lawson.Pp
87c3df47e0SNate Lawson.Bl -tag -compact -width ".Xr acpi_perf 4"
88c3df47e0SNate Lawson.It Xr acpi_perf 4
89c3df47e0SNate LawsonACPI CPU performance states
90c3df47e0SNate Lawson.It Xr ichss 4
91c3df47e0SNate LawsonIntel SpeedStep for ICH
92c3df47e0SNate Lawson.El
93c3df47e0SNate Lawson.Pp
94c3df47e0SNate LawsonThe following device drivers offer relative frequency control and
95c3df47e0SNate Lawsonhave an additive effect:
96c3df47e0SNate Lawson.Pp
974aff7744SRuslan Ermilov.Bl -tag -compact -width ".Xr acpi_throttle 4"
98c3df47e0SNate Lawson.It Xr acpi_throttle 4
99c3df47e0SNate LawsonACPI CPU throttling
100c3df47e0SNate Lawson.El
101c3df47e0SNate Lawson.Sh KERNEL INTERFACE
102c3df47e0SNate LawsonKernel components can query and set CPU frequencies through the
103c3df47e0SNate Lawson.Nm
104c3df47e0SNate Lawsonkernel interface.
105c3df47e0SNate LawsonThis involves obtaining a
106c3df47e0SNate Lawson.Nm
107c3df47e0SNate Lawsondevice, calling
108c3df47e0SNate Lawson.Fn cpufreq_levels
109c3df47e0SNate Lawsonto get the currently available frequency levels,
110c3df47e0SNate Lawsonchecking the current level with
111c3df47e0SNate Lawson.Fn cpufreq_get ,
112c3df47e0SNate Lawsonand setting a new one from the list with
113c3df47e0SNate Lawson.Fn cpufreq_set .
114c3df47e0SNate LawsonEach level may actually reference more than one
115c3df47e0SNate Lawson.Nm
116c3df47e0SNate Lawsondriver but kernel components do not need to be aware of this.
117c3df47e0SNate LawsonThe
1184aff7744SRuslan Ermilov.Va total_set
119c3df47e0SNate Lawsonelement of
1204aff7744SRuslan Ermilov.Vt "struct cf_level"
121c3df47e0SNate Lawsonprovides a summary of the frequency and power for this level.
122c3df47e0SNate LawsonUnknown or irrelevant values are set to
1234aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN .
124c3df47e0SNate Lawson.Pp
125c3df47e0SNate LawsonThe
126c3df47e0SNate Lawson.Fn cpufreq_levels
127c3df47e0SNate Lawsonmethod takes a
128c3df47e0SNate Lawson.Nm
129c3df47e0SNate Lawsondevice and an empty array of
1304aff7744SRuslan Ermilov.Fa levels .
131c3df47e0SNate LawsonThe
1324aff7744SRuslan Ermilov.Fa count
133c3df47e0SNate Lawsonvalue should be set to the number of levels available and after the
134c3df47e0SNate Lawsonfunction completes, will be set to the actual number of levels returned.
135c3df47e0SNate LawsonIf there are more levels than
1364aff7744SRuslan Ermilov.Fa count
1374aff7744SRuslan Ermilovwill allow, it should return
1384aff7744SRuslan Ermilov.Er E2BIG .
139c3df47e0SNate Lawson.Pp
140c3df47e0SNate LawsonThe
141c3df47e0SNate Lawson.Fn cpufreq_get
142c3df47e0SNate Lawsonmethod takes a pointer to space to store a
1434aff7744SRuslan Ermilov.Fa level .
144c3df47e0SNate LawsonAfter successful completion, the output will be the current active level
145c3df47e0SNate Lawsonand is equal to one of the levels returned by
146c3df47e0SNate Lawson.Fn cpufreq_levels .
147c3df47e0SNate Lawson.Pp
148c3df47e0SNate LawsonThe
149c3df47e0SNate Lawson.Fn cpufreq_set
150c3df47e0SNate Lawsonmethod takes a pointer a
1514aff7744SRuslan Ermilov.Fa level
152c3df47e0SNate Lawsonand attempts to activate it.
153c3df47e0SNate LawsonThe
1544aff7744SRuslan Ermilov.Fa priority
1554aff7744SRuslan Ermilov(i.e.,
1564aff7744SRuslan Ermilov.Dv CPUFREQ_PRIO_KERN )
157c3df47e0SNate Lawsontells
158c3df47e0SNate Lawson.Nm
159c3df47e0SNate Lawsonwhether to override previous settings while activating this level.
160c3df47e0SNate LawsonIf
1614aff7744SRuslan Ermilov.Fa priority
162c3df47e0SNate Lawsonis higher than the current active level, that level will be saved and
163c3df47e0SNate Lawsonoverridden with the new level.
164952a0376SNate LawsonIf a level is already saved, the new level is set without overwriting
165952a0376SNate Lawsonthe older saved level.
166c3df47e0SNate LawsonIf
167c3df47e0SNate Lawson.Fn cpufreq_set
1684aff7744SRuslan Ermilovis called with a
1694aff7744SRuslan Ermilov.Dv NULL
1704aff7744SRuslan Ermilov.Fa level ,
171952a0376SNate Lawsonthe saved level will be restored.
172952a0376SNate LawsonIf there is no saved level,
173952a0376SNate Lawson.Fn cpufreq_set
174952a0376SNate Lawsonwill return
175952a0376SNate Lawson.Er ENXIO .
176c3df47e0SNate LawsonIf
1774aff7744SRuslan Ermilov.Fa priority
178c3df47e0SNate Lawsonis lower than the current active level's priority, this method returns
1794aff7744SRuslan Ermilov.Er EPERM .
180c3df47e0SNate Lawson.Sh DRIVER INTERFACE
181c3df47e0SNate LawsonKernel drivers offering hardware-specific CPU frequency control export
182c3df47e0SNate Lawsontheir individual settings through the
183c3df47e0SNate Lawson.Nm
184c3df47e0SNate Lawsondriver interface.
185c3df47e0SNate LawsonThis involves implementing three methods:
186c3df47e0SNate Lawson.Fn cpufreq_drv_settings ,
187c3df47e0SNate Lawson.Fn cpufreq_drv_set ,
188c3df47e0SNate Lawsonand
189c3df47e0SNate Lawson.Fn cpufreq_drv_get .
190c3df47e0SNate LawsonAdditionally, the driver must attach a device as a child of a CPU
191c3df47e0SNate Lawsondevice so that these methods can be called by the
192c3df47e0SNate Lawson.Nm
193c3df47e0SNate Lawsonframework.
194c3df47e0SNate Lawson.Pp
195c3df47e0SNate LawsonThe
196c3df47e0SNate Lawson.Fn cpufreq_drv_settings
197c3df47e0SNate Lawsonmethod returns an array of currently available settings, each of type
1984aff7744SRuslan Ermilov.Vt "struct cf_setting" .
199c3df47e0SNate LawsonThe driver should set unknown or irrelevant values to
2004aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN .
201c3df47e0SNate LawsonAll the following elements for each setting should be returned:
202c3df47e0SNate Lawson.Bd -literal
203c3df47e0SNate Lawsonstruct cf_setting {
204c3df47e0SNate Lawson	int	freq;	/* CPU clock in Mhz or 100ths of a percent. */
205c3df47e0SNate Lawson	int	volts;	/* Voltage in mV. */
206c3df47e0SNate Lawson	int	power;	/* Power consumed in mW. */
207c3df47e0SNate Lawson	int	lat;	/* Transition latency in us. */
208c3df47e0SNate Lawson	device_t dev;	/* Driver providing this setting. */
209c3df47e0SNate Lawson};
210c3df47e0SNate Lawson.Ed
211c3df47e0SNate Lawson.Pp
212c3df47e0SNate LawsonOn entry to this method,
2134aff7744SRuslan Ermilov.Fa count
214c3df47e0SNate Lawsoncontains the number of settings that can be returned.
215c3df47e0SNate LawsonOn successful completion, the driver sets it to the actual number of
216c3df47e0SNate Lawsonsettings returned.
217c3df47e0SNate LawsonIf the driver offers more settings than
2184aff7744SRuslan Ermilov.Fa count
2194aff7744SRuslan Ermilovwill allow, it should return
2204aff7744SRuslan Ermilov.Er E2BIG .
221c3df47e0SNate LawsonThe driver sets
2224aff7744SRuslan Ermilov.Fa type
223c3df47e0SNate Lawsonto the type of settings it offers, either
2244aff7744SRuslan Ermilov.Dv CPUFREQ_TYPE_ABSOLUTE
225c3df47e0SNate Lawsonor
2264aff7744SRuslan Ermilov.Dv CPUFREQ_TYPE_RELATIVE .
227c3df47e0SNate Lawson.Pp
228c3df47e0SNate LawsonThe
229c3df47e0SNate Lawson.Fn cpufreq_drv_set
230c3df47e0SNate Lawsonmethod takes a driver setting and makes it active.
231c3df47e0SNate LawsonIf the setting is invalid or not currently available, it should return
2324aff7744SRuslan Ermilov.Er EINVAL .
233c3df47e0SNate Lawson.Pp
234c3df47e0SNate LawsonThe
235c3df47e0SNate Lawson.Fn cpufreq_drv_get
236c3df47e0SNate Lawsonmethod returns the currently-active driver setting.
237c3df47e0SNate LawsonThe
2384aff7744SRuslan Ermilov.Vt "struct cf_setting"
239c3df47e0SNate Lawsonreturned must be valid for passing to
240c3df47e0SNate Lawson.Fn cpufreq_drv_set ,
241c3df47e0SNate Lawsonincluding all elements being filled out correctly.
242c3df47e0SNate LawsonIf the driver cannot infer the current setting
243c3df47e0SNate Lawson(even by estimating it with
244c3df47e0SNate Lawson.Fn cpu_est_clockrate )
245c3df47e0SNate Lawsonthen it should set all elements to
2464aff7744SRuslan Ermilov.Dv CPUFREQ_VAL_UNKNOWN .
2474aff7744SRuslan Ermilov.Sh SEE ALSO
2484aff7744SRuslan Ermilov.Xr acpi 4 ,
2494aff7744SRuslan Ermilov.Xr sysctl 8
2504aff7744SRuslan Ermilov.Sh AUTHORS
2514aff7744SRuslan Ermilov.An Nate Lawson
252c3df47e0SNate Lawson.Sh BUGS
253c3df47e0SNate LawsonThe following drivers have not yet been converted to the
254c3df47e0SNate Lawson.Nm
255c3df47e0SNate Lawsoninterface:
256c3df47e0SNate Lawson.Xr longrun 4 ,
257c3df47e0SNate Lawson.Xr p4tcc 4 .
258c3df47e0SNate Lawson.Pp
259952a0376SNate LawsonNotification of CPU and bus frequency changes is not implemented yet.
260c3df47e0SNate Lawson.Pp
261c3df47e0SNate LawsonWhen multiple CPUs offer frequency control, they cannot be set to different
262c3df47e0SNate Lawsonlevels and must all offer the same frequency settings.
263