Main index | Section 4 | Options |
#include <sys/cpu.h>
The frequency cannot be changed if TSC is in use as the timecounter. This is because the timecounter system needs to use a source that has a constant rate. The timecounter source can be changed with the kern.timecounter.hardware sysctl. Available modes are in kern.timecounter.choice sysctl entry.
dev.cpu.%d.freq | |
Current active CPU frequency in MHz. | |
dev.cpu.%d.freq_levels | |
Currently available levels for the CPU (frequency/power usage). Values are in units of MHz and milliwatts. | |
dev.DEVICE.%d.freq_settings | |
Currently available settings for the driver (frequency/power usage). Values are in units of MHz and milliwatts. This is helpful for understanding which settings are offered by which driver for debugging purposes. | |
debug.cpufreq.lowest | |
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 systems. | |
debug.cpufreq.verbose | |
Print verbose messages. This setting is also accessible via a tunable with the same name. | |
acpi_perf | ACPI CPU performance states |
est | Intel Enhanced SpeedStep |
ichss | Intel SpeedStep for ICH |
powernow | AMD PowerNow!amp; and Cool'n'Quiet 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 |
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. After 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 overridden 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.
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 provides 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 EINVAL.
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 CPUFREQ_VAL_UNKNOWN.
Notification of CPU and bus frequency changes is not implemented yet.
When multiple CPUs offer frequency control, they cannot be set to different levels and must all offer the same frequency settings.
CPUFREQ (4) | March 3, 2006 |
Main index | Section 4 | Options |
Please direct any comments about this manual page service to Ben Bullock. Privacy policy.