Kernel driver occ-hwmon
=======================

Supported chips:
  * POWER8
  * POWER9

Author: Eddie James <eajames@linux.ibm.com>

Description
-----------

This driver supports hardware monitoring for the On-Chip Controller (OCC)
embedded on POWER processors. The OCC is a device that collects and aggregates
sensor data from the processor and the system. The OCC can provide the raw
sensor data as well as perform thermal and power management on the system.

The P8 version of this driver is a client driver of I2C. It may be probed
manually if an "ibm,p8-occ-hwmon" compatible device is found under the
appropriate I2C bus node in the device-tree.

The P9 version of this driver is a client driver of the FSI-based OCC driver.
It will be probed automatically by the FSI-based OCC driver.

Sysfs entries
-------------

The following attributes are supported. All attributes are read-only unless
specified.

The OCC sensor ID is an integer that represents the unique identifier of the
sensor with respect to the OCC. For example, a temperature sensor for the third
DIMM slot in the system may have a sensor ID of 7. This mapping is unavailable
to the device driver, which must therefore export the sensor ID as-is.

Some entries are only present with certain OCC sensor versions or only on
certain OCCs in the system. The version number is not exported to the user
but can be inferred.

temp[1-n]_label		OCC sensor ID.
[with temperature sensor version 1]
    temp[1-n]_input	Measured temperature of the component in millidegrees
			Celsius.
[with temperature sensor version >= 2]
    temp[1-n]_type		The FRU (Field Replaceable Unit) type
				(represented by an integer) for the component
				that this sensor measures.
    temp[1-n]_fault		Temperature sensor fault boolean; 1 to indicate
				that a fault is present or 0 to indicate that
				no fault is present.
    [with type == 3 (FRU type is VRM)]
        temp[1-n]_alarm		VRM temperature alarm boolean; 1 to indicate
				alarm, 0 to indicate no alarm
    [else]
        temp[1-n]_input		Measured temperature of the component in
				millidegrees Celsius.

freq[1-n]_label		OCC sensor ID.
freq[1-n]_input		Measured frequency of the component in MHz.

power[1-n]_input	Latest measured power reading of the component in
			microwatts.
power[1-n]_average	Average power of the component in microwatts.
power[1-n]_average_interval	The amount of time over which the power average
				was taken in microseconds.
[with power sensor version < 2]
    power[1-n]_label	OCC sensor ID.
[with power sensor version >= 2]
    power[1-n]_label	OCC sensor ID + function ID + channel in the form
			of a string, delimited by underscores, i.e. "0_15_1".
			Both the function ID and channel are integers that
			further identify the power sensor.
[with power sensor version 0xa0]
    power[1-n]_label	OCC sensor ID + sensor type in the form of a string,
			delimited by an underscore, i.e. "0_system". Sensor
			type will be one of "system", "proc", "vdd" or "vdn".
			For this sensor version, OCC sensor ID will be the same
			for all power sensors.
[present only on "master" OCC; represents the whole system power; only one of
 this type of power sensor will be present]
    power[1-n]_label		"system"
    power[1-n]_input		Latest system output power in microwatts.
    power[1-n]_cap		Current system power cap in microwatts.
    power[1-n]_cap_not_redundant	System power cap in microwatts when
					there is not redundant power.
    power[1-n]_cap_max		Maximum power cap that the OCC can enforce in
				microwatts.
    power[1-n]_cap_min		Minimum power cap that the OCC can enforce in
				microwatts.
    power[1-n]_cap_user		The power cap set by the user, in microwatts.
				This attribute will return 0 if no user power
				cap has been set. This attribute is read-write,
				but writing any precision below watts will be
				ignored, i.e. requesting a power cap of
				500900000 microwatts will result in a power cap
				request of 500 watts.
    [with caps sensor version > 1]
        power[1-n]_cap_user_source	Indicates how the user power cap was
					set. This is an integer that maps to
					system or firmware components that can
					set the user power cap.

The following "extn" sensors are exported as a way for the OCC to provide data
that doesn't fit anywhere else. The meaning of these sensors is entirely
dependent on their data, and cannot be statically defined.

extn[1-n]_label		ASCII ID or OCC sensor ID.
extn[1-n]_flags		This is one byte hexadecimal value. Bit 7 indicates the
			type of the label attribute; 1 for sensor ID, 0 for
			ASCII ID. Other bits are reserved.
extn[1-n]_input		6 bytes of hexadecimal data, with a meaning defined by
			the sensor ID.
