The following page contains information about the current state of PM, examples of how to use it and possible ways to determine if it may be used on your system.
It is currently only possible to read temperature and performance levels on several cards, as long as you have a recent enough kernel (nouveau git from October 2010 or 2.6.37), and a supported card.
Please note that this page is only a rough approximation of the current state of PM.
- "DONE" means... that it is thought to be fully implemented. May contain bugs.
- "MOSTLY" means that it is mostly implemented and may have known bugs.
- "WIP" means that someone has started on the initial implementation.
- "TODO" means that someone needs to write the code. The required knowledge to write the code may or may not be known. Please ask on #nouveau if you want to get your feet wet on this.
- "STALLED" means... that whatever code has been written is accumulating color and texture similar to that 3 week old slice of pizza in your fridge.
|VBIOS tables parsing|
|Mem clock/timing mapping||N/A||N/A||N/A||N/A||Done||MOSTLY||MOSTLY||TODO|
|Voltage adjusting||N/A||N/A||N/A||internal only||internal only||internal only||internal only||?|
|Thermal sensors||N/A||N/A||MOSTLY||MOSTLY||internal & i2c||internal & i2c||internal only & i2c||?|
Notes on VBIOS tables
Performance levels tables
They should contain the clocks (frequencies) the card should be set at, the specific voltage, and the fan speed. On more recent cards they also contain the index of the memory timings entry that should be used.
They vary between card generations, and sometimes within a specific generation as well. The latest version 4.0 found on nvAx and nvCx cards has widely changed, thus many of the information is unknown.
They contain a voltage label and the GPIO that should be set in order to achieve that voltage.
They do not differ so greatly, except the latest version v4.0 which has been totally reorganized and restructured.
A simple entry/data kind of table, storing various thermal settings, such as offset constant, slope divisor and others, helping with setting up the sensor or determining the appropriate critical temperatures for the card
The purpose of many entries in the Thermal table is still unknown (although the most important ones have been covered). If you have some skills and would like to do some hacking, please contact us.
Memory timings table
When the card has multiple performance levels, it is sometimes necessary to change the memory timings so that the memory can operate efficiently and correctly. On many cards (mainly desktop) the table can be empty although the early signs of such a table have been found in a nv30 vbios (mobile). On Geforce FX cards (and possibly earlier) this timing info is not in a separate table, but rather available in the Performance level table.
There is quite a bit of magic involved so if you want to help, please join us.
Notes on Power Management
Currently only static clock setting is being tested by developers. The goal in the future will be to dynamically change the clocks when more/less resources of the card are being used.
There are quite a few PLLs that should be changed and considered, although the exact purpose of some is still unknown.
This is usually the biggest source of graphical corruption and/or card lockups. It's mainly related to the lack of proper mem timings support.
The voltage can be read/written using the GPIO "engine", although a control via onboard i2c chip should be implemented.
Currently the internal and i2c sensors should be working properly. Some older cards lack a temperature sensor.
If Nouveau detects an i2c chip controlling the fan, you can control the fan from user space, but Nouveau itself cannot control it automatically yet. It is also possible to have an i2c chip that is not detected, hence no fan control by software. In the third case, fans are controlled via PWM registers. The PWM registers are being reverse-engineered.
In many cases, at least with i2c chips, the fan speed is temperature controlled by hardware, that is, it is in "auto" mode. In some cases, the fan is at full speed by default, being very loud.
There is some developer documentation (at the end), although adding proper fanspeed control in nouveau-pm would be great.
How to see if PM may work on my system
Please test following these instructions.
You can also just try to run the sensors tool. Example output on nv84 : [[!format txt """ nouveau-pci-0100 Adapter: PCI adapter temp1: +67.0°C (high = +100.0°C, crit = +110.0°C) """]]
Available Performance Levels
Nouveau prints them in the kernel log during loading. [[!format txt """ dmesg | grep -A4 "available performance level" """]] Example output on nv84 : [[!format txt """ [ 4.586621] [drm] nouveau 0000:01:00.0: 3 available performance level(s) [ 4.586627] [drm] nouveau 0000:01:00.0: 0: memory 100MHz core 169MHz shader 338MHz voltage 1150mV fanspeed 100% [ 4.586631] [drm] nouveau 0000:01:00.0: 1: memory 301MHz core 275MHz shader 550MHz voltage 1150mV fanspeed 100% [ 4.586635] [drm] nouveau 0000:01:00.0: 2: memory 702MHz core 475MHz shader 950MHz voltage 1200mV fanspeed 100% [ 4.586659] [drm] nouveau 0000:01:00.0: c: memory 302MHz core 275MHz shader 550MHz voltage 1150mV """]] They are also available in /sys/class/drm/card0/device/performance_level* files
Some cards do not have shader clock, voltage, or fanspeed settings in their performance levels.