Kernel driver fscher ==================== Supported chips: * Fujitsu-Siemens Hermes chip Prefix: 'fscher' Addresses scanned: I2C 0x73 Authors: Reinhard Nissl based on work from Hermann Jung , Frodo Looijaard , Philip Edelbrock Description ----------- This driver implements support for the Fujitsu-Siemens Hermes chip. It is described in the 'Register Set Specification BMC Hermes based Systemboard' from Fujitsu-Siemens. The Hermes chip implements a hardware-based system management, e.g. for controlling fan speed and core voltage. There is also a watchdog counter on the chip which can trigger an alarm and even shut the system down. The chip provides three temperature values (CPU, motherboard and auxiliary), three voltage values (+12V, +5V and battery) and three fans (power supply, CPU and auxiliary). Temperatures are measured in degrees Celsius. The resolution is 1 degree. Fan rotation speeds are reported in RPM (rotations per minute). The value can be divided by a programmable divider (1, 2 or 4) which is stored on the chip. Voltage sensors (also known as "in" sensors) report their values in volts. All values are reported as final values from the driver. There is no need for further calculations. Detailed description -------------------- Below you'll find a single line description of all the bit values. With this information, you're able to decode e. g. alarms, wdog, etc. To make use of the watchdog, you'll need to set the watchdog time and enable the watchdog. After that it is necessary to restart the watchdog time within the specified period of time, or a system reset will occur. * revision READING & 0xff = 0x??: HERMES revision identification * alarms READING & 0x80 = 0x80: CPU throttling active READING & 0x80 = 0x00: CPU running at full speed READING & 0x10 = 0x10: software event (see control:1) READING & 0x10 = 0x00: no software event READING & 0x08 = 0x08: watchdog event (see wdog:2) READING & 0x08 = 0x00: no watchdog event READING & 0x02 = 0x02: thermal event (see temp*:1) READING & 0x02 = 0x00: no thermal event READING & 0x01 = 0x01: fan event (see fan*:1) READING & 0x01 = 0x00: no fan event READING & 0x13 ! 0x00: ALERT LED is flashing * control READING & 0x01 = 0x01: software event READING & 0x01 = 0x00: no software event WRITING & 0x01 = 0x01: set software event WRITING & 0x01 = 0x00: clear software event * watchdog_control READING & 0x80 = 0x80: power off on watchdog event while thermal event READING & 0x80 = 0x00: watchdog power off disabled (just system reset enabled) READING & 0x40 = 0x40: watchdog timebase 60 seconds (see also wdog:1) READING & 0x40 = 0x00: watchdog timebase 2 seconds READING & 0x10 = 0x10: watchdog enabled READING & 0x10 = 0x00: watchdog disabled WRITING & 0x80 = 0x80: enable "power off on watchdog event while thermal event" WRITING & 0x80 = 0x00: disable "power off on watchdog event while thermal event" WRITING & 0x40 = 0x40: set watchdog timebase to 60 seconds WRITING & 0x40 = 0x00: set watchdog timebase to 2 seconds WRITING & 0x20 = 0x20: disable watchdog WRITING & 0x10 = 0x10: enable watchdog / restart watchdog time * watchdog_state READING & 0x02 = 0x02: watchdog system reset occurred READING & 0x02 = 0x00: no watchdog system reset occurred WRITING & 0x02 = 0x02: clear watchdog event * watchdog_preset READING & 0xff = 0x??: configured watch dog time in units (see wdog:3 0x40) WRITING & 0xff = 0x??: configure watch dog time in units * in* (0: +5V, 1: +12V, 2: onboard 3V battery) READING: actual voltage value * temp*_status (1: CPU sensor, 2: onboard sensor, 3: auxiliary sensor) READING & 0x02 = 0x02: thermal event (overtemperature) READING & 0x02 = 0x00: no thermal event READING & 0x01 = 0x01: sensor is working READING & 0x01 = 0x00: sensor is faulty WRITING & 0x02 = 0x02: clear thermal event * temp*_input (1: CPU sensor, 2: onboard sensor, 3: auxiliary sensor) READING: actual temperature value * fan*_status (1: power supply fan, 2: CPU fan, 3: auxiliary fan) READING & 0x04 = 0x04: fan event (fan fault) READING & 0x04 = 0x00: no fan event WRITING & 0x04 = 0x04: clear fan event * fan*_div (1: power supply fan, 2: CPU fan, 3: auxiliary fan) Divisors 2,4 and 8 are supported, both for reading and writing * fan*_pwm (1: power supply fan, 2: CPU fan, 3: auxiliary fan) READING & 0xff = 0x00: fan may be switched off READING & 0xff = 0x01: fan must run at least at minimum speed (supply: 6V) READING & 0xff = 0xff: fan must run at maximum speed (supply: 12V) READING & 0xff = 0x??: fan must run at least at given speed (supply: 6V..12V) WRITING & 0xff = 0x00: fan may be switched off WRITING & 0xff = 0x01: fan must run at least at minimum speed (supply: 6V) WRITING & 0xff = 0xff: fan must run at maximum speed (supply: 12V) WRITING & 0xff = 0x??: fan must run at least at given speed (supply: 6V..12V) * fan*_input (1: power supply fan, 2: CPU fan, 3: auxiliary fan) READING: actual RPM value Limitations ----------- * Measuring fan speed It seems that the chip counts "ripples" (typical fans produce 2 ripples per rotation while VERAX fans produce 18) in a 9-bit register. This register is read out every second, then the ripple prescaler (2, 4 or 8) is applied and the result is stored in the 8 bit output register. Due to the limitation of the counting register to 9 bits, it is impossible to measure a VERAX fan properly (even with a prescaler of 8). At its maximum speed of 3500 RPM the fan produces 1080 ripples per second which causes the counting register to overflow twice, leading to only 186 RPM. * Measuring input voltages in2 ("battery") reports the voltage of the onboard lithium battery and not +3.3V from the power supply. * Undocumented features Fujitsu-Siemens Computers has not documented all features of the chip so far. Their software, System Guard, shows that there are a still some features which cannot be controlled by this implementation.