Module Name: src
Committed By: cnst
Date: Tue Feb 9 03:19:51 UTC 2010
Modified Files:
src/distrib/sets/lists/man: mi
src/share/man/man4: Makefile acpi.4
src/sys/arch/amd64/conf: GENERIC XEN3_DOM0
src/sys/arch/i386/conf: ALL GENERIC
src/sys/dev/acpi: files.acpi
src/usr.sbin/envstat: envstat.8
Added Files:
src/share/man/man4: aibs.4
src/sys/dev/acpi: atk0110.c
Log Message:
New aibs(4) driver for ASUSTeK AI Booster (ACPI ATK0110) hardware monitor
with limit support.
http://thread.gmane.org/gmane.os.netbsd.devel.kernel/35654
Reviewed by <pgoyette>, <jruoho> and <tech-kern>.
To generate a diff of this commit:
cvs rdiff -u -r1.1189 -r1.1190 src/distrib/sets/lists/man/mi
cvs rdiff -u -r1.503 -r1.504 src/share/man/man4/Makefile
cvs rdiff -u -r1.38 -r1.39 src/share/man/man4/acpi.4
cvs rdiff -u -r0 -r1.1 src/share/man/man4/aibs.4
cvs rdiff -u -r1.265 -r1.266 src/sys/arch/amd64/conf/GENERIC
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/amd64/conf/XEN3_DOM0
cvs rdiff -u -r1.234 -r1.235 src/sys/arch/i386/conf/ALL
cvs rdiff -u -r1.964 -r1.965 src/sys/arch/i386/conf/GENERIC
cvs rdiff -u -r0 -r1.1 src/sys/dev/acpi/atk0110.c
cvs rdiff -u -r1.66 -r1.67 src/sys/dev/acpi/files.acpi
cvs rdiff -u -r1.53 -r1.54 src/usr.sbin/envstat/envstat.8
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/man/mi
diff -u src/distrib/sets/lists/man/mi:1.1189 src/distrib/sets/lists/man/mi:1.1190
--- src/distrib/sets/lists/man/mi:1.1189 Sat Feb 6 20:15:54 2010
+++ src/distrib/sets/lists/man/mi Tue Feb 9 03:19:50 2010
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1189 2010/02/06 20:15:54 pgoyette Exp $
+# $NetBSD: mi,v 1.1190 2010/02/09 03:19:50 cnst Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -651,6 +651,7 @@
./usr/share/man/cat4/ahd.0 man-sys-catman .cat
./usr/share/man/cat4/ai.0 man-sys-catman .cat
./usr/share/man/cat4/aiboost.0 man-sys-catman .cat
+./usr/share/man/cat4/aibs.0 man-sys-catman .cat
./usr/share/man/cat4/aic.0 man-sys-catman .cat
./usr/share/man/cat4/akbd.0 man-sys-catman .cat
./usr/share/man/cat4/ale.0 man-sys-catman .cat
@@ -3332,6 +3333,7 @@
./usr/share/man/html4/ahd.html man-sys-htmlman html
./usr/share/man/html4/ai.html man-sys-htmlman html
./usr/share/man/html4/aiboost.html man-sys-htmlman html
+./usr/share/man/html4/aibs.html man-sys-htmlman html
./usr/share/man/html4/aic.html man-sys-htmlman html
./usr/share/man/html4/akbd.html man-sys-htmlman html
./usr/share/man/html4/ale.html man-sys-htmlman html
@@ -5713,6 +5715,7 @@
./usr/share/man/man4/ahd.4 man-sys-man .man
./usr/share/man/man4/ai.4 man-sys-man .man
./usr/share/man/man4/aiboost.4 man-sys-man .man
+./usr/share/man/man4/aibs.4 man-sys-man .man
./usr/share/man/man4/aic.4 man-sys-man .man
./usr/share/man/man4/akbd.4 man-sys-man .man
./usr/share/man/man4/ale.4 man-sys-man .man
Index: src/share/man/man4/Makefile
diff -u src/share/man/man4/Makefile:1.503 src/share/man/man4/Makefile:1.504
--- src/share/man/man4/Makefile:1.503 Sat Feb 6 20:11:33 2010
+++ src/share/man/man4/Makefile Tue Feb 9 03:19:50 2010
@@ -1,11 +1,11 @@
-# $NetBSD: Makefile,v 1.503 2010/02/06 20:11:33 pgoyette Exp $
+# $NetBSD: Makefile,v 1.504 2010/02/09 03:19:50 cnst Exp $
# @(#)Makefile 8.1 (Berkeley) 6/18/93
MAN= aac.4 ac97.4 acardide.4 aceride.4 acphy.4 acpidalb.4 \
adbbt.4 adbkbd.4 adbms.4 \
adc.4 admtemp.4 adv.4 adw.4 age.4 agp.4 agr.4 ahb.4 ahc.4 \
ahcisata.4 ahd.4 \
- aiboost.4 ale.4 alipm.4 altmem.4 amdpm.4 amdtemp.4 amhphy.4 \
+ aiboost.4 aibs.4 ale.4 alipm.4 altmem.4 amdpm.4 amdtemp.4 amhphy.4 \
amr.4 aps.4 \
an.4 arcmsr.4 aria.4 artsata.4 ata.4 atalk.4 ataraid.4 \
ath.4 atphy.4 atppc.4 attimer.4 atw.4 \
Index: src/share/man/man4/acpi.4
diff -u src/share/man/man4/acpi.4:1.38 src/share/man/man4/acpi.4:1.39
--- src/share/man/man4/acpi.4:1.38 Sat Feb 6 20:11:33 2010
+++ src/share/man/man4/acpi.4 Tue Feb 9 03:19:50 2010
@@ -1,4 +1,4 @@
-.\" $NetBSD: acpi.4,v 1.38 2010/02/06 20:11:33 pgoyette Exp $
+.\" $NetBSD: acpi.4,v 1.39 2010/02/09 03:19:50 cnst Exp $
.\"
.\" Copyright (c) 2002, 2004 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -42,6 +42,7 @@
.Cd "acpismbus* at acpi?"
.Cd "acpitz* at acpi?"
.Cd "aiboost* at acpi?"
+.Cd "aibs* at acpi?"
.Cd "asus* at acpi?"
.Cd "attimer* at acpi?"
.Cd "com* at acpi?"
@@ -201,6 +202,8 @@
thermal zones.
.It aiboost
ASUS AI Booster Hardware monitor.
+.It aibs
+ASUSTeK AI Booster ACPI ATK0110 voltage, temperature and fan sensor.
.It asus
ASUS laptop hotkeys.
.It attimer
@@ -392,6 +395,7 @@
.Xr acpismbus 4 ,
.Xr acpitz 4 ,
.Xr aiboost 4 ,
+.Xr aibs 4 ,
.Xr apm 4 ,
.Xr attimer 4 ,
.Xr com 4 ,
Index: src/sys/arch/amd64/conf/GENERIC
diff -u src/sys/arch/amd64/conf/GENERIC:1.265 src/sys/arch/amd64/conf/GENERIC:1.266
--- src/sys/arch/amd64/conf/GENERIC:1.265 Mon Feb 8 21:45:32 2010
+++ src/sys/arch/amd64/conf/GENERIC Tue Feb 9 03:19:50 2010
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.265 2010/02/08 21:45:32 pgoyette Exp $
+# $NetBSD: GENERIC,v 1.266 2010/02/09 03:19:50 cnst Exp $
#
# GENERIC machine description file
#
@@ -22,7 +22,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.265 $"
+#ident "GENERIC-$Revision: 1.266 $"
maxusers 64 # estimated number of users
@@ -283,6 +283,7 @@
# Mainboard devices
aiboost* at acpi? # ASUS AI Booster Hardware monitor
+aibs* at acpi? # ASUSTeK AI Booster hardware monitor
asus* at acpi? # ASUS hotkeys
attimer* at acpi? # AT Timer
#com* at acpi? # Serial communications interface
Index: src/sys/arch/amd64/conf/XEN3_DOM0
diff -u src/sys/arch/amd64/conf/XEN3_DOM0:1.48 src/sys/arch/amd64/conf/XEN3_DOM0:1.49
--- src/sys/arch/amd64/conf/XEN3_DOM0:1.48 Thu Dec 17 23:53:24 2009
+++ src/sys/arch/amd64/conf/XEN3_DOM0 Tue Feb 9 03:19:50 2010
@@ -1,4 +1,4 @@
-# $NetBSD: XEN3_DOM0,v 1.48 2009/12/17 23:53:24 jym Exp $
+# $NetBSD: XEN3_DOM0,v 1.49 2010/02/09 03:19:50 cnst Exp $
include "arch/amd64/conf/std.xen"
@@ -225,6 +225,7 @@
acpilid* at acpi? # ACPI Lid Switch
acpitz* at acpi? # ACPI Thermal Zone
aiboost* at acpi? # ASUS AI Booster Hardware monitor
+aibs* at acpi? # ASUSTeK AI Booster hardware monitor
hpqlb* at acpi? # HP Quick Launch Buttons
pckbc* at acpi? # PC keyboard controller
pcppi* at acpi? # AT-style speaker sound
Index: src/sys/arch/i386/conf/ALL
diff -u src/sys/arch/i386/conf/ALL:1.234 src/sys/arch/i386/conf/ALL:1.235
--- src/sys/arch/i386/conf/ALL:1.234 Mon Feb 8 21:45:31 2010
+++ src/sys/arch/i386/conf/ALL Tue Feb 9 03:19:50 2010
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.234 2010/02/08 21:45:31 pgoyette Exp $
+# $NetBSD: ALL,v 1.235 2010/02/09 03:19:50 cnst Exp $
# From NetBSD: GENERIC,v 1.787 2006/10/01 18:37:54 bouyer Exp
#
# ALL machine description file
@@ -17,7 +17,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "ALL-$Revision: 1.234 $"
+#ident "ALL-$Revision: 1.235 $"
maxusers 64 # estimated number of users
@@ -375,6 +375,7 @@
# Mainboard devices
aiboost* at acpi? # ASUS AI Booster Hardware Monitor
+aibs* at acpi? # ASUSTeK AI Booster hardware monitor
asus* at acpi? # ASUS hotkeys
attimer* at acpi? # AT Timer
com* at acpi? # Serial communications interface
Index: src/sys/arch/i386/conf/GENERIC
diff -u src/sys/arch/i386/conf/GENERIC:1.964 src/sys/arch/i386/conf/GENERIC:1.965
--- src/sys/arch/i386/conf/GENERIC:1.964 Mon Feb 8 21:45:31 2010
+++ src/sys/arch/i386/conf/GENERIC Tue Feb 9 03:19:50 2010
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.964 2010/02/08 21:45:31 pgoyette Exp $
+# $NetBSD: GENERIC,v 1.965 2010/02/09 03:19:50 cnst Exp $
#
# GENERIC machine description file
#
@@ -22,7 +22,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.964 $"
+#ident "GENERIC-$Revision: 1.965 $"
maxusers 64 # estimated number of users
@@ -364,6 +364,7 @@
# Mainboard devices
aiboost* at acpi? # ASUS AI Booster Hardware Monitor
+aibs* at acpi? # ASUSTeK AI Booster hardware monitor
asus* at acpi? # ASUS hotkeys
attimer* at acpi? # AT Timer
#com* at acpi? # Serial communications interface
Index: src/sys/dev/acpi/files.acpi
diff -u src/sys/dev/acpi/files.acpi:1.66 src/sys/dev/acpi/files.acpi:1.67
--- src/sys/dev/acpi/files.acpi:1.66 Sat Feb 6 20:10:18 2010
+++ src/sys/dev/acpi/files.acpi Tue Feb 9 03:19:51 2010
@@ -1,4 +1,4 @@
-# $NetBSD: files.acpi,v 1.66 2010/02/06 20:10:18 pgoyette Exp $
+# $NetBSD: files.acpi,v 1.67 2010/02/09 03:19:51 cnst Exp $
include "dev/acpi/acpica/files.acpica"
@@ -156,6 +156,11 @@
attach acpiwmi at acpinodebus
file dev/acpi/wmi_acpi.c acpiwmi
+# ASUSTeK AI Booster ATK0110
+device aibs: sysmon_envsys
+attach aibs at acpinodebus
+file dev/acpi/atk0110.c aibs
+
# ACPI SMBus controller
device acpismbus: i2cbus
attach acpismbus at acpinodebus
Index: src/usr.sbin/envstat/envstat.8
diff -u src/usr.sbin/envstat/envstat.8:1.53 src/usr.sbin/envstat/envstat.8:1.54
--- src/usr.sbin/envstat/envstat.8:1.53 Sat Jan 30 08:57:49 2010
+++ src/usr.sbin/envstat/envstat.8 Tue Feb 9 03:19:51 2010
@@ -1,4 +1,4 @@
-.\" $NetBSD: envstat.8,v 1.53 2010/01/30 08:57:49 wiz Exp $
+.\" $NetBSD: envstat.8,v 1.54 2010/02/09 03:19:51 cnst Exp $
.\"
.\" Copyright (c) 2000, 2007, 2008, 2009 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -178,6 +178,7 @@
.Xr acpitz 4 ,
.Xr admtemp 4 ,
.Xr aiboost 4 ,
+.Xr aibs 4 ,
.Xr amdtemp 4 ,
.Xr aps 4 ,
.Xr arcmsr 4 ,
Added files:
Index: src/share/man/man4/aibs.4
diff -u /dev/null src/share/man/man4/aibs.4:1.1
--- /dev/null Tue Feb 9 03:19:51 2010
+++ src/share/man/man4/aibs.4 Tue Feb 9 03:19:50 2010
@@ -0,0 +1,246 @@
+.\" $NetBSD: aibs.4,v 1.1 2010/02/09 03:19:50 cnst Exp $
+.\" $OpenBSD: aibs.4,v 1.4 2009/07/30 06:30:45 jmc Exp $
+.\"
+.\" Copyright (c) 2009 Constantine A. Murenin <[email protected]>
+.\"
+.\" 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 December 30, 2009
+.Dt AIBS 4
+.Os
+.Sh NAME
+.Nm aibs
+.Nd "ASUSTeK AI Booster ACPI ATK0110 voltage, temperature and fan sensor"
+.Sh SYNOPSIS
+.Cd "aibs* at acpi?"
+.Sh DESCRIPTION
+The
+.Nm
+driver provides support for the voltage, temperature and fan sensors
+available through the
+.Tn ATK0110
+.Tn ASOC
+.Tn ACPI
+device
+on
+.Tn ASUSTeK
+motherboards.
+The number of sensors of each type,
+as well as the description of each sensor,
+varies according to the motherboard.
+.Pp
+The driver supports an arbitrary set of sensors,
+provides descriptions regarding what each sensor is used for,
+and reports whether each sensor is within the specifications
+as defined by the motherboard manufacturer through
+.Tn ACPI .
+.Pp
+The
+.Nm
+driver supports
+.Xr envsys 4
+sensor states as follows:
+.Bl -bullet
+.It
+Voltage sensors can have a state of
+.Dv valid ,
+.Dv critunder
+or
+.Dv critover ;
+temperature sensors can have a state of
+.Dv valid ,
+.Dv warnover ,
+.Dv critover
+or
+.Dv invalid ;
+and fan sensors can have a state of
+.Dv valid ,
+.Dv warnunder
+or
+.Dv warnover .
+.It
+Temperature sensors that have a reading of 0
+are marked
+.Dv invalid ,
+whereas all other sensors are always assumed valid.
+.It
+Voltage sensors have a lower and an upper limit
+.Dv ( critunder
+and
+.Dv critover ) ,
+temperature sensors have two upper limits
+.Dv ( warnover
+and
+.Dv critover ) ,
+whereas fan sensors may either have only the lower limit
+.Dv ( warnunder ) ,
+or, depending on the
+.Tn DSDT ,
+one lower and one upper limit
+.Dv ( warnunder
+and
+.Dv warnover ) .
+.El
+.Pp
+Sensor values and limits are made available through the
+.Xr envsys 4
+interface,
+and can be monitored with
+.Xr envstat 8 .
+For example, on an ASUS V3-P5G965 barebone:
+.Bd -literal -offset indent
+$ envstat -d aibs0
+ Current CritMax CritMin CritCap Unit
+ Vcore Voltage: 1.152 1.600 0.850 V
+ +3.3 Voltage: 3.312 3.630 2.970 V
+ +5 Voltage: 5.017 5.500 4.500 V
+ +12 Voltage: 12.302 13.800 10.200 V
+ CPU Temperature: 24.000 95.000 degC
+ MB Temperature: 57.000 95.000 degC
+ CPU FAN Speed: 865 RPM
+CHASSIS FAN Speed: 0 RPM
+.Pp
+$ envstat -W -d aibs0
+ Current WarnMax WarnMin WarnCap Unit
+ Vcore Voltage: 1.152 V
+ +3.3 Voltage: 3.312 V
+ +5 Voltage: 5.017 V
+ +12 Voltage: 12.302 V
+ CPU Temperature: 24.000 80.000 degC
+ MB Temperature: 57.000 60.000 degC
+ CPU FAN Speed: 865 7200 600 RPM
+CHASSIS FAN Speed: 0 7200 700 RPM
+.Ed
+.Pp
+Generally, sensors provided by the
+.Nm
+driver may also be supported by a variety of other drivers,
+such as
+.Xr lm 4
+or
+.Xr itesio 4 .
+The precise collection of
+.Nm
+sensors is comprised of the sensors
+specifically utilised in the motherboard
+design, which may be supported through
+a combination of one or more physical hardware monitoring chips.
+.Pp
+The
+.Nm
+driver, however, provides the following advantages
+when compared to the native hardware monitoring drivers:
+.Bl -bullet
+.It
+Sensor values from
+.Nm
+are expected to be more reliable.
+For example, voltage sensors in many hardware monitoring chips
+can only sense voltage from 0 to 2 or 4 volts, and the excessive
+voltage is removed by the resistors, which may vary with the motherboard
+and with the voltage that is being sensed.
+In
+.Nm ,
+the required resistor factors are provided by
+the motherboard manufacturer through
+.Tn ACPI ;
+in the native drivers, the resistor factors
+are encoded into the driver based on the chip manufacturer's recommendations.
+In essence, sensor values from
+.Nm
+are very likely to be identical to the readings from the
+Hardware Monitor screen in the BIOS.
+.It
+Sensor descriptions from
+.Nm
+are more likely to match the markings on the motherboard.
+.It
+Sensor states are supported by
+.Nm .
+The state is reported based on the acceptable range of values
+for each individual sensor as suggested by the motherboard manufacturer.
+For example, the threshold for the CPU temperature sensor is likely
+to be significantly higher than that for the chassis temperature sensor.
+.It
+Support for newer chips in
+.Nm .
+Newer chips may miss a native driver,
+but should be supported through
+.Nm
+regardless.
+.El
+.Pp
+As a result, sensor readings from the actual
+native hardware monitoring drivers
+are redundant when
+.Nm
+is present, and
+may be ignored as appropriate.
+Whereas on
+.Ox
+the native drivers have to be specifically disabled should
+their presence be judged unnecessary,
+on
+.Dx
+the
+.Xr lm 4
+and
+.Xr it 4
+are not probed provided that
+.Xr acpi 4
+is configured and the system potentially supports
+the hardware monitoring chip through
+.Tn ACPI .
+.Sh SEE ALSO
+.Xr envsys 4 ,
+.Xr envstat 8
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Ox 4.7 ,
+DragonFly 2.4.1
+and
+.Nx 6.0 .
+.Pp
+An earlier version of the driver,
+.Nm aiboost ,
+first appeared in
+.Fx 7.0
+and
+.Nx 5.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+driver was written for
+.Ox ,
+DragonFly
+and
+.Nx
+by
+.An Constantine A. Murenin Aq http://cnst.su/ ,
+David R. Cheriton School of Computer Science,
+University of Waterloo.
+.Pp
+An earlier version of the driver, named
+.Nm aiboost ,
+was written for
+.Fx
+by
+.An Takanori Watanabe
+and
+adapted to
+.Nx
+by
+.An Juan Romero Pardines .
Index: src/sys/dev/acpi/atk0110.c
diff -u /dev/null src/sys/dev/acpi/atk0110.c:1.1
--- /dev/null Tue Feb 9 03:19:51 2010
+++ src/sys/dev/acpi/atk0110.c Tue Feb 9 03:19:51 2010
@@ -0,0 +1,450 @@
+/* $NetBSD: atk0110.c,v 1.1 2010/02/09 03:19:51 cnst Exp $ */
+/* $OpenBSD: atk0110.c,v 1.1 2009/07/23 01:38:16 cnst Exp $ */
+
+/*
+ * Copyright (c) 2009 Constantine A. Murenin <[email protected]>
+ *
+ * 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/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: atk0110.c,v 1.1 2010/02/09 03:19:51 cnst Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+
+#include <dev/sysmon/sysmonvar.h>
+
+#include "acpi.h"
+#include "acpivar.h"
+
+/*
+ * ASUSTeK AI Booster (ACPI ASOC ATK0110).
+ *
+ * This code was originally written for OpenBSD after the techniques
+ * described in the Linux's asus_atk0110.c and FreeBSD's acpi_aiboost.c
+ * were verified to be accurate on the actual hardware kindly provided by
+ * Sam Fourman Jr. It was subsequently ported from OpenBSD to DragonFly BSD,
+ * and then to the NetBSD's sysmon_envsys(9) framework.
+ *
+ * -- Constantine A. Murenin <http://cnst.su/>
+ */
+
+#define AIBS_MORE_SENSORS
+#define AIBS_MONLIMITS
+
+struct aibs_sensor {
+ envsys_data_t s;
+ int64_t i;
+ int64_t l;
+ int64_t h;
+};
+
+struct aibs_softc {
+ struct acpi_devnode *sc_node;
+
+ struct aibs_sensor *sc_asens_volt;
+ struct aibs_sensor *sc_asens_temp;
+ struct aibs_sensor *sc_asens_fan;
+
+ struct sysmon_envsys *sc_sme;
+};
+
+static int aibs_match(device_t, cfdata_t, void *);
+static void aibs_attach(device_t, device_t, void *);
+static int aibs_detach(device_t, int);
+static void aibs_refresh(struct sysmon_envsys *, envsys_data_t *);
+#ifdef AIBS_MONLIMITS
+static void aibs_get_limits(struct sysmon_envsys *, envsys_data_t *,
+ sysmon_envsys_lim_t *);
+#endif
+
+static void aibs_attach_sif(device_t, enum envsys_units);
+
+CFATTACH_DECL_NEW(aibs, sizeof(struct aibs_softc),
+ aibs_match, aibs_attach, aibs_detach, NULL);
+
+static const char* const aibs_hid[] = {
+ "ATK0110",
+ NULL
+};
+
+static int
+aibs_match(device_t parent, cfdata_t match, void *aux)
+{
+ struct acpi_attach_args *aa = aux;
+
+ if(aa->aa_node->ad_type != ACPI_TYPE_DEVICE)
+ return 0;
+
+ /* successful match supersedes aiboost(4) */
+ return acpi_match_hid(aa->aa_node->ad_devinfo, aibs_hid) * 2;
+}
+
+static void
+aibs_attach(device_t parent, device_t self, void *aux)
+{
+ struct aibs_softc *sc = device_private(self);
+ struct acpi_attach_args *aa = aux;
+ int err;
+
+ sc->sc_node = aa->aa_node;
+
+ aprint_naive(": ASUSTeK AI Booster\n");
+ aprint_normal(": ASUSTeK AI Booster\n");
+
+ sc->sc_sme = sysmon_envsys_create();
+ sc->sc_sme->sme_name = device_xname(self);
+ sc->sc_sme->sme_cookie = sc;
+ sc->sc_sme->sme_refresh = aibs_refresh;
+#ifdef AIBS_MONLIMITS
+ sc->sc_sme->sme_get_limits = aibs_get_limits;
+#endif
+
+ aibs_attach_sif(self, ENVSYS_SVOLTS_DC);
+ aibs_attach_sif(self, ENVSYS_STEMP);
+ aibs_attach_sif(self, ENVSYS_SFANRPM);
+
+ if (sc->sc_sme->sme_nsensors == 0) {
+ aprint_error_dev(self, "no sensors found\n");
+ sysmon_envsys_destroy(sc->sc_sme);
+ return;
+ }
+
+ if ((err = sysmon_envsys_register(sc->sc_sme))) {
+ aprint_error_dev(self, "unable to register with sysmon: %d\n",
+ err);
+ if (sc->sc_asens_volt != NULL)
+ free(sc->sc_asens_volt, M_DEVBUF);
+ if (sc->sc_asens_temp != NULL)
+ free(sc->sc_asens_temp, M_DEVBUF);
+ if (sc->sc_asens_fan != NULL)
+ free(sc->sc_asens_fan, M_DEVBUF);
+ return;
+ }
+}
+
+static void
+aibs_attach_sif(device_t self, enum envsys_units st)
+{
+ struct aibs_softc *sc = device_private(self);
+ ACPI_STATUS s;
+ ACPI_BUFFER b;
+ ACPI_OBJECT *bp, *o;
+ int i, n;
+ char name[] = "?SIF";
+ struct aibs_sensor *as;
+
+ switch (st) {
+ case ENVSYS_STEMP:
+ name[0] = 'T';
+ break;
+ case ENVSYS_SFANRPM:
+ name[0] = 'F';
+ break;
+ case ENVSYS_SVOLTS_DC:
+ name[0] = 'V';
+ break;
+ default:
+ return;
+ }
+
+ b.Length = ACPI_ALLOCATE_BUFFER;
+ s = AcpiEvaluateObjectTyped(sc->sc_node->ad_handle, name, NULL, &b,
+ ACPI_TYPE_PACKAGE);
+ if (ACPI_FAILURE(s)) {
+ aprint_error_dev(self, "%s not found\n", name);
+ return;
+ }
+
+ bp = b.Pointer;
+ o = bp->Package.Elements;
+ if (o[0].Type != ACPI_TYPE_INTEGER) {
+ aprint_error_dev(self, "%s[0]: invalid type\n", name);
+ AcpiOsFree(b.Pointer);
+ return;
+ }
+
+ n = o[0].Integer.Value;
+ if (bp->Package.Count - 1 < n) {
+ aprint_error_dev(self, "%s: invalid package\n", name);
+ AcpiOsFree(b.Pointer);
+ return;
+ } else if (bp->Package.Count - 1 > n) {
+ int on = n;
+
+#ifdef AIBS_MORE_SENSORS
+ n = bp->Package.Count - 1;
+#endif
+ aprint_error_dev(self, "%s: misformed package: %i/%i"
+ ", assume %i\n", name, on, bp->Package.Count - 1, n);
+ }
+ if (n < 1) {
+ aprint_error_dev(self, "%s: no members in the package\n",
+ name);
+ AcpiOsFree(b.Pointer);
+ return;
+ }
+
+ as = malloc(sizeof(*as) * n, M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (as == NULL) {
+ aprint_error_dev(self, "%s: malloc fail\n", name);
+ AcpiOsFree(b.Pointer);
+ return;
+ }
+ switch (st) {
+ case ENVSYS_STEMP:
+ sc->sc_asens_temp = as;
+ break;
+ case ENVSYS_SFANRPM:
+ sc->sc_asens_fan = as;
+ break;
+ case ENVSYS_SVOLTS_DC:
+ sc->sc_asens_volt = as;
+ break;
+ default:
+ /* NOTREACHED */
+ return;
+ }
+
+ for (i = 0, o++; i < n; i++, o++) {
+ ACPI_OBJECT *oi;
+
+ /* acpica5 automatically evaluates the referenced package */
+ if(o[0].Type != ACPI_TYPE_PACKAGE) {
+ aprint_error_dev(self,
+ "%s: %i: not a package: %i type\n",
+ name, i, o[0].Type);
+ continue;
+ }
+ oi = o[0].Package.Elements;
+ if (o[0].Package.Count != 5 ||
+ oi[0].Type != ACPI_TYPE_INTEGER ||
+ oi[1].Type != ACPI_TYPE_STRING ||
+ oi[2].Type != ACPI_TYPE_INTEGER ||
+ oi[3].Type != ACPI_TYPE_INTEGER ||
+ oi[4].Type != ACPI_TYPE_INTEGER) {
+ aprint_error_dev(self,
+ "%s: %i: invalid package\n",
+ name, i);
+ continue;
+ }
+ as[i].i = oi[0].Integer.Value;
+ strlcpy(as[i].s.desc, oi[1].String.Pointer,
+ sizeof(as[i].s.desc));
+ as[i].l = oi[2].Integer.Value;
+ as[i].h = oi[3].Integer.Value;
+ as[i].s.units = st;
+#ifdef AIBS_MONLIMITS
+ as[i].s.flags |= ENVSYS_FMONLIMITS;
+ as[i].s.monitor = true;
+#endif
+ aprint_verbose_dev(self, "%c%i: "
+ "0x%08llx %20s %5lli / %5lli 0x%llx\n",
+ name[0], i,
+ as[i].i, as[i].s.desc, as[i].l, as[i].h,
+ oi[4].Integer.Value);
+ sysmon_envsys_sensor_attach(sc->sc_sme, &as[i].s);
+ }
+
+ AcpiOsFree(b.Pointer);
+ return;
+}
+
+static int
+aibs_detach(device_t self, int flags)
+{
+ struct aibs_softc *sc = device_private(self);
+
+ sysmon_envsys_unregister(sc->sc_sme);
+ if (sc->sc_asens_volt != NULL)
+ free(sc->sc_asens_volt, M_DEVBUF);
+ if (sc->sc_asens_temp != NULL)
+ free(sc->sc_asens_temp, M_DEVBUF);
+ if (sc->sc_asens_fan != NULL)
+ free(sc->sc_asens_fan, M_DEVBUF);
+ return 0;
+}
+
+static void
+aibs_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+ struct aibs_softc *sc = sme->sme_cookie;
+ device_t self = sc->sc_node->ad_device;
+ envsys_data_t *s = edata;
+ enum envsys_units st = s->units;
+ ACPI_STATUS rs;
+ ACPI_OBJECT p, *bp;
+ ACPI_OBJECT_LIST mp;
+ ACPI_BUFFER b;
+ int i;
+ const char *name;
+ struct aibs_sensor *as;
+ int64_t v;
+ int64_t l, h;
+
+ switch (st) {
+ case ENVSYS_STEMP:
+ name = "RTMP";
+ as = sc->sc_asens_temp;
+ break;
+ case ENVSYS_SFANRPM:
+ name = "RFAN";
+ as = sc->sc_asens_fan;
+ break;
+ case ENVSYS_SVOLTS_DC:
+ name = "RVLT";
+ as = sc->sc_asens_volt;
+ break;
+ default:
+ return;
+ }
+ if (as == NULL)
+ return;
+ for (i = 0; as[i].s.sensor != s->sensor; i++)
+ ;
+ l = as[i].l;
+ h = as[i].h;
+
+ p.Type = ACPI_TYPE_INTEGER;
+ p.Integer.Value = as[i].i;
+ mp.Count = 1;
+ mp.Pointer = &p;
+ b.Length = ACPI_ALLOCATE_BUFFER;
+ rs = AcpiEvaluateObjectTyped(sc->sc_node->ad_handle, name, &mp, &b,
+ ACPI_TYPE_INTEGER);
+ if (ACPI_FAILURE(rs)) {
+ aprint_debug_dev(self,
+ "%s: %i: evaluation failed\n",
+ name, i);
+ s->state = ENVSYS_SINVALID;
+ s->flags |= ENVSYS_FMONNOTSUPP;
+ return;
+ }
+ bp = b.Pointer;
+ v = bp->Integer.Value;
+ AcpiOsFree(b.Pointer);
+
+ switch (st) {
+ case ENVSYS_STEMP:
+ s->value_cur = v * 100 * 1000 + 273150000;
+ if (v == 0) {
+ s->state = ENVSYS_SINVALID;
+ s->flags |= ENVSYS_FMONNOTSUPP;
+ } else {
+ if (v > h)
+ s->state = ENVSYS_SCRITOVER;
+ else if (v > l)
+ s->state = ENVSYS_SWARNOVER;
+ else
+ s->state = ENVSYS_SVALID;
+ s->flags &= ~ENVSYS_FMONNOTSUPP;
+ }
+ break;
+ case ENVSYS_SFANRPM:
+ s->value_cur = v;
+ /* some boards have strange limits for fans */
+ if (l == 0) {
+ if (v < h)
+ s->state = ENVSYS_SWARNUNDER;
+ else
+ s->state = ENVSYS_SVALID;
+ } else {
+ if (l > v)
+ s->state = ENVSYS_SWARNUNDER;
+ else if (v > h)
+ s->state = ENVSYS_SWARNOVER;
+ else
+ s->state = ENVSYS_SVALID;
+ }
+ s->flags &= ~ENVSYS_FMONNOTSUPP;
+ break;
+ case ENVSYS_SVOLTS_DC:
+ s->value_cur = v * 1000;
+ if (l > v)
+ s->state = ENVSYS_SCRITUNDER;
+ else if (v > h)
+ s->state = ENVSYS_SCRITOVER;
+ else
+ s->state = ENVSYS_SVALID;
+ s->flags &= ~ENVSYS_FMONNOTSUPP;
+ break;
+ default:
+ /* NOTREACHED */
+ break;
+ }
+}
+
+#ifdef AIBS_MONLIMITS
+static void
+aibs_get_limits(struct sysmon_envsys *sme, envsys_data_t *edata,
+ sysmon_envsys_lim_t *limits)
+{
+ struct aibs_softc *sc = sme->sme_cookie;
+ envsys_data_t *s = edata;
+ sysmon_envsys_lim_t *li = limits;
+ enum envsys_units st = s->units;
+ int i;
+ struct aibs_sensor *as;
+ int64_t l, h;
+
+ switch (st) {
+ case ENVSYS_STEMP:
+ as = sc->sc_asens_temp;
+ break;
+ case ENVSYS_SFANRPM:
+ as = sc->sc_asens_fan;
+ break;
+ case ENVSYS_SVOLTS_DC:
+ as = sc->sc_asens_volt;
+ break;
+ default:
+ return;
+ }
+ if (as == NULL)
+ return;
+ for (i = 0; as[i].s.sensor != s->sensor; i++)
+ ;
+ l = as[i].l;
+ h = as[i].h;
+
+ switch (st) {
+ case ENVSYS_STEMP:
+ li->sel_critmax = h * 100 * 1000 + 273150000;
+ li->sel_warnmax = l * 100 * 1000 + 273150000;
+ li->sel_flags = PROP_CRITMAX | PROP_WARNMAX;
+ break;
+ case ENVSYS_SFANRPM:
+ /* some boards have strange limits for fans */
+ if (l == 0) {
+ li->sel_warnmin = h;
+ li->sel_flags = PROP_WARNMIN;
+ } else {
+ li->sel_warnmin = l;
+ li->sel_warnmax = h;
+ li->sel_flags = PROP_WARNMIN | PROP_WARNMAX;
+ }
+ break;
+ case ENVSYS_SVOLTS_DC:
+ li->sel_critmin = l * 1000;
+ li->sel_critmax = h * 1000;
+ li->sel_flags = PROP_CRITMIN | PROP_CRITMAX;
+ break;
+ default:
+ /* NOTREACHED */
+ break;
+ }
+}
+#endif /* AIBS_MONLIMITS */