Naming and data format standards for sysfs files
================================================

The libsensors library offers an interface to the raw sensors data
through the sysfs interface. Since lm-sensors 3.0.0, libsensors is
completely chip-independent. It assumes that all the kernel drivers
implement the standard sysfs interface described in this document.
This makes adding or updating support for any given chip very easy, as
libsensors, and applications using it, do not need to be modified.
This is a major improvement compared to lm-sensors 2.

Note that motherboards vary widely in the connections to sensor chips.
There is no standard that ensures, for example, that the second
temperature sensor is connected to the CPU, or that the second fan is on
the CPU. Also, some values reported by the chips need some computation
before they make full sense. For example, most chips can only measure
voltages between 0 and +4V. Other voltages are scaled back into that
range using external resistors. Since the values of these resistors
can change from motherboard to motherboard, the conversions cannot be
hard coded into the driver and have to be done in user space.

For this reason, even if we aim at a chip-independent libsensors, it will
still require a configuration file (e.g. /etc/sensors.conf) for proper
values conversion, labeling of inputs and hiding of unused inputs.

An alternative method that some programs use is to access the sysfs
files directly. This document briefly describes the standards that the
drivers follow, so that an application program can scan for entries and
access this data in a simple and consistent way. That said, such programs
will have to implement conversion, labeling and hiding of inputs. For
this reason, it is still not recommended to bypass the library.

Each chip gets its own directory in the sysfs /sys/devices tree.  To
find all sensor chips, it is easier to follow the device symlinks from
`/sys/class/hwmon/hwmon*`.

Up to lm-sensors 3.0.0, libsensors looks for hardware monitoring attributes
in the "physical" device directory. Since lm-sensors 3.0.1, attributes found
in the hwmon "class" device directory are also supported. Complex drivers
(e.g. drivers for multifunction chips) may want to use this possibility to
avoid namespace pollution. The only drawback will be that older versions of
libsensors won't support the driver in question.

All sysfs values are fixed point numbers.

There is only one value per file, unlike the older /proc specification.
The common scheme for files naming is: <type><number>_<item>. Usual
types for sensor chips are "in" (voltage), "temp" (temperature) and
"fan" (fan). Usual items are "input" (measured value), "max" (high
threshold, "min" (low threshold). Numbering usually starts from 1,
except for voltages which start from 0 (because most data sheets use
this). A number is always used for elements that can be present more
than once, even if there is a single element of the given type on the
specific chip. Other files do not refer to a specific element, so
they have a simple name, and no number.

Alarms are direct indications read from the chips. The drivers do NOT
make comparisons of readings to thresholds. This allows violations
between readings to be caught and alarmed. The exact definition of an
alarm (for example, whether a threshold must be met or must be exceeded
to cause an alarm) is chip-dependent.

When setting values of hwmon sysfs attributes, the string representation of
the desired value must be written, note that strings which are not a number
are interpreted as 0! For more on how written strings are interpreted see the
"sysfs attribute writes interpretation" section at the end of this file.

Attribute access
----------------

Hardware monitoring sysfs attributes are displayed by unrestricted userspace
applications. For this reason, all standard ABI attributes shall be world
readable. Writeable standard ABI attributes shall be writeable only for
privileged users.

-------------------------------------------------------------------------

======= ===========================================
`[0-*]`	denotes any positive number starting from 0
`[1-*]`	denotes any positive number starting from 1
RO	read only value
WO	write only value
RW	read/write value
======= ===========================================

Read/write values may be read-only for some chips, depending on the
hardware implementation.

All entries (except name) are optional, and should only be created in a
given driver if the chip has the feature.

See Documentation/ABI/testing/sysfs-class-hwmon for a complete description
of the attributes.

*****************
Global attributes
*****************

`name`
		The chip name.

`update_interval`
		The interval at which the chip will update readings.


********
Voltages
********

`in[0-*]_min`
		Voltage min value.

`in[0-*]_lcrit`
		Voltage critical min value.

`in[0-*]_max`
		Voltage max value.

`in[0-*]_crit`
		Voltage critical max value.

`in[0-*]_input`
		Voltage input value.

`in[0-*]_average`
		Average voltage

`in[0-*]_lowest`
		Historical minimum voltage

`in[0-*]_highest`
		Historical maximum voltage

`in[0-*]_reset_history`
		Reset inX_lowest and inX_highest

`in_reset_history`
		Reset inX_lowest and inX_highest for all sensors

`in[0-*]_label`
		Suggested voltage channel label.

`in[0-*]_enable`
		Enable or disable the sensors.

`cpu[0-*]_vid`
		CPU core reference voltage.

`vrm`
		Voltage Regulator Module version number.

`in[0-*]_rated_min`
		Minimum rated voltage.

`in[0-*]_rated_max`
		Maximum rated voltage.

Also see the Alarms section for status flags associated with voltages.


****
Fans
****

`fan[1-*]_min`
		Fan minimum value

`fan[1-*]_max`
		Fan maximum value

`fan[1-*]_input`
		Fan input value.

`fan[1-*]_div`
		Fan divisor.

`fan[1-*]_pulses`
		Number of tachometer pulses per fan revolution.

`fan[1-*]_target`
		Desired fan speed

`fan[1-*]_label`
		Suggested fan channel label.

`fan[1-*]_enable`
		Enable or disable the sensors.

Also see the Alarms section for status flags associated with fans.


***
PWM
***

`pwm[1-*]`
		Pulse width modulation fan control.

`pwm[1-*]_enable`
		Fan speed control method:

`pwm[1-*]_mode`
		direct current or pulse-width modulation.

`pwm[1-*]_freq`
		Base PWM frequency in Hz.

`pwm[1-*]_auto_channels_temp`
		Select which temperature channels affect this PWM output in
		auto mode.

`pwm[1-*]_auto_point[1-*]_pwm` / `pwm[1-*]_auto_point[1-*]_temp` / `pwm[1-*]_auto_point[1-*]_temp_hyst`
		Define the PWM vs temperature curve.

`temp[1-*]_auto_point[1-*]_pwm` / `temp[1-*]_auto_point[1-*]_temp` / `temp[1-*]_auto_point[1-*]_temp_hyst`
		Define the PWM vs temperature curve.

There is a third case where trip points are associated to both PWM output
channels and temperature channels: the PWM values are associated to PWM
output channels while the temperature values are associated to temperature
channels. In that case, the result is determined by the mapping between
temperature inputs and PWM outputs. When several temperature inputs are
mapped to a given PWM output, this leads to several candidate PWM values.
The actual result is up to the chip, but in general the highest candidate
value (fastest fan speed) wins.


************
Temperatures
************

`temp[1-*]_type`
		Sensor type selection.

`temp[1-*]_max`
		Temperature max value.

`temp[1-*]_min`
		Temperature min value.

`temp[1-*]_max_hyst`
		Temperature hysteresis value for max limit.

`temp[1-*]_min_hyst`
		Temperature hysteresis value for min limit.

`temp[1-*]_input`
		Temperature input value.

`temp[1-*]_crit`
		Temperature critical max value, typically greater than
		corresponding temp_max values.

`temp[1-*]_crit_hyst`
		Temperature hysteresis value for critical limit.

`temp[1-*]_emergency`
		Temperature emergency max value, for chips supporting more than
		two upper temperature limits.

`temp[1-*]_emergency_hyst`
		Temperature hysteresis value for emergency limit.

`temp[1-*]_lcrit`
		Temperature critical min value, typically lower than
		corresponding temp_min values.

`temp[1-*]_lcrit_hyst`
		Temperature hysteresis value for critical min limit.

`temp[1-*]_offset`
		Temperature offset which is added to the temperature reading
		by the chip.

`temp[1-*]_label`
		Suggested temperature channel label.

`temp[1-*]_lowest`
		Historical minimum temperature

`temp[1-*]_highest`
		Historical maximum temperature

`temp[1-*]_reset_history`
		Reset temp_lowest and temp_highest

`temp_reset_history`
		Reset temp_lowest and temp_highest for all sensors

`temp[1-*]_enable`
		Enable or disable the sensors.

`temp[1-*]_rated_min`
		Minimum rated temperature.

`temp[1-*]_rated_max`
		Maximum rated temperature.

Some chips measure temperature using external thermistors and an ADC, and
report the temperature measurement as a voltage. Converting this voltage
back to a temperature (or the other way around for limits) requires
mathematical functions not available in the kernel, so the conversion
must occur in user space. For these chips, all temp* files described
above should contain values expressed in millivolt instead of millidegree
Celsius. In other words, such temperature channels are handled as voltage
channels by the driver.

Also see the Alarms section for status flags associated with temperatures.


********
Currents
********

`curr[1-*]_max`
		Current max value.

`curr[1-*]_min`
		Current min value.

`curr[1-*]_lcrit`
		Current critical low value

`curr[1-*]_crit`
		Current critical high value.

`curr[1-*]_input`
		Current input value.

`curr[1-*]_average`
		Average current use.

`curr[1-*]_lowest`
		Historical minimum current.

`curr[1-*]_highest`
		Historical maximum current.

`curr[1-*]_reset_history`
		Reset currX_lowest and currX_highest

		WO

`curr_reset_history`
		Reset currX_lowest and currX_highest for all sensors.

`curr[1-*]_enable`
		Enable or disable the sensors.

`curr[1-*]_rated_min`
		Minimum rated current.

`curr[1-*]_rated_max`
		Maximum rated current.

Also see the Alarms section for status flags associated with currents.

*****
Power
*****

`power[1-*]_average`
		Average power use.

`power[1-*]_average_interval`
		Power use averaging interval.

`power[1-*]_average_interval_max`
		Maximum power use averaging interval.

`power[1-*]_average_interval_min`
		Minimum power use averaging interval.

`power[1-*]_average_highest`
		Historical average maximum power use

`power[1-*]_average_lowest`
		Historical average minimum power use

`power[1-*]_average_max`
		A poll notification is sent to `power[1-*]_average` when
		power use rises above this value.

`power[1-*]_average_min`
		A poll notification is sent to `power[1-*]_average` when
		power use sinks below this value.

`power[1-*]_input`
		Instantaneous power use.

`power[1-*]_input_highest`
		Historical maximum power use

`power[1-*]_input_lowest`
		Historical minimum power use.

`power[1-*]_reset_history`
		Reset input_highest, input_lowest, average_highest and
		average_lowest.

`power[1-*]_accuracy`
		Accuracy of the power meter.

`power[1-*]_cap`
		If power use rises above this limit, the
		system should take action to reduce power use.

`power[1-*]_cap_hyst`
		Margin of hysteresis built around capping and notification.

`power[1-*]_cap_max`
		Maximum cap that can be set.

`power[1-*]_cap_min`
		Minimum cap that can be set.

`power[1-*]_max`
		Maximum power.

`power[1-*]_crit`
				Critical maximum power.

				If power rises to or above this limit, the
				system is expected take drastic action to reduce
				power consumption, such as a system shutdown or
				a forced powerdown of some devices.

				Unit: microWatt

				RW

`power[1-*]_enable`
				Enable or disable the sensors.

				When disabled the sensor read will return
				-ENODATA.

				- 1: Enable
				- 0: Disable

				RW

`power[1-*]_rated_min`
				Minimum rated power.

				Unit: microWatt

				RO

`power[1-*]_rated_max`
				Maximum rated power.

				Unit: microWatt

				RO

Also see the Alarms section for status flags associated with power readings.

******
Energy
******

`energy[1-*]_input`
				Cumulative energy use

				Unit: microJoule

				RO

`energy[1-*]_enable`
				Enable or disable the sensors.

				When disabled the sensor read will return
				-ENODATA.

				- 1: Enable
				- 0: Disable

				RW

********
Humidity
********

`humidity[1-*]_input`
		Humidity.

`humidity[1-*]_enable`
		Enable or disable the sensors.

`humidity[1-*]_rated_min`
		Minimum rated humidity.

`humidity[1-*]_rated_max`
		Maximum rated humidity.

******
Alarms
******

Each channel or limit may have an associated alarm file, containing a
boolean value. 1 means than an alarm condition exists, 0 means no alarm.

Usually a given chip will either use channel-related alarms, or
limit-related alarms, not both. The driver should just reflect the hardware
implementation.

+-------------------------------+-----------------------+
| **`in[0-*]_alarm`,		| Channel alarm		|
| `curr[1-*]_alarm`,		|			|
| `power[1-*]_alarm`,		|   - 0: no alarm	|
| `fan[1-*]_alarm`,		|   - 1: alarm		|
| `temp[1-*]_alarm`**		|			|
|				|   RO			|
+-------------------------------+-----------------------+

**OR**

+-------------------------------+-----------------------+
| **`in[0-*]_min_alarm`,	| Limit alarm		|
| `in[0-*]_max_alarm`,		|			|
| `in[0-*]_lcrit_alarm`,	|   - 0: no alarm	|
| `in[0-*]_crit_alarm`,		|   - 1: alarm		|
| `curr[1-*]_min_alarm`,	|			|
| `curr[1-*]_max_alarm`,	| RO			|
| `curr[1-*]_lcrit_alarm`,	|			|
| `curr[1-*]_crit_alarm`,	|			|
| `power[1-*]_cap_alarm`,	|			|
| `power[1-*]_max_alarm`,	|			|
| `power[1-*]_crit_alarm`,	|			|
| `fan[1-*]_min_alarm`,		|			|
| `fan[1-*]_max_alarm`,		|			|
| `temp[1-*]_min_alarm`,	|			|
| `temp[1-*]_max_alarm`,	|			|
| `temp[1-*]_lcrit_alarm`,	|			|
| `temp[1-*]_crit_alarm`,	|			|
| `temp[1-*]_emergency_alarm`**	|			|
+-------------------------------+-----------------------+

Each input channel may have an associated fault file. This can be used
to notify open diodes, unconnected fans etc. where the hardware
supports it. When this boolean has value 1, the measurement for that
channel should not be trusted.

`fan[1-*]_fault` / `temp[1-*]_fault`
		Input fault condition.

Some chips also offer the possibility to get beeped when an alarm occurs:

`beep_enable`
		Master beep enable.

`in[0-*]_beep`, `curr[1-*]_beep`, `fan[1-*]_beep`, `temp[1-*]_beep`,
		Channel beep.

In theory, a chip could provide per-limit beep masking, but no such chip
was seen so far.

Old drivers provided a different, non-standard interface to alarms and
beeps. These interface files are deprecated, but will be kept around
for compatibility reasons:

`alarms`
		Alarm bitmask.

`beep_mask`
		Bitmask for beep.


*******************
Intrusion detection
*******************

`intrusion[0-*]_alarm`
		Chassis intrusion detection.

`intrusion[0-*]_beep`
		Chassis intrusion beep.

****************************
Average sample configuration
****************************

Devices allowing for reading {in,power,curr,temp}_average values may export
attributes for controlling number of samples used to compute average.

+--------------+---------------------------------------------------------------+
| samples      | Sets number of average samples for all types of measurements. |
|	       |							       |
|	       | RW							       |
+--------------+---------------------------------------------------------------+
| in_samples   | Sets number of average samples for specific type of	       |
| power_samples| measurements.						       |
| curr_samples |							       |
| temp_samples | Note that on some devices it won't be possible to set all of  |
|	       | them to different values so changing one might also change    |
|	       | some others.						       |
|	       |							       |
|	       | RW							       |
+--------------+---------------------------------------------------------------+

sysfs attribute writes interpretation
-------------------------------------

hwmon sysfs attributes always contain numbers, so the first thing to do is to
convert the input to a number, there are 2 ways todo this depending whether
the number can be negative or not::

	unsigned long u = simple_strtoul(buf, NULL, 10);
	long s = simple_strtol(buf, NULL, 10);

With buf being the buffer with the user input being passed by the kernel.
Notice that we do not use the second argument of strto[u]l, and thus cannot
tell when 0 is returned, if this was really 0 or is caused by invalid input.
This is done deliberately as checking this everywhere would add a lot of
code to the kernel.

Notice that it is important to always store the converted value in an
unsigned long or long, so that no wrap around can happen before any further
checking.

After the input string is converted to an (unsigned) long, the value should be
checked if its acceptable. Be careful with further conversions on the value
before checking it for validity, as these conversions could still cause a wrap
around before the check. For example do not multiply the result, and only
add/subtract if it has been divided before the add/subtract.

What to do if a value is found to be invalid, depends on the type of the
sysfs attribute that is being set. If it is a continuous setting like a
tempX_max or inX_max attribute, then the value should be clamped to its
limits using clamp_val(value, min_limit, max_limit). If it is not continuous
like for example a tempX_type, then when an invalid value is written,
-EINVAL should be returned.

Example1, temp1_max, register is a signed 8 bit value (-128 - 127 degrees)::

	long v = simple_strtol(buf, NULL, 10) / 1000;
	v = clamp_val(v, -128, 127);
	/* write v to register */

Example2, fan divider setting, valid values 2, 4 and 8::

	unsigned long v = simple_strtoul(buf, NULL, 10);

	switch (v) {
	case 2: v = 1; break;
	case 4: v = 2; break;
	case 8: v = 3; break;
	default:
		return -EINVAL;
	}
	/* write v to register */
