summaryrefslogtreecommitdiff
path: root/sys/dev/isa/uguru.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2010-03-28 17:04:30 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2010-03-28 17:04:30 +0000
commita90bf08cd5f48a86c4a400323bb0a2050b77cc84 (patch)
treeb3b0c4d5af827c3eeb7dd53488692656d924e0f0 /sys/dev/isa/uguru.c
parentd57db2c5600004f5e28a025da6cf324c304510fc (diff)
Driver for microguru sensor microcontroller found on ABIT motherboards.
Driver written by Mikko Tolmunen <oskari@sefirosu.org>
Diffstat (limited to 'sys/dev/isa/uguru.c')
-rw-r--r--sys/dev/isa/uguru.c1059
1 files changed, 1059 insertions, 0 deletions
diff --git a/sys/dev/isa/uguru.c b/sys/dev/isa/uguru.c
new file mode 100644
index 00000000000..0966c9309c8
--- /dev/null
+++ b/sys/dev/isa/uguru.c
@@ -0,0 +1,1059 @@
+/* $OpenBSD: uguru.c,v 1.1 2010/03/28 17:04:29 deraadt Exp $ */
+
+/*
+ * 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>
+
+#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(iot, ioh, reg) \
+ bus_space_read_1((iot), (ioh), (reg))
+#define UGURU_WRITE(iot, ioh, reg, val) \
+ bus_space_write_1((iot), (ioh), (reg), (val))
+
+#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 0x08
+#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 }
+};
+
+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(bus_space_tag_t, bus_space_handle_t,
+ uint16_t, void *, int);
+int uguru_write_multi(bus_space_tag_t, bus_space_handle_t,
+ uint8_t, void *, int);
+int uguru_read_multi(bus_space_tag_t, bus_space_handle_t, 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;
+ uint8_t data[9];
+ uint16_t vendid, devid;
+ int ret = 0;
+
+ 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;
+ }
+
+ UGURU_WRITE(iot, ioh, UGURU_INDEX, UGURU_PRODID);
+ if (!uguru_read_multi(iot, ioh, &data, sizeof(data)) ||
+ !uguru_ac5_read(iot, ioh, 0x0904, &data, sizeof(data))) {
+ vendid = data[0] << 8 | data[1];
+ devid = data[2] << 8 | data[3];
+
+ if (vendid == UGURU_VENDID_ABIT &&
+ (devid == UGURU_DEVID1 ||
+ devid == UGURU_DEVID2)) {
+ ia->ipa_nio = 1;
+ ia->ipa_io[0].length = UGURU_IOSIZE;
+ ia->ipa_nmem = 0;
+ ia->ipa_nirq = 0;
+ ia->ipa_ndrq = 0;
+ ret = 1;
+ }
+ }
+ bus_space_unmap(iot, ioh, UGURU_IOSIZE);
+ return (ret);
+}
+
+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->sc_iot, sc->sc_ioh, UGURU_INDEX, UGURU_PRODID);
+ if (!uguru_read_multi(sc->sc_iot, sc->sc_ioh, &data, sizeof(data))) {
+ sc->read = uguru_read_sensor;
+ goto done;
+ }
+
+ /* AC2005 product ID */
+ if (!uguru_ac5_read(sc->sc_iot, sc->sc_ioh,
+ 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];
+ bus_space_tag_t iot = sc->sc_iot;
+ bus_space_handle_t ioh = sc->sc_ioh;
+ 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(iot, ioh, idx, &reg, sizeof(reg)) ||
+ uguru_read_multi(iot, ioh, &val, sizeof(val)))
+ ++ret;
+
+ /* sensor status */
+ bzero(&data, sizeof(data));
+ count = sensor->type == SENSOR_FANRPM ? 2 : 3;
+
+ if (uguru_write_multi(iot, ioh, idx + 1, &reg, sizeof(reg)) ||
+ uguru_read_multi(iot, ioh, &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->sc_iot, sc->sc_ioh, reg, &val, sizeof(val)))
+ ++ret;
+
+ sc->cs.reading = val;
+ return (ret);
+}
+
+int
+uguru_ac5_read(bus_space_tag_t iot, bus_space_handle_t ioh,
+ 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(iot, ioh, 0x1a, &buf, sizeof(buf)) &&
+ !uguru_read_multi(iot, ioh, 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(bus_space_tag_t iot, bus_space_handle_t ioh,
+ uint8_t idx, void *data, int count)
+{
+ uint8_t *inbuf = data;
+ int i, ntries;
+
+ UGURU_WRITE(iot, ioh, 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(iot, ioh, UGURU_INDEX) >> 1 & 1) {
+ if (++ntries > 20)
+ goto timeout;
+ DELAY(5);
+ }
+ UGURU_WRITE(iot, ioh, UGURU_DATA, *inbuf++);
+ }
+ return 0;
+
+timeout:
+ DPRINTF(0, "uguru_write_multi: timeout 0x%.2x\n", idx);
+ return 1;
+}
+
+int
+uguru_read_multi(bus_space_tag_t iot, bus_space_handle_t ioh,
+ 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(iot, ioh, UGURU_INDEX) & 1)) {
+ if (++ntries > 40) {
+ DPRINTF(0, "uguru_read_multi: timeout\n");
+ return 1;
+ }
+ DELAY(35);
+ }
+ *outbuf++ = UGURU_READ(iot, ioh, UGURU_DATA);
+ }
+ return 0;
+}