Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
CPUFREQ(4)		 BSD Kernel Interfaces Manual		    CPUFREQ(4)

     cpufreq --	CPU frequency control framework

     device cpufreq

     #include <sys/cpu.h>

     cpufreq_levels(device_t dev, struct cf_level *levels, int *count);

     cpufreq_set(device_t dev, const struct cf_level *level, int priority);

     cpufreq_get(device_t dev, struct cf_level *level);

     cpufreq_drv_settings(device_t dev,	struct cf_setting *sets, int *count);

     cpufreq_drv_type(device_t dev, int	*type);

     cpufreq_drv_set(device_t dev, const struct	cf_setting *set);

     cpufreq_drv_get(device_t dev, struct cf_setting *set);

     The cpufreq driver	provides a unified kernel and user interface to	CPU
     frequency control drivers.	 It combines multiple drivers offering differ-
     ent settings into a single	interface of all possible levels.  Users can
     access this interface directly via	sysctl(8) or by	indicating to
     /etc/rc.d/power_profile that it should switch settings when the AC	line
     state changes via rc.conf(5).

     These settings may	be overridden by kernel	drivers	requesting alternate
     settings.	If this	occurs,	the original values will be restored once the
     condition has passed (e.g., the system has	cooled sufficiently).  If a
     sysctl cannot be set due to an override condition,	it will	return EPERM.

	     Current active CPU	frequency in MHz.

	     Currently available levels	for the	CPU (frequency/power usage).
	     Values are	in units of MHz	and milliwatts.

	     Currently available settings for the driver (frequency/power us-
	     age).  Values are in units	of MHz and milliwatts.	This is	help-
	     ful for understanding which settings are offered by which driver
	     for debugging purposes.

	     Lowest CPU	frequency in MHz to offer to users.  This setting is
	     also accessible via a tunable with	the same name.	This can be
	     used to disable very low levels that may be unusable on some sys-

	     Print verbose messages.  This setting is also accessible via a
	     tunable with the same name.

     The following device drivers offer	absolute frequency control via the
     cpufreq interface.	 Usually, only one of these can	be active at a time.

     acpi_perf	ACPI CPU performance states
     est	Intel Enhanced SpeedStep
     ichss	Intel SpeedStep	for ICH
     powernow	AMD PowerNow! for K7 and K8
     smist	Intel SMI-based	SpeedStep for PIIX4

     The following device drivers offer	relative frequency control and have an
     additive effect:

     acpi_throttle  ACPI CPU throttling
     p4tcc	    Pentium 4 Thermal Control Circuitry

     Kernel components can query and set CPU frequencies through the cpufreq
     kernel interface.	This involves obtaining	a cpufreq device, calling
     cpufreq_levels() to get the currently available frequency levels, check-
     ing the current level with	cpufreq_get(), and setting a new one from the
     list with cpufreq_set().  Each level may actually reference more than one
     cpufreq driver but	kernel components do not need to be aware of this.
     The total_set element of struct cf_level provides a summary of the	fre-
     quency and	power for this level.  Unknown or irrelevant values are	set to

     The cpufreq_levels() method takes a cpufreq device	and an empty array of
     levels.  The count	value should be	set to the number of levels available
     and after the function completes, will be set to the actual number	of
     levels returned.  If there	are more levels	than count will	allow, it
     should return E2BIG.

     The cpufreq_get() method takes a pointer to space to store	a level.  Af-
     ter successful completion,	the output will	be the current active level
     and is equal to one of the	levels returned	by cpufreq_levels().

     The cpufreq_set() method takes a pointer a	level and attempts to activate
     it.  The priority (i.e., CPUFREQ_PRIO_KERN) tells cpufreq whether to
     override previous settings	while activating this level.  If priority is
     higher than the current active level, that	level will be saved and	over-
     ridden with the new level.	 If a level is already saved, the new level is
     set without overwriting the older saved level.  If	cpufreq_set() is
     called with a NULL	level, the saved level will be restored.  If there is
     no	saved level, cpufreq_set() will	return ENXIO.  If priority is lower
     than the current active level's priority, this method returns EPERM.

     Kernel drivers offering hardware-specific CPU frequency control export
     their individual settings through the cpufreq driver interface.  This in-
     volves implementing these methods:	cpufreq_drv_settings(),
     cpufreq_drv_type(), cpufreq_drv_set(), and	cpufreq_drv_get().  Addition-
     ally, the driver must attach a device as a	child of a CPU device so that
     these methods can be called by the	cpufreq	framework.

     The cpufreq_drv_settings()	method returns an array	of currently available
     settings, each of type struct cf_setting.	The driver should set unknown
     or	irrelevant values to CPUFREQ_VAL_UNKNOWN.  All the following elements
     for each setting should be	returned:

     struct cf_setting {
	     int     freq;   /*	CPU clock in Mhz or 100ths of a	percent. */
	     int     volts;  /*	Voltage	in mV. */
	     int     power;  /*	Power consumed in mW. */
	     int     lat;    /*	Transition latency in us. */
	     device_t dev;   /*	Driver providing this setting. */

     On	entry to this method, count contains the number	of settings that can
     be	returned.  On successful completion, the driver	sets it	to the actual
     number of settings	returned.  If the driver offers	more settings than
     count will	allow, it should return	E2BIG.

     The cpufreq_drv_type() method indicates the type of settings it offers,
     either CPUFREQ_TYPE_ABSOLUTE or CPUFREQ_TYPE_RELATIVE.  Additionally, the
     driver may	set the	CPUFREQ_FLAG_INFO_ONLY flag if the settings it pro-
     vides are information for other drivers only and cannot be	passed to
     cpufreq_drv_set() to activate them.

     The cpufreq_drv_set() method takes	a driver setting and makes it active.
     If	the setting is invalid or not currently	available, it should return

     The cpufreq_drv_get() method returns the currently-active driver setting.
     The struct	cf_setting returned must be valid for passing to
     cpufreq_drv_set(),	including all elements being filled out	correctly.  If
     the driver	cannot infer the current setting (even by estimating it	with
     cpu_est_clockrate()) then it should set all elements to

     acpi(4), sysctl(8)

     Nate Lawson
     Bruno Ducrot contributed the powernow driver.

     The following drivers have	not yet	been converted to the cpufreq inter-
     face: longrun(4).

     Notification of CPU and bus frequency changes is not implemented yet.

     When multiple CPUs	offer frequency	control, they cannot be	set to differ-
     ent levels	and must all offer the same frequency settings.

BSD				April 10, 2005				   BSD


Want to link to this manual page? Use this URL:

home | help