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
     power_profile(8) 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 and power	usage
	     for each.	Values are in units of MHz and milliwatts.

     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(4)  ACPI	CPU performance	states
     est(4)	   Intel Enhanced SpeedStep
     ichss(4)	   Intel SpeedStep for ICH

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

     acpi_throttle(4)  ACPI CPU	throttling

     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

     The following drivers have	not yet	been converted to the cpufreq inter-
     face: longrun(4), p4tcc(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			       February	20, 2005			   BSD


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

home | help