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