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
uguru_match(struct device * parent,void * match,void * aux)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
uguru_attach(struct device * parent,struct device * self,void * aux)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
uguru_refresh(void * arg)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
uguru_refresh_temp(struct uguru_softc * sc,int n)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
uguru_refresh_volt(struct uguru_softc * sc,int n)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
uguru_refresh_fan(struct uguru_softc * sc,int n)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
uguru_read_sensor(struct uguru_softc * sc,int n)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
uguru_ac5_read_sensor(struct uguru_softc * sc,int n)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
uguru_ac5_read(bus_space_tag_t iot,bus_space_handle_t ioh,uint16_t reg,void * data,int count)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
uguru_write_multi(bus_space_tag_t iot,bus_space_handle_t ioh,uint8_t idx,void * data,int count)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
uguru_read_multi(bus_space_tag_t iot,bus_space_handle_t ioh,void * data,int count)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