xref: /openbsd/sys/dev/isa/uguru.c (revision 3d8817e4)
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, &reg, 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, &reg, 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