| R.Marek@sh.cvut.cz | 7f15b66 | 2005-05-26 12:42:19 +0000 | [diff] [blame] | 1 | Kernel driver fscher | 
 | 2 | ==================== | 
 | 3 |  | 
 | 4 | Supported chips: | 
 | 5 |   * Fujitsu-Siemens Hermes chip | 
 | 6 |     Prefix: 'fscher' | 
 | 7 |     Addresses scanned: I2C 0x73 | 
 | 8 |  | 
 | 9 | Authors: | 
 | 10 |         Reinhard Nissl <rnissl@gmx.de> based on work | 
 | 11 |         from Hermann Jung <hej@odn.de>, | 
 | 12 |         Frodo Looijaard <frodol@dds.nl>, | 
 | 13 |         Philip Edelbrock <phil@netroedge.com> | 
 | 14 |  | 
 | 15 | Description | 
 | 16 | ----------- | 
 | 17 |  | 
 | 18 | This driver implements support for the Fujitsu-Siemens Hermes chip. It is | 
 | 19 | described in the 'Register Set Specification BMC Hermes based Systemboard' | 
 | 20 | from Fujitsu-Siemens. | 
 | 21 |  | 
 | 22 | The Hermes chip implements a hardware-based system management, e.g. for | 
 | 23 | controlling fan speed and core voltage. There is also a watchdog counter on | 
 | 24 | the chip which can trigger an alarm and even shut the system down. | 
 | 25 |  | 
 | 26 | The chip provides three temperature values (CPU, motherboard and | 
 | 27 | auxiliary), three voltage values (+12V, +5V and battery) and three fans | 
 | 28 | (power supply, CPU and auxiliary). | 
 | 29 |  | 
 | 30 | Temperatures are measured in degrees Celsius. The resolution is 1 degree. | 
 | 31 |  | 
 | 32 | Fan rotation speeds are reported in RPM (rotations per minute). The value | 
 | 33 | can be divided by a programmable divider (1, 2 or 4) which is stored on | 
 | 34 | the chip. | 
 | 35 |  | 
 | 36 | Voltage sensors (also known as "in" sensors) report their values in volts. | 
 | 37 |  | 
 | 38 | All values are reported as final values from the driver. There is no need | 
 | 39 | for further calculations. | 
 | 40 |  | 
 | 41 |  | 
 | 42 | Detailed description | 
 | 43 | -------------------- | 
 | 44 |  | 
 | 45 | Below you'll find a single line description of all the bit values. With | 
 | 46 | this information, you're able to decode e. g. alarms, wdog, etc. To make | 
 | 47 | use of the watchdog, you'll need to set the watchdog time and enable the | 
 | 48 | watchdog. After that it is necessary to restart the watchdog time within | 
 | 49 | the specified period of time, or a system reset will occur. | 
 | 50 |  | 
 | 51 | * revision | 
 | 52 |   READING & 0xff = 0x??: HERMES revision identification | 
 | 53 |  | 
 | 54 | * alarms | 
 | 55 |   READING & 0x80 = 0x80: CPU throttling active | 
 | 56 |   READING & 0x80 = 0x00: CPU running at full speed | 
 | 57 |  | 
 | 58 |   READING & 0x10 = 0x10: software event (see control:1) | 
 | 59 |   READING & 0x10 = 0x00: no software event | 
 | 60 |  | 
 | 61 |   READING & 0x08 = 0x08: watchdog event (see wdog:2) | 
 | 62 |   READING & 0x08 = 0x00: no watchdog event | 
 | 63 |  | 
 | 64 |   READING & 0x02 = 0x02: thermal event (see temp*:1) | 
 | 65 |   READING & 0x02 = 0x00: no thermal event | 
 | 66 |  | 
 | 67 |   READING & 0x01 = 0x01: fan event (see fan*:1) | 
 | 68 |   READING & 0x01 = 0x00: no fan event | 
 | 69 |  | 
 | 70 |   READING & 0x13 ! 0x00: ALERT LED is flashing | 
 | 71 |  | 
 | 72 | * control | 
 | 73 |   READING & 0x01 = 0x01: software event | 
 | 74 |   READING & 0x01 = 0x00: no software event | 
 | 75 |  | 
 | 76 |   WRITING & 0x01 = 0x01: set software event | 
 | 77 |   WRITING & 0x01 = 0x00: clear software event | 
 | 78 |  | 
 | 79 | * watchdog_control | 
 | 80 |   READING & 0x80 = 0x80: power off on watchdog event while thermal event | 
 | 81 |   READING & 0x80 = 0x00: watchdog power off disabled (just system reset enabled) | 
 | 82 |  | 
 | 83 |   READING & 0x40 = 0x40: watchdog timebase 60 seconds (see also wdog:1) | 
 | 84 |   READING & 0x40 = 0x00: watchdog timebase  2 seconds | 
 | 85 |  | 
 | 86 |   READING & 0x10 = 0x10: watchdog enabled | 
 | 87 |   READING & 0x10 = 0x00: watchdog disabled | 
 | 88 |  | 
 | 89 |   WRITING & 0x80 = 0x80: enable "power off on watchdog event while thermal event" | 
 | 90 |   WRITING & 0x80 = 0x00: disable "power off on watchdog event while thermal event" | 
 | 91 |  | 
 | 92 |   WRITING & 0x40 = 0x40: set watchdog timebase to 60 seconds | 
 | 93 |   WRITING & 0x40 = 0x00: set watchdog timebase to  2 seconds | 
 | 94 |  | 
 | 95 |   WRITING & 0x20 = 0x20: disable watchdog | 
 | 96 |  | 
 | 97 |   WRITING & 0x10 = 0x10: enable watchdog / restart watchdog time | 
 | 98 |  | 
 | 99 | * watchdog_state | 
 | 100 |   READING & 0x02 = 0x02: watchdog system reset occurred | 
 | 101 |   READING & 0x02 = 0x00: no watchdog system reset occurred | 
 | 102 |  | 
 | 103 |   WRITING & 0x02 = 0x02: clear watchdog event | 
 | 104 |  | 
 | 105 | * watchdog_preset | 
 | 106 |   READING & 0xff = 0x??: configured watch dog time in units (see wdog:3 0x40) | 
 | 107 |  | 
 | 108 |   WRITING & 0xff = 0x??: configure watch dog time in units | 
 | 109 |  | 
 | 110 | * in*     (0: +5V, 1: +12V, 2: onboard 3V battery) | 
 | 111 |   READING: actual voltage value | 
 | 112 |  | 
 | 113 | * temp*_status   (1: CPU sensor, 2: onboard sensor, 3: auxiliary sensor) | 
 | 114 |   READING & 0x02 = 0x02: thermal event (overtemperature) | 
 | 115 |   READING & 0x02 = 0x00: no thermal event | 
 | 116 |  | 
 | 117 |   READING & 0x01 = 0x01: sensor is working | 
 | 118 |   READING & 0x01 = 0x00: sensor is faulty | 
 | 119 |  | 
 | 120 |   WRITING & 0x02 = 0x02: clear thermal event | 
 | 121 |  | 
 | 122 | * temp*_input   (1: CPU sensor, 2: onboard sensor, 3: auxiliary sensor) | 
 | 123 |   READING: actual temperature value | 
 | 124 |  | 
 | 125 | * fan*_status   (1: power supply fan, 2: CPU fan, 3: auxiliary fan) | 
 | 126 |   READING & 0x04 = 0x04: fan event (fan fault) | 
 | 127 |   READING & 0x04 = 0x00: no fan event | 
 | 128 |  | 
 | 129 |   WRITING & 0x04 = 0x04: clear fan event | 
 | 130 |  | 
 | 131 | * fan*_div (1: power supply fan, 2: CPU fan, 3: auxiliary fan) | 
 | 132 |   	Divisors 2,4 and 8 are supported, both for reading and writing | 
 | 133 |  | 
 | 134 | * fan*_pwm   (1: power supply fan, 2: CPU fan, 3: auxiliary fan) | 
 | 135 |   READING & 0xff = 0x00: fan may be switched off | 
 | 136 |   READING & 0xff = 0x01: fan must run at least at minimum speed (supply: 6V) | 
 | 137 |   READING & 0xff = 0xff: fan must run at maximum speed (supply: 12V) | 
 | 138 |   READING & 0xff = 0x??: fan must run at least at given speed (supply: 6V..12V) | 
 | 139 |  | 
 | 140 |   WRITING & 0xff = 0x00: fan may be switched off | 
 | 141 |   WRITING & 0xff = 0x01: fan must run at least at minimum speed (supply: 6V) | 
 | 142 |   WRITING & 0xff = 0xff: fan must run at maximum speed (supply: 12V) | 
 | 143 |   WRITING & 0xff = 0x??: fan must run at least at given speed (supply: 6V..12V) | 
 | 144 |  | 
 | 145 | * fan*_input   (1: power supply fan, 2: CPU fan, 3: auxiliary fan) | 
 | 146 |   READING: actual RPM value | 
 | 147 |  | 
 | 148 |  | 
 | 149 | Limitations | 
 | 150 | ----------- | 
 | 151 |  | 
 | 152 | * Measuring fan speed | 
 | 153 | It seems that the chip counts "ripples" (typical fans produce 2 ripples per | 
 | 154 | rotation while VERAX fans produce 18) in a 9-bit register. This register is | 
 | 155 | read out every second, then the ripple prescaler (2, 4 or 8) is applied and | 
 | 156 | the result is stored in the 8 bit output register. Due to the limitation of | 
 | 157 | the counting register to 9 bits, it is impossible to measure a VERAX fan | 
 | 158 | properly (even with a prescaler of 8). At its maximum speed of 3500 RPM the | 
 | 159 | fan produces 1080 ripples per second which causes the counting register to | 
 | 160 | overflow twice, leading to only 186 RPM. | 
 | 161 |  | 
 | 162 | * Measuring input voltages | 
 | 163 | in2 ("battery") reports the voltage of the onboard lithium battery and not | 
 | 164 | +3.3V from the power supply. | 
 | 165 |  | 
 | 166 | * Undocumented features | 
 | 167 | Fujitsu-Siemens Computers has not documented all features of the chip so | 
 | 168 | far. Their software, System Guard, shows that there are a still some | 
 | 169 | features which cannot be controlled by this implementation. |