[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-tech
Subject:    ABIT microGuru
From:       Mikko Tolmunen <oskari () sefirosu ! org>
Date:       2010-03-26 9:40:46
Message-ID: 20100326094046.GC11047 () sefirosu ! org
[Download RAW message or body]

temperature and such, sensors for ABIT motherboards.
been using this patch for months now,
also tested with couple of other machines.

patch is also available via http
sefirosu.org/uguru.diff.gz
Index: share/man/man4/Makefile
===================================================================
RCS file: /cvs/src/share/man/man4/Makefile,v
retrieving revision 1.504
diff -u -p -r1.504 Makefile
--- share/man/man4/Makefile	1 Mar 2010 23:35:56 -0000	1.504
+++ share/man/man4/Makefile	26 Mar 2010 09:10:53 -0000
@@ -54,7 +54,7 @@ MAN=	aac.4 ac97.4 acphy.4 \
 	tlphy.4 thmc.4 tqphy.4 trm.4 trunk.4 tsl.4 tty.4 tun.4 twe.4 txp.4 \
 	txphy.4 uaudio.4 uark.4 uath.4 uberry.4 ubsa.4 ubsec.4 ubt.4 \
 	ucom.4 uchcom.4 ucycom.4 udav.4 udcf.4 udfu.4 udl.4 udp.4 udsbr.4 \
-	ueagle.4 uftdi.4 ugen.4 uhci.4 uhid.4 uhidev.4 uhts.4 \
+	ueagle.4 uftdi.4 ugen.4 uguru.4 uhci.4 uhid.4 uhidev.4 uhts.4 \
 	uipaq.4 uk.4 ukbd.4 \
 	ukphy.4 ulpt.4 umass.4 umbg.4 umct.4 umidi.4 umodem.4 ums.4 umsm.4 \
 	unix.4 uow.4 upgt.4 upl.4 uplcom.4 ural.4 urio.4 url.4 urlphy.4 \
Index: share/man/man4/uguru.4
===================================================================
RCS file: share/man/man4/uguru.4
diff -N share/man/man4/uguru.4
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ share/man/man4/uguru.4	26 Mar 2010 09:10:53 -0000
@@ -0,0 +1,51 @@
+.\"	$OpenBSD$
+.\"
+.\" Copyright (c) 2010 Mikko Tolmunen <oskari@sefirosu.org>
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.Dd $Mdocdate$
+.Dt UGURU 4
+.Os
+.Sh NAME
+.Nm uguru
+.Nd temperature, voltage and fan sensors
+.Sh SYNOPSIS
+.Cd "uguru0 at isa? port 0xe0"
+.Sh DESCRIPTION
+The
+.Nm
+driver provides support for the microcontroller
+found in various
+.Tn ABIT
+motherboards which serves as
+the gateway chip between system management software
+and hardware. Sensor values are made available through the
+.Xr sysctl 8
+interface.
+.Sh SEE ALSO
+.Xr intro 4 ,
+.Xr isa 4 ,
+.Xr sensorsd 8 ,
+.Xr sysctl 8
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Ox 4.8
+.Sh AUTHORS
+The
+.Nm
+driver was written by
+.An Mikko Tolmunen Aq oskari@sefirosu.org .
+.Sh BUGS
+Interrupt support is unimplemented.
Index: sys/arch/amd64/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v
retrieving revision 1.287
diff -u -p -r1.287 GENERIC
--- sys/arch/amd64/conf/GENERIC	3 Mar 2010 20:57:28 -0000	1.287
+++ sys/arch/amd64/conf/GENERIC	26 Mar 2010 09:10:56 -0000
@@ -97,6 +97,8 @@ wbsio*	at isa? port 0x2e	# Winbond LPC S
 wbsio*	at isa? port 0x4e
 lm*	at wbsio?
 
+uguru0	at isa? port 0xe0		# ABIT uGuru
+
 aps0	at isa? port 0x1600		# ThinkPad Active Protection System
 
 piixpm*	at pci?			# Intel PIIX PM
Index: sys/arch/i386/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/i386/conf/GENERIC,v
retrieving revision 1.680
diff -u -p -r1.680 GENERIC
--- sys/arch/i386/conf/GENERIC	3 Mar 2010 20:57:28 -0000	1.680
+++ sys/arch/i386/conf/GENERIC	26 Mar 2010 09:11:00 -0000
@@ -149,6 +149,7 @@ wbsio*	at isa? port 0x2e		# Winbond LPC 
 wbsio*	at isa? port 0x4e
 lm*	at wbsio?
 fins0	at isa? port 0x4e		# Fintek F71805 Super I/O
+uguru0	at isa? port 0xe0		# ABIT uGuru
 
 aps0	at isa? port 0x1600		# ThinkPad Active Protection System
 
Index: sys/dev/isa/files.isa
===================================================================
RCS file: /cvs/src/sys/dev/isa/files.isa,v
retrieving revision 1.105
diff -u -p -r1.105 files.isa
--- sys/dev/isa/files.isa	23 Jan 2009 20:32:22 -0000	1.105
+++ sys/dev/isa/files.isa	26 Mar 2010 09:11:06 -0000
@@ -373,6 +373,11 @@ device	viasio
 attach	viasio at isa
 file	dev/isa/viasio.c		viasio
 
+# ABIT uGuru
+device	uguru
+attach	uguru at isa
+file	dev/isa/uguru.c			uguru
+
 # ThinkPad Active Protection System accelerometer
 device	aps
 attach	aps at isa
Index: sys/dev/isa/uguru.c
===================================================================
RCS file: sys/dev/isa/uguru.c
diff -N sys/dev/isa/uguru.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/dev/isa/uguru.c	26 Mar 2010 09:11:06 -0000
@@ -0,0 +1,461 @@
+/*	$OpenBSD$	*/
+
+/*
+ * Copyright (c) 2010 Mikko Tolmunen <oskari@sefirosu.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/sensors.h>
+
+#include <machine/bus.h>
+
+#include <dev/isa/isareg.h>
+#include <dev/isa/isavar.h>
+#include <dev/isa/uguruvar.h>
+
+#ifdef UGURU_DEBUG
+int	uguru_dbg = 0;
+#define DPRINTF(lvl, fmt...)	\
+	if (uguru_dbg >= lvl)	\
+		printf(fmt);
+#else
+#define DPRINTF(lvl, fmt...)
+#endif
+
+#define UGURU_READ(sc, reg)	\
+    bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, (reg))
+#define UGURU_WRITE(sc, reg, val) \
+    bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
+
+int		 uguru_match(struct device *, void *, void *);
+void		 uguru_attach(struct device *, struct device *, void *);
+void		 uguru_refresh(void *);
+int		 uguru_read_sensor(struct uguru_softc *, int);
+int		 uguru_ac5_read_sensor(struct uguru_softc *, int);
+int		 uguru_ac5_read(struct uguru_softc *, uint16_t, void *, int);
+int		 uguru_write_multi(struct uguru_softc *, uint8_t, void *, int);
+int		 uguru_read_multi(struct uguru_softc *, void *, int);
+
+struct cfdriver uguru_cd = {
+	NULL, "uguru", DV_DULL
+};
+
+struct cfattach uguru_ca = {
+	sizeof(struct uguru_softc), uguru_match, uguru_attach
+};
+
+int
+uguru_match(struct device *parent, void *match, void *aux)
+{
+	struct isa_attach_args *ia = aux;
+	bus_space_tag_t iot;
+	bus_space_handle_t ioh;
+	int val;
+
+	iot = ia->ia_iot;
+	if (bus_space_map(iot, ia->ipa_io[0].base, UGURU_IOSIZE, 0, &ioh)) {
+		DPRINTF(0, ": can't map i/o space\n");
+		return 0;
+	}
+
+	bus_space_write_1(iot, ioh, UGURU_INDEX, UGURU_DUMMY);
+	DELAY(1000);
+	val = bus_space_read_1(iot, ioh, UGURU_DATA);
+	bus_space_unmap(iot, ioh, UGURU_IOSIZE);
+
+	/* acknowledgement after write */
+	if (val == 0xac)
+		goto match;
+
+	/*
+	 * XXX: assumption is made that the value is still the
+	 * power up default on AC2005.
+	 */
+	if (val == 0x55)
+		goto match;
+
+	return 0;
+
+match:	ia->ipa_nio = 1;
+	ia->ipa_io[0].length = UGURU_IOSIZE;
+	ia->ipa_nmem = 0;
+	ia->ipa_nirq = 0;
+	ia->ipa_ndrq = 0;
+	return 1;
+}
+
+void
+uguru_attach(struct device *parent, struct device *self, void *aux)
+{
+	struct uguru_softc *sc = (void *)self;
+	struct isa_attach_args *ia = aux;
+	struct uguru_sensor *sensors;
+	uint8_t data[9];
+	uint16_t vendid, devid, sysid;
+	int i;
+
+	sc->sc_iot = ia->ia_iot;
+	if (bus_space_map(sc->sc_iot, ia->ipa_io[0].base,
+	    UGURU_IOSIZE, 0, &sc->sc_ioh)) {
+		printf(": can't map i/o space\n");
+		return;
+	}
+
+	UGURU_WRITE(sc, UGURU_INDEX, UGURU_PRODID);
+	if (!uguru_read_multi(sc, &data, sizeof(data))) {
+		sc->read = uguru_read_sensor;
+		goto done;
+	}
+
+	/* AC2005 product ID */
+	if (!uguru_ac5_read(sc, 0x0904, &data, sizeof(data))) {
+		sc->read = uguru_ac5_read_sensor;
+		goto done;
+	}
+
+	printf("\n");
+	return;
+
+done:
+	DPRINTF(5, ": %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",
+	    data[0], data[1], data[2], data[3], data[4],
+	    data[5], data[6], data[7], data[8]);
+
+	vendid = data[0] << 8 | data[1];
+	devid = data[2] << 8 | data[3];
+	sysid = data[3] << 8 | data[7];
+
+	if (vendid != UGURU_VENDID_ABIT ||
+	    (devid != UGURU_DEVID1 &&
+	     devid != UGURU_DEVID2)) {
+		printf(": attach failed\n");
+		return;
+	}
+	printf(": AC%x", devid);
+
+	switch(sysid) {
+	case ABIT_SYSID_KV01:
+	case ABIT_SYSID_AI01:
+	case ABIT_SYSID_AN01:
+		printf(" KV1");
+		sensors = abitkv_sensors;
+		break;
+	case ABIT_SYSID_AA01:
+	case ABIT_SYSID_AG01:
+		printf(" AA1");
+		sensors = abitaa_sensors;
+		break;
+	case ABIT_SYSID_AV01:
+	case ABIT_SYSID_KVP1:
+		printf(" AV1");
+		sensors = abitav_sensors;
+		break;
+	case ABIT_SYSID_AS01:
+		printf(" AS1");
+		sensors = abitas_sensors;
+		break;
+	case ABIT_SYSID_AX01:
+		printf(" AX1");
+		sensors = abitax_sensors;
+		break;
+	case ABIT_SYSID_M401:
+		printf(" M41");
+		sensors = abitm4_sensors;
+		break;
+	case ABIT_SYSID_AN02:
+		printf(" AN1");
+		sensors = abitan_sensors;
+		break;
+	case ABIT_SYSID_AU01:
+	case ABIT_SYSID_AL01:
+	case ABIT_SYSID_BL01:
+		printf(" AL1");
+		sensors = abital_sensors;
+		break;
+	case ABIT_SYSID_AW01:
+	case ABIT_SYSID_AW02:
+		printf(" AW1");
+		sensors = abitaw_sensors;
+		break;
+	case ABIT_SYSID_NI01:
+		printf(" NI1");
+		sensors = abitni_sensors;
+		break;
+	case ABIT_SYSID_AT01:
+		printf(" AT1");
+		sensors = abitat_sensors;
+		break;
+	case ABIT_SYSID_AN03:
+		printf(" AN2");
+		sensors = abitan2_sensors;
+		break;
+	case ABIT_SYSID_AB01:
+		printf(" AB1");
+		sensors = abitab_sensors;
+		break;
+	case ABIT_SYSID_AN04:
+		printf(" AN3");
+		sensors = abitan3_sensors;
+		break;
+	case ABIT_SYSID_AW03:
+		printf(" AW2");
+		sensors = abitaw2_sensors;
+		break;
+	case ABIT_SYSID_AT02:
+		printf(" AT2");
+		sensors = abitat2_sensors;
+		break;
+	case ABIT_SYSID_AB02:
+	case ABIT_SYSID_IP01:
+	case ABIT_SYSID_IX01:
+	case ABIT_SYSID_IX02:
+		printf(" AB2");
+		sensors = abitab2_sensors;
+		break;
+	case ABIT_SYSID_IN01:
+		printf(" IN1");
+		sensors = abitin_sensors;
+		break;
+	default:
+		printf(" unknown system (ID 0x%.4x)\n", sysid);
+		return;
+	}
+	printf("\n");
+
+	strlcpy(sc->sc_sensordev.xname,
+	    sc->sc_dev.dv_xname,
+	    sizeof(sc->sc_sensordev.xname));
+
+	for (i = 0; sensors[i].desc != NULL; i++) {
+		strlcpy(sc->sc_sensors[i].desc,
+		    sensors[i].desc, sizeof(sc->sc_sensors[i].desc));
+		sc->sc_sensors[i].type = sensors[i].type;
+		sensor_attach(&sc->sc_sensordev, &sc->sc_sensors[i]);
+		sc->sc_numsensors++;
+	}
+	sc->uguru_sensors = sensors;
+
+	if (sensor_task_register(sc, uguru_refresh, UGURU_INTERVAL) == NULL) {
+		printf("%s: unable to register update task\n",
+		    sc->sc_sensordev.xname);
+		return;
+	}
+	sensordev_install(&sc->sc_sensordev);
+}
+
+void
+uguru_refresh(void *arg)
+{
+	struct uguru_softc *sc = (struct uguru_softc *)arg;
+	int i;
+
+	for (i = 0; i < sc->sc_numsensors; i++)
+		sc->uguru_sensors[i].refresh(sc, i);
+}
+
+void
+uguru_refresh_temp(struct uguru_softc *sc, int n)
+{
+	struct ksensor *sensor = &sc->sc_sensors[n];
+	int status = SENSOR_S_OK;
+	int ret;
+
+	ret = sc->read(sc, n);
+	if (sc->cs.reading == 0x00) {
+		sensor->flags |= SENSOR_FINVALID;
+		sensor->value = 0;
+		return;
+	}
+	sensor->flags &= ~SENSOR_FINVALID;
+	sensor->value = sc->cs.reading * 1000000 + 273150000;
+
+	if (ret)
+		status = SENSOR_S_UNSPEC;
+	else {
+		if (sc->cs.reading >= sc->cs.lower)
+			status = SENSOR_S_WARN;
+		if (sc->cs.reading >= sc->cs.upper)
+			status = SENSOR_S_CRIT;
+	}
+	sensor->status = status;
+}
+
+void
+uguru_refresh_volt(struct uguru_softc *sc, int n)
+{
+	int status = SENSOR_S_OK;
+
+	if (sc->read(sc, n))
+		status = SENSOR_S_UNSPEC;
+	else
+		if (sc->cs.reading <= sc->cs.lower ||
+		    sc->cs.reading >= sc->cs.upper)
+			status = SENSOR_S_CRIT;
+
+	sc->sc_sensors[n].value =
+	    sc->cs.reading * sc->uguru_sensors[n].rfact;
+	sc->sc_sensors[n].status = status;
+}
+
+void
+uguru_refresh_fan(struct uguru_softc *sc, int n)
+{
+	struct ksensor *sensor = &sc->sc_sensors[n];
+	int ret;
+
+	ret = sc->read(sc, n);
+	if (sc->cs.reading == 0x00) {
+		sensor->flags |= SENSOR_FINVALID;
+		sensor->value = 0;
+		return;
+	}
+	sensor->flags &= ~SENSOR_FINVALID;
+	sensor->value = sc->cs.reading * 60;
+
+	if (ret)
+		sensor->status = SENSOR_S_UNSPEC;
+	else
+		if (sc->cs.reading <= sc->cs.lower)
+			sensor->status = SENSOR_S_CRIT;
+		else
+			sensor->status = SENSOR_S_OK;
+}
+
+int
+uguru_read_sensor(struct uguru_softc *sc, int n)
+{
+	struct ksensor *sensor = &sc->sc_sensors[n];
+	uint8_t reg = sc->uguru_sensors[n].reg;
+	uint8_t idx, data[3];
+	uint8_t val = 0x00;
+	int count, ret = 0;
+
+	if (sensor->type == SENSOR_FANRPM)
+		idx = UGURU_FAN_DATA;
+	else
+		idx = UGURU_ITM_DATA;
+
+	/* sensor value */
+	if (uguru_write_multi(sc, idx, &reg, sizeof(reg)) ||
+	    uguru_read_multi(sc, &val, sizeof(val)))
+		++ret;
+
+	/* sensor status */
+	bzero(&data, sizeof(data));
+	count = sensor->type == SENSOR_FANRPM ? 2 : 3;
+
+	if (uguru_write_multi(sc, idx + 1, &reg, sizeof(reg)) ||
+	    uguru_read_multi(sc, &data, count))
+		++ret;
+
+	/* fill in current sensor structure */
+	sc->cs.reading = val;
+/*	sc->cs.flags = data[0]; */
+	sc->cs.lower = data[1];
+	sc->cs.upper = data[2];
+
+	DPRINTF(50, "0x%.2x: 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x\n",
+	    idx, reg, val, data[0], data[1], data[2]);
+
+	return (ret);
+}
+
+int
+uguru_ac5_read_sensor(struct uguru_softc *sc, int n)
+{
+	uint16_t reg;
+	uint8_t val = 0x00;
+	int ret = 1;
+
+	reg = sc->uguru_sensors[n].reg | 0x0880;
+	if (uguru_ac5_read(sc, reg, &val, sizeof(val)))
+		++ret;
+
+	sc->cs.reading = val;
+	return (ret);
+}
+
+int
+uguru_ac5_read(struct uguru_softc *sc, uint16_t reg, void *data, int count)
+{
+	uint8_t buf[3];
+
+	buf[0] = reg >> 8;
+	buf[1] = reg & 0xff;
+	buf[2] = count;
+
+	if (!uguru_write_multi(sc, 0x1a, &buf, sizeof(buf)) &&
+	    !uguru_read_multi(sc, data, count))
+		return 0;
+
+	DPRINTF(0, "uguru_ac5_read: timeout 0x%.2x 0x%.2x 0x%.2x\n",
+	    buf[0], buf[1], buf[2]);
+
+	return 1;
+}
+
+int
+uguru_write_multi(struct uguru_softc *sc, uint8_t idx, void *data, int count)
+{
+	uint8_t *inbuf = data;
+	int i, ntries;
+
+	UGURU_WRITE(sc, UGURU_INDEX, idx);
+
+	for (i = 0; i < count; ++i) {
+		/*
+		 * wait for non-busy status before write
+		 * to the data port.
+		 */
+		ntries = 0;
+		while (UGURU_READ(sc, UGURU_INDEX) >> 1 & 1) {
+			if (++ntries > 20)
+				goto timeout;
+			DELAY(5);
+		}
+		UGURU_WRITE(sc, UGURU_DATA, *inbuf++);
+	}
+	return 0;
+
+timeout:
+	DPRINTF(0, "uguru_write_multi: timeout 0x%.2x\n", idx);
+	return 1;
+}
+
+int
+uguru_read_multi(struct uguru_softc *sc, void *data, int count)
+{
+	uint8_t *outbuf = data;
+	int i, ntries;
+
+	for (i = 0; i < count; ++i) {
+		/*
+		 * wait for valid status before read
+		 * from the data port.
+		 */
+		ntries = 0;
+		while (!(UGURU_READ(sc, UGURU_INDEX) & 1)) {
+			if (++ntries > 40) {
+				DPRINTF(0, "uguru_read_multi: timeout\n");
+				return 1;
+			}
+			DELAY(35);
+		}
+		*outbuf++ = UGURU_READ(sc, UGURU_DATA);
+	}
+	return 0;
+}
Index: sys/dev/isa/uguruvar.h
===================================================================
RCS file: sys/dev/isa/uguruvar.h
diff -N sys/dev/isa/uguruvar.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/dev/isa/uguruvar.h	26 Mar 2010 09:11:06 -0000
@@ -0,0 +1,611 @@
+/*	$OpenBSD	*/
+
+/*
+ * Copyright (c) 2010 Mikko Tolmunen <oskari@sefirosu.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#define UGURU_DATA		0x00	/* configuration data register */
+#define UGURU_INDEX		0x04	/* configuration index register */
+
+#define UGURU_DUMMY		0x00	/* dummy zero bit */
+#define UGURU_ITM_DATA		0x21	/* temp/volt readings */
+#define UGURU_ITM_CTRL		0x22	/* temp/volt settings */
+#define UGURU_FAN_DATA		0x26	/* fan readings */
+#define UGURU_FAN_CTRL		0x27	/* fan settings */
+#define UGURU_PRODID		0x44	/* product ID */
+
+#define UGURU_VENDID_ABIT	0x147b	/* ABIT */
+#define UGURU_DEVID1		0x2003	/* AC2003 */
+#define UGURU_DEVID2		0x2005	/* AC2005 */
+
+#define ABIT_SYSID_KV01		0x0301
+#define ABIT_SYSID_AI01		0x0302
+#define ABIT_SYSID_AN01		0x0303
+#define ABIT_SYSID_AA01		0x0304
+#define ABIT_SYSID_AG01		0x0305
+#define ABIT_SYSID_AV01		0x0306
+#define ABIT_SYSID_KVP1		0x0307
+#define ABIT_SYSID_AS01		0x0308
+#define ABIT_SYSID_AX01		0x0309
+#define ABIT_SYSID_M401		0x030a
+#define ABIT_SYSID_AN02		0x030b
+#define ABIT_SYSID_AU01		0x050c
+#define ABIT_SYSID_AW01		0x050d
+#define ABIT_SYSID_AL01		0x050e
+#define ABIT_SYSID_BL01		0x050f
+#define ABIT_SYSID_NI01		0x0510
+#define ABIT_SYSID_AT01		0x0511
+#define ABIT_SYSID_AN03		0x0512
+#define ABIT_SYSID_AW02		0x0513
+#define ABIT_SYSID_AB01		0x0514
+#define ABIT_SYSID_AN04		0x0515
+#define ABIT_SYSID_AW03		0x0516
+#define ABIT_SYSID_AT02		0x0517
+#define ABIT_SYSID_AB02		0x0518
+#define ABIT_SYSID_IN01		0x0519
+#define ABIT_SYSID_IP01		0x051a
+#define ABIT_SYSID_IX01		0x051b
+#define ABIT_SYSID_IX02		0x051c
+
+#define UGURU_IOSIZE		0x02
+#define UGURU_INTERVAL		5
+#define UGURU_MAX_SENSORS	27
+
+#define RFACT_NONE		13700
+#define RFACT_NONE2		10000
+#define RFACT(x, y)		(RFACT_NONE * ((x) + (y)) / (y))
+#define RFACT2(x, y)		(RFACT_NONE2 * ((x) + (y)) / (y))
+
+struct uguru_softc {
+	struct device		 sc_dev;
+
+	bus_space_tag_t		 sc_iot;
+	bus_space_handle_t	 sc_ioh;
+
+	struct ksensor		 sc_sensors[UGURU_MAX_SENSORS];
+	struct ksensordev	 sc_sensordev;
+	int			 sc_numsensors;
+	struct uguru_sensor	*uguru_sensors;
+	struct {
+		uint8_t		 reading;
+/*		uint8_t		 flags; */
+		uint8_t		 lower;
+		uint8_t		 upper;
+	} cs;
+	int			(*read)(struct uguru_softc *, int);
+};
+
+struct uguru_sensor {
+	char			*desc;
+	enum sensor_type	 type;
+	void			(*refresh)(struct uguru_softc *, int);
+	uint8_t			 reg;
+	int			 rfact;
+};
+
+void	uguru_refresh_temp(struct uguru_softc *, int);
+void	uguru_refresh_volt(struct uguru_softc *, int);
+void	uguru_refresh_fan(struct uguru_softc *, int);
+
+#define UGURU_R_TEMP	uguru_refresh_temp
+#define UGURU_R_VOLT	uguru_refresh_volt
+#define UGURU_R_FAN	uguru_refresh_fan
+
+struct uguru_sensor abitkv_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 887) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitaa_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
+	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
+	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x0c },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 888) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
+	{ "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
+	{ "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitav_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
+	{ "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
+	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
+	{ "AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitas_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT(2800, 884) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
+	{ "+3.3VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(100, 402) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
+	{ "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
+	{ "NB/AGP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
+	{ "GMCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitax_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 888) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
+	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
+	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitm4_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
+	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x02 },
+	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x03 },
+	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x04 },
+	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x05 },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x13, RFACT(100, 402) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x12, RFACT(442, 560) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x11, RFACT(2800, 884) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x10, RFACT(442, 560) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
+	{ "FSBVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT_NONE },
+	{ "NB +2.5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
+	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
+	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitan_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x00 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x01 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x0f },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT(100, 402) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT(442, 560) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT(2800, 844) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT(442, 560) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT_NONE },
+	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE },
+	{ "MCP", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT_NONE },
+	{ "MCP SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT_NONE },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x00 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x01 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x02 },
+	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x05 },
+	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x04 },
+	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x03 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abital_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
+	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitaw_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
+	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
+	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
+	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x26 },
+	{ "AUX5", SENSOR_FANRPM, UGURU_R_FAN, 0x27 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitni_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitat_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "NB", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) },
+	{ "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 },
+	{ "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitan2_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitab_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT_NONE2 },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
+	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitan3_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "NB/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 },
+	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitaw2_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
+	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
+	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "MCH/PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT2(34, 34) },
+	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "NB", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+	{ "OTES1", SENSOR_FANRPM, UGURU_R_FAN, 0x26 },
+	{ "OTES2", SENSOR_FANRPM, UGURU_R_FAN, 0x27 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitat2_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+	{ "PWM", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVDDA", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT2(34, 34) },
+	{ "PCIE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT_NONE2 },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT_NONE2 },
+	{ "NB +1.8V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitab2_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
+	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
+	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
+	{ "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x00, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x01, RFACT2(34, 34) },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x02, RFACT_NONE2 },
+	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "ICHIO", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
+	{ "ICH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+	{ "MCH", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+
+	{ NULL }
+};
+
+struct uguru_sensor abitin_sensors[] = {
+	{ "CPU", SENSOR_TEMP, UGURU_R_TEMP, 0x18 },
+	{ "SYS", SENSOR_TEMP, UGURU_R_TEMP, 0x19 },
+	{ "PWM1", SENSOR_TEMP, UGURU_R_TEMP, 0x1a },
+	{ "PWM2", SENSOR_TEMP, UGURU_R_TEMP, 0x1b },
+	{ "PWM3", SENSOR_TEMP, UGURU_R_TEMP, 0x1c },
+	{ "PWM4", SENSOR_TEMP, UGURU_R_TEMP, 0x1d },
+	{ "PWM5", SENSOR_TEMP, UGURU_R_TEMP, 0x1e },
+
+	{ "VCORE", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x07, RFACT_NONE2 },
+	{ "+3.3V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0a, RFACT2(34, 34) },
+	{ "+5V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x09, RFACT2(120, 60) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0c, RFACT2(50, 10) },
+	{ "+12V", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x08, RFACT2(50, 10) },
+	{ "+5VSB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0b, RFACT2(120, 60) },
+	{ "DDR", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0d, RFACT2(34, 34) },
+	{ "DDRVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x0e, RFACT_NONE2 },
+	{ "CPUVTT", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x03, RFACT_NONE2 },
+	{ "HTV", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x05, RFACT_NONE2 },
+	{ "NB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x04, RFACT_NONE2 },
+	{ "SB", SENSOR_VOLTS_DC, UGURU_R_VOLT, 0x06, RFACT_NONE2 },
+
+	{ "CPU", SENSOR_FANRPM, UGURU_R_FAN, 0x20 },
+	{ "SYS", SENSOR_FANRPM, UGURU_R_FAN, 0x22 },
+	{ "AUX1", SENSOR_FANRPM, UGURU_R_FAN, 0x21 },
+	{ "AUX2", SENSOR_FANRPM, UGURU_R_FAN, 0x23 },
+	{ "AUX3", SENSOR_FANRPM, UGURU_R_FAN, 0x24 },
+	{ "AUX4", SENSOR_FANRPM, UGURU_R_FAN, 0x25 },
+
+	{ NULL }
+};

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic