1 /* $OpenBSD: uguru.c,v 1.4 2010/06/03 17:48:24 deraadt Exp $ */ 2 3 /* 4 * Copyright (c) 2010 Mikko Tolmunen <oskari@sefirosu.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/param.h> 20 #include <sys/systm.h> 21 #include <sys/device.h> 22 #include <sys/sensors.h> 23 24 #include <machine/bus.h> 25 26 #include <dev/isa/isareg.h> 27 #include <dev/isa/isavar.h> 28 29 #ifdef UGURU_DEBUG 30 int uguru_dbg = 0; 31 #define DPRINTF(lvl, fmt...) \ 32 if (uguru_dbg >= lvl) \ 33 printf(fmt); 34 #else 35 #define DPRINTF(lvl, fmt...) 36 #endif 37 38 #define UGURU_READ(iot, ioh, reg) \ 39 bus_space_read_1((iot), (ioh), (reg)) 40 #define UGURU_WRITE(iot, ioh, reg, val) \ 41 bus_space_write_1((iot), (ioh), (reg), (val)) 42 43 #define UGURU_DATA 0x00 /* configuration data register */ 44 #define UGURU_INDEX 0x04 /* configuration index register */ 45 #define UGURU_IOSIZE 0x08 46 47 #define UGURU_DUMMY 0x00 /* dummy zero bit */ 48 #define UGURU_ITM_DATA 0x21 /* temp/volt readings */ 49 #define UGURU_ITM_CTRL 0x22 /* temp/volt settings */ 50 #define UGURU_FAN_DATA 0x26 /* fan readings */ 51 #define UGURU_FAN_CTRL 0x27 /* fan settings */ 52 #define UGURU_PRODID 0x44 /* product ID */ 53 54 #define UGURU_VENDID_ABIT 0x147b /* ABIT */ 55 #define UGURU_DEVID1 0x2003 /* AC2003 */ 56 #define UGURU_DEVID2 0x2005 /* AC2005 */ 57 58 #define ABIT_SYSID_KV01 0x0301 59 #define ABIT_SYSID_AI01 0x0302 60 #define ABIT_SYSID_AN01 0x0303 61 #define ABIT_SYSID_AA01 0x0304 62 #define ABIT_SYSID_AG01 0x0305 63 #define ABIT_SYSID_AV01 0x0306 64 #define ABIT_SYSID_KVP1 0x0307 65 #define ABIT_SYSID_AS01 0x0308 66 #define ABIT_SYSID_AX01 0x0309 67 #define ABIT_SYSID_M401 0x030a 68 #define ABIT_SYSID_AN02 0x030b 69 #define ABIT_SYSID_AU01 0x050c 70 #define ABIT_SYSID_AW01 0x050d 71 #define ABIT_SYSID_AL01 0x050e 72 #define ABIT_SYSID_BL01 0x050f 73 #define ABIT_SYSID_NI01 0x0510 74 #define ABIT_SYSID_AT01 0x0511 75 #define ABIT_SYSID_AN03 0x0512 76 #define ABIT_SYSID_AW02 0x0513 77 #define ABIT_SYSID_AB01 0x0514 78 #define ABIT_SYSID_AN04 0x0515 79 #define ABIT_SYSID_AW03 0x0516 80 #define ABIT_SYSID_AT02 0x0517 81 #define ABIT_SYSID_AB02 0x0518 82 #define ABIT_SYSID_IN01 0x0519 83 #define ABIT_SYSID_IP01 0x051a 84 #define ABIT_SYSID_IX01 0x051b 85 #define ABIT_SYSID_IX02 0x051c 86 87 #define UGURU_INTERVAL 5 88 #define UGURU_MAX_SENSORS 27 89 90 #define RFACT_NONE 13700 91 #define RFACT_NONE2 10000 92 #define RFACT(x, y) (RFACT_NONE * ((x) + (y)) / (y)) 93 #define RFACT2(x, y) (RFACT_NONE2 * ((x) + (y)) / (y)) 94 95 struct uguru_softc { 96 struct device sc_dev; 97 98 bus_space_tag_t sc_iot; 99 bus_space_handle_t sc_ioh; 100 101 struct ksensor sc_sensors[UGURU_MAX_SENSORS]; 102 struct ksensordev sc_sensordev; 103 int sc_numsensors; 104 struct uguru_sensor *uguru_sensors; 105 struct { 106 uint8_t reading; 107 /* uint8_t flags; */ 108 uint8_t lower; 109 uint8_t upper; 110 } cs; 111 int (*read)(struct uguru_softc *, int); 112 }; 113 114 struct uguru_sensor { 115 char *desc; 116 enum sensor_type type; 117 void (*refresh)(struct uguru_softc *, int); 118 uint8_t reg; 119 int rfact; 120 }; 121 122 void uguru_refresh_temp(struct uguru_softc *, int); 123 void uguru_refresh_volt(struct uguru_softc *, int); 124 void uguru_refresh_fan(struct uguru_softc *, int); 125 126 #define UGURU_R_TEMP uguru_refresh_temp 127 #define UGURU_R_VOLT uguru_refresh_volt 128 #define UGURU_R_FAN uguru_refresh_fan 129 130 struct uguru_sensor abitkv_sensors[] = { 131 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 }, 132 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 }, 133 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f }, 134 135 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE }, 136 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) }, 137 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) }, 138 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 887) }, 139 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) }, 140 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE }, 141 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE }, 142 143 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 }, 144 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 }, 145 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 }, 146 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 }, 147 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 }, 148 149 { NULL } 150 }; 151 152 struct uguru_sensor abitaa_sensors[] = { 153 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 }, 154 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 }, 155 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x0f }, 156 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x0c }, 157 158 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE }, 159 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) }, 160 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) }, 161 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 888) }, 162 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) }, 163 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE }, 164 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE }, 165 { "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE }, 166 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE }, 167 { "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE }, 168 169 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 }, 170 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 }, 171 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 }, 172 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 }, 173 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 }, 174 175 { NULL } 176 }; 177 178 struct uguru_sensor abitav_sensors[] = { 179 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 }, 180 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 }, 181 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f }, 182 183 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE }, 184 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) }, 185 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) }, 186 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) }, 187 { "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) }, 188 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE }, 189 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE }, 190 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE }, 191 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE }, 192 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE }, 193 { "AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE }, 194 195 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 }, 196 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 }, 197 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 }, 198 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 }, 199 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 }, 200 201 { NULL } 202 }; 203 204 struct uguru_sensor abitas_sensors[] = { 205 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 }, 206 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 }, 207 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f }, 208 209 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE }, 210 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) }, 211 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) }, 212 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 884) }, 213 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) }, 214 { "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) }, 215 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE }, 216 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE }, 217 { "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE }, 218 { "NB/AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE }, 219 { "GMCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE }, 220 221 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 }, 222 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 }, 223 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 }, 224 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 }, 225 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 }, 226 227 { NULL } 228 }; 229 230 struct uguru_sensor abitax_sensors[] = { 231 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 }, 232 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 }, 233 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f }, 234 235 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE }, 236 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) }, 237 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) }, 238 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 888) }, 239 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) }, 240 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE }, 241 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE }, 242 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE }, 243 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE }, 244 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE }, 245 246 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 }, 247 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 }, 248 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 }, 249 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x03 }, 250 251 { NULL } 252 }; 253 254 struct uguru_sensor abitm4_sensors[] = { 255 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 }, 256 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 }, 257 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x02 }, 258 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x03 }, 259 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x04 }, 260 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x05 }, 261 262 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE }, 263 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x13, RFACT(100, 402) }, 264 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x12, RFACT(442, 560) }, 265 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x11, RFACT(2800, 884) }, 266 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x10, RFACT(442, 560) }, 267 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE }, 268 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE }, 269 { "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE }, 270 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT_NONE }, 271 { "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE }, 272 273 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 }, 274 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 }, 275 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 }, 276 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 }, 277 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 }, 278 279 { NULL } 280 }; 281 282 struct uguru_sensor abitan_sensors[] = { 283 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 }, 284 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 }, 285 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f }, 286 287 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE }, 288 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) }, 289 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) }, 290 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 844) }, 291 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) }, 292 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE }, 293 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE }, 294 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE }, 295 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE }, 296 { "MCP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE }, 297 { "MCP SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE }, 298 299 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 }, 300 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 }, 301 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 }, 302 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x05 }, 303 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x04 }, 304 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x03 }, 305 306 { NULL } 307 }; 308 309 struct uguru_sensor abital_sensors[] = { 310 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 311 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 312 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 313 314 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 315 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 316 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 317 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 318 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 319 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 320 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 }, 321 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 322 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 323 { "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 324 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) }, 325 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 326 327 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 328 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 329 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 330 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 331 332 { NULL } 333 }; 334 335 struct uguru_sensor abitaw_sensors[] = { 336 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 337 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 338 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 339 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b }, 340 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c }, 341 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d }, 342 343 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 344 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 345 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 346 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 347 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 348 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 349 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 }, 350 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 351 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 352 { "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 353 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) }, 354 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 355 356 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 357 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 358 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 359 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 360 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 361 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 362 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x26 }, 363 { "AUX5", SENSOR_FANRPM, UGURU_R_FAN, 0x27 }, 364 365 { NULL } 366 }; 367 368 struct uguru_sensor abitni_sensors[] = { 369 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 370 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 371 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 372 373 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 374 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 375 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 376 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 377 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 378 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 379 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 }, 380 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 381 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 382 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 383 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 384 385 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 386 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 387 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 388 { "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 389 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 390 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 391 392 { NULL } 393 }; 394 395 struct uguru_sensor abitat_sensors[] = { 396 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 397 { "NB", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 398 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 399 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b }, 400 401 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 402 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 403 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 404 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 405 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 406 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 407 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) }, 408 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 409 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) }, 410 { "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 }, 411 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 412 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 }, 413 { "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 414 { "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 }, 415 416 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 417 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 418 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 419 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 420 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 421 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 422 423 { NULL } 424 }; 425 426 struct uguru_sensor abitan2_sensors[] = { 427 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 428 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 429 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 430 431 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 432 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 433 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 434 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 435 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 436 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 437 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) }, 438 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 439 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) }, 440 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 441 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 442 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 443 444 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 445 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 446 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 447 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 448 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 449 450 { NULL } 451 }; 452 453 struct uguru_sensor abitab_sensors[] = { 454 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 455 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 456 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 457 458 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 459 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 460 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 461 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 462 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 463 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 464 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 }, 465 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 466 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 467 { "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 }, 468 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 469 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 470 471 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 472 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 473 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 474 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 475 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 476 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 477 478 { NULL } 479 }; 480 481 struct uguru_sensor abitan3_sensors[] = { 482 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 483 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 484 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 485 486 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 487 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 488 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 489 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 490 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 491 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 492 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) }, 493 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 494 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) }, 495 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 496 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 497 { "NB/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 }, 498 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 499 500 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 501 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 502 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 503 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 504 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 505 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 506 507 { NULL } 508 }; 509 510 struct uguru_sensor abitaw2_sensors[] = { 511 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 512 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 513 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 514 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b }, 515 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c }, 516 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d }, 517 518 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 519 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 520 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 521 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 522 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 523 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 524 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) }, 525 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 526 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 527 { "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 528 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) }, 529 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 530 531 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 532 { "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 533 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 534 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 535 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 536 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 537 { "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x26 }, 538 { "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x27 }, 539 540 { NULL } 541 }; 542 543 struct uguru_sensor abitat2_sensors[] = { 544 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 545 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 546 { "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b }, 547 548 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 549 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 550 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 551 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 552 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 553 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 554 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) }, 555 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 556 { "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) }, 557 { "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 }, 558 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 559 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 }, 560 { "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 561 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 }, 562 563 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 564 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 565 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 566 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 567 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 568 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 569 570 { NULL } 571 }; 572 573 struct uguru_sensor abitab2_sensors[] = { 574 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 575 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 576 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 577 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b }, 578 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c }, 579 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d }, 580 { "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e }, 581 582 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 }, 583 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 584 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 585 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) }, 586 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 587 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 588 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) }, 589 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 }, 590 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 591 { "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 }, 592 { "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 593 { "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 594 595 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 596 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 597 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 598 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 599 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 600 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 601 602 { NULL } 603 }; 604 605 struct uguru_sensor abitin_sensors[] = { 606 { "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 }, 607 { "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 }, 608 { "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a }, 609 { "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b }, 610 { "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c }, 611 { "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d }, 612 { "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e }, 613 614 { "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT_NONE2 }, 615 { "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) }, 616 { "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) }, 617 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT2(50, 10) }, 618 { "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) }, 619 { "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) }, 620 { "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT2(34, 34) }, 621 { "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 }, 622 { "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 }, 623 { "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 }, 624 { "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 }, 625 { "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 }, 626 627 { "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 }, 628 { "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 }, 629 { "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 }, 630 { "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 }, 631 { "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 }, 632 { "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 }, 633 634 { NULL } 635 }; 636 637 int uguru_match(struct device *, void *, void *); 638 void uguru_attach(struct device *, struct device *, void *); 639 void uguru_refresh(void *); 640 int uguru_read_sensor(struct uguru_softc *, int); 641 int uguru_ac5_read_sensor(struct uguru_softc *, int); 642 int uguru_ac5_read(bus_space_tag_t, bus_space_handle_t, 643 uint16_t, void *, int); 644 int uguru_write_multi(bus_space_tag_t, bus_space_handle_t, 645 uint8_t, void *, int); 646 int uguru_read_multi(bus_space_tag_t, bus_space_handle_t, void *, int); 647 648 struct cfdriver uguru_cd = { 649 NULL, "uguru", DV_DULL 650 }; 651 652 struct cfattach uguru_ca = { 653 sizeof(struct uguru_softc), uguru_match, uguru_attach 654 }; 655 656 int 657 uguru_match(struct device *parent, void *match, void *aux) 658 { 659 struct isa_attach_args *ia = aux; 660 bus_space_tag_t iot; 661 bus_space_handle_t ioh; 662 uint8_t data[9]; 663 uint16_t vendid, devid; 664 int ret = 0; 665 666 iot = ia->ia_iot; 667 if (bus_space_map(iot, ia->ipa_io[0].base, UGURU_IOSIZE, 0, &ioh)) { 668 DPRINTF(0, ": can't map i/o space\n"); 669 return 0; 670 } 671 672 UGURU_WRITE(iot, ioh, UGURU_INDEX, UGURU_PRODID); 673 if (!uguru_read_multi(iot, ioh, &data, sizeof(data)) || 674 !uguru_ac5_read(iot, ioh, 0x0904, &data, sizeof(data))) { 675 vendid = data[0] << 8 | data[1]; 676 devid = data[2] << 8 | data[3]; 677 678 if (vendid == UGURU_VENDID_ABIT && 679 (devid == UGURU_DEVID1 || 680 devid == UGURU_DEVID2)) { 681 ia->ipa_nio = 1; 682 ia->ipa_io[0].length = UGURU_IOSIZE; 683 ia->ipa_nmem = 0; 684 ia->ipa_nirq = 0; 685 ia->ipa_ndrq = 0; 686 ret = 1; 687 } 688 } 689 bus_space_unmap(iot, ioh, UGURU_IOSIZE); 690 return (ret); 691 } 692 693 void 694 uguru_attach(struct device *parent, struct device *self, void *aux) 695 { 696 struct uguru_softc *sc = (void *)self; 697 struct isa_attach_args *ia = aux; 698 struct uguru_sensor *sensors; 699 uint8_t data[9]; 700 uint16_t vendid, devid, sysid; 701 int i; 702 703 sc->sc_iot = ia->ia_iot; 704 if (bus_space_map(sc->sc_iot, ia->ipa_io[0].base, 705 UGURU_IOSIZE, 0, &sc->sc_ioh)) { 706 printf(": can't map i/o space\n"); 707 return; 708 } 709 710 UGURU_WRITE(sc->sc_iot, sc->sc_ioh, UGURU_INDEX, UGURU_PRODID); 711 if (!uguru_read_multi(sc->sc_iot, sc->sc_ioh, &data, sizeof(data))) { 712 sc->read = uguru_read_sensor; 713 goto done; 714 } 715 716 /* AC2005 product ID */ 717 if (!uguru_ac5_read(sc->sc_iot, sc->sc_ioh, 718 0x0904, &data, sizeof(data))) { 719 sc->read = uguru_ac5_read_sensor; 720 goto done; 721 } 722 723 printf("\n"); 724 return; 725 726 done: 727 DPRINTF(5, ": %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x", 728 data[0], data[1], data[2], data[3], data[4], 729 data[5], data[6], data[7], data[8]); 730 731 vendid = data[0] << 8 | data[1]; 732 devid = data[2] << 8 | data[3]; 733 sysid = data[3] << 8 | data[7]; 734 735 if (vendid != UGURU_VENDID_ABIT || 736 (devid != UGURU_DEVID1 && 737 devid != UGURU_DEVID2)) { 738 printf(": attach failed\n"); 739 return; 740 } 741 printf(": AC%x", devid); 742 743 switch(sysid) { 744 case ABIT_SYSID_KV01: 745 case ABIT_SYSID_AI01: 746 case ABIT_SYSID_AN01: 747 printf(" KV1"); 748 sensors = abitkv_sensors; 749 break; 750 case ABIT_SYSID_AA01: 751 case ABIT_SYSID_AG01: 752 printf(" AA1"); 753 sensors = abitaa_sensors; 754 break; 755 case ABIT_SYSID_AV01: 756 case ABIT_SYSID_KVP1: 757 printf(" AV1"); 758 sensors = abitav_sensors; 759 break; 760 case ABIT_SYSID_AS01: 761 printf(" AS1"); 762 sensors = abitas_sensors; 763 break; 764 case ABIT_SYSID_AX01: 765 printf(" AX1"); 766 sensors = abitax_sensors; 767 break; 768 case ABIT_SYSID_M401: 769 printf(" M41"); 770 sensors = abitm4_sensors; 771 break; 772 case ABIT_SYSID_AN02: 773 printf(" AN1"); 774 sensors = abitan_sensors; 775 break; 776 case ABIT_SYSID_AU01: 777 case ABIT_SYSID_AL01: 778 case ABIT_SYSID_BL01: 779 printf(" AL1"); 780 sensors = abital_sensors; 781 break; 782 case ABIT_SYSID_AW01: 783 case ABIT_SYSID_AW02: 784 printf(" AW1"); 785 sensors = abitaw_sensors; 786 break; 787 case ABIT_SYSID_NI01: 788 printf(" NI1"); 789 sensors = abitni_sensors; 790 break; 791 case ABIT_SYSID_AT01: 792 printf(" AT1"); 793 sensors = abitat_sensors; 794 break; 795 case ABIT_SYSID_AN03: 796 printf(" AN2"); 797 sensors = abitan2_sensors; 798 break; 799 case ABIT_SYSID_AB01: 800 printf(" AB1"); 801 sensors = abitab_sensors; 802 break; 803 case ABIT_SYSID_AN04: 804 printf(" AN3"); 805 sensors = abitan3_sensors; 806 break; 807 case ABIT_SYSID_AW03: 808 printf(" AW2"); 809 sensors = abitaw2_sensors; 810 break; 811 case ABIT_SYSID_AT02: 812 printf(" AT2"); 813 sensors = abitat2_sensors; 814 break; 815 case ABIT_SYSID_AB02: 816 case ABIT_SYSID_IP01: 817 case ABIT_SYSID_IX01: 818 case ABIT_SYSID_IX02: 819 printf(" AB2"); 820 sensors = abitab2_sensors; 821 break; 822 case ABIT_SYSID_IN01: 823 printf(" IN1"); 824 sensors = abitin_sensors; 825 break; 826 default: 827 printf(" unknown system (ID 0x%.4x)\n", sysid); 828 return; 829 } 830 printf("\n"); 831 832 strlcpy(sc->sc_sensordev.xname, 833 sc->sc_dev.dv_xname, 834 sizeof(sc->sc_sensordev.xname)); 835 836 for (i = 0; sensors[i].desc != NULL; i++) { 837 strlcpy(sc->sc_sensors[i].desc, 838 sensors[i].desc, sizeof(sc->sc_sensors[i].desc)); 839 sc->sc_sensors[i].type = sensors[i].type; 840 sensor_attach(&sc->sc_sensordev, &sc->sc_sensors[i]); 841 sc->sc_numsensors++; 842 } 843 sc->uguru_sensors = sensors; 844 845 if (sensor_task_register(sc, uguru_refresh, UGURU_INTERVAL) == NULL) { 846 printf("%s: unable to register update task\n", 847 sc->sc_sensordev.xname); 848 return; 849 } 850 sensordev_install(&sc->sc_sensordev); 851 } 852 853 void 854 uguru_refresh(void *arg) 855 { 856 struct uguru_softc *sc = (struct uguru_softc *)arg; 857 int i; 858 859 for (i = 0; i < sc->sc_numsensors; i++) 860 sc->uguru_sensors[i].refresh(sc, i); 861 } 862 863 void 864 uguru_refresh_temp(struct uguru_softc *sc, int n) 865 { 866 struct ksensor *sensor = &sc->sc_sensors[n]; 867 int status = SENSOR_S_OK; 868 int ret; 869 870 ret = sc->read(sc, n); 871 if (sc->cs.reading == 0x00) { 872 sensor->flags |= SENSOR_FINVALID; 873 sensor->value = 0; 874 return; 875 } 876 sensor->flags &= ~SENSOR_FINVALID; 877 sensor->value = sc->cs.reading * 1000000 + 273150000; 878 879 if (ret) 880 status = SENSOR_S_UNSPEC; 881 else { 882 if (sc->cs.reading >= sc->cs.lower) 883 status = SENSOR_S_WARN; 884 if (sc->cs.reading >= sc->cs.upper) 885 status = SENSOR_S_CRIT; 886 } 887 sensor->status = status; 888 } 889 890 void 891 uguru_refresh_volt(struct uguru_softc *sc, int n) 892 { 893 int status = SENSOR_S_OK; 894 895 if (sc->read(sc, n)) 896 status = SENSOR_S_UNSPEC; 897 else 898 if (sc->cs.reading <= sc->cs.lower || 899 sc->cs.reading >= sc->cs.upper) 900 status = SENSOR_S_CRIT; 901 902 sc->sc_sensors[n].value = 903 sc->cs.reading * sc->uguru_sensors[n].rfact; 904 sc->sc_sensors[n].status = status; 905 } 906 907 void 908 uguru_refresh_fan(struct uguru_softc *sc, int n) 909 { 910 struct ksensor *sensor = &sc->sc_sensors[n]; 911 int ret; 912 913 ret = sc->read(sc, n); 914 if (sc->cs.reading == 0x00) { 915 sensor->flags |= SENSOR_FINVALID; 916 sensor->value = 0; 917 return; 918 } 919 sensor->flags &= ~SENSOR_FINVALID; 920 sensor->value = sc->cs.reading * 60; 921 922 if (ret) 923 sensor->status = SENSOR_S_UNSPEC; 924 else 925 if (sc->cs.reading <= sc->cs.lower) 926 sensor->status = SENSOR_S_CRIT; 927 else 928 sensor->status = SENSOR_S_OK; 929 } 930 931 int 932 uguru_read_sensor(struct uguru_softc *sc, int n) 933 { 934 struct ksensor *sensor = &sc->sc_sensors[n]; 935 bus_space_tag_t iot = sc->sc_iot; 936 bus_space_handle_t ioh = sc->sc_ioh; 937 uint8_t reg = sc->uguru_sensors[n].reg; 938 uint8_t idx, data[3]; 939 uint8_t val = 0x00; 940 int count, ret = 0; 941 942 if (sensor->type == SENSOR_FANRPM) 943 idx = UGURU_FAN_DATA; 944 else 945 idx = UGURU_ITM_DATA; 946 947 /* sensor value */ 948 if (uguru_write_multi(iot, ioh, idx, ®, sizeof(reg)) || 949 uguru_read_multi(iot, ioh, &val, sizeof(val))) 950 ++ret; 951 952 /* sensor status */ 953 bzero(&data, sizeof(data)); 954 count = sensor->type == SENSOR_FANRPM ? 2 : 3; 955 956 if (uguru_write_multi(iot, ioh, idx + 1, ®, sizeof(reg)) || 957 uguru_read_multi(iot, ioh, &data, count)) 958 ++ret; 959 960 /* fill in current sensor structure */ 961 sc->cs.reading = val; 962 /* sc->cs.flags = data[0]; */ 963 sc->cs.lower = data[1]; 964 sc->cs.upper = data[2]; 965 966 DPRINTF(50, "0x%.2x: 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x\n", 967 idx, reg, val, data[0], data[1], data[2]); 968 969 return (ret); 970 } 971 972 int 973 uguru_ac5_read_sensor(struct uguru_softc *sc, int n) 974 { 975 uint16_t reg; 976 uint8_t val = 0x00; 977 int ret = 1; 978 979 reg = sc->uguru_sensors[n].reg | 0x0880; 980 if (uguru_ac5_read(sc->sc_iot, sc->sc_ioh, reg, &val, sizeof(val))) 981 ++ret; 982 983 sc->cs.reading = val; 984 return (ret); 985 } 986 987 int 988 uguru_ac5_read(bus_space_tag_t iot, bus_space_handle_t ioh, 989 uint16_t reg, void *data, int count) 990 { 991 uint8_t buf[3]; 992 993 buf[0] = reg >> 8; 994 buf[1] = reg & 0xff; 995 buf[2] = count; 996 997 if (!uguru_write_multi(iot, ioh, 0x1a, &buf, sizeof(buf)) && 998 !uguru_read_multi(iot, ioh, data, count)) 999 return 0; 1000 1001 DPRINTF(0, "uguru_ac5_read: timeout 0x%.2x 0x%.2x 0x%.2x\n", 1002 buf[0], buf[1], buf[2]); 1003 1004 return 1; 1005 } 1006 1007 int 1008 uguru_write_multi(bus_space_tag_t iot, bus_space_handle_t ioh, 1009 uint8_t idx, void *data, int count) 1010 { 1011 uint8_t *inbuf = data; 1012 int i, ntries; 1013 1014 UGURU_WRITE(iot, ioh, UGURU_INDEX, idx); 1015 1016 for (i = 0; i < count; ++i) { 1017 /* 1018 * wait for non-busy status before write 1019 * to the data port. 1020 */ 1021 ntries = 0; 1022 while (UGURU_READ(iot, ioh, UGURU_INDEX) >> 1 & 1) { 1023 if (++ntries > 65) 1024 goto timeout; 1025 DELAY(5); 1026 } 1027 /* dummy read to flush the internal buffer */ 1028 if (i == 0) 1029 UGURU_READ(iot, ioh, UGURU_DATA); 1030 1031 UGURU_WRITE(iot, ioh, UGURU_DATA, *inbuf++); 1032 } 1033 return 0; 1034 1035 timeout: 1036 DPRINTF(0, "uguru_write_multi: timeout 0x%.2x\n", idx); 1037 return 1; 1038 } 1039 1040 int 1041 uguru_read_multi(bus_space_tag_t iot, bus_space_handle_t ioh, 1042 void *data, int count) 1043 { 1044 uint8_t *outbuf = data; 1045 int i, ntries; 1046 1047 for (i = 0; i < count; ++i) { 1048 /* 1049 * wait for valid status before read 1050 * from the data port. 1051 */ 1052 ntries = 0; 1053 while (!(UGURU_READ(iot, ioh, UGURU_INDEX) & 1)) { 1054 if (++ntries > 40) { 1055 DPRINTF(0, "uguru_read_multi: timeout\n"); 1056 return 1; 1057 } 1058 DELAY(35); 1059 } 1060 *outbuf++ = UGURU_READ(iot, ioh, UGURU_DATA); 1061 } 1062 return 0; 1063 } 1064