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 <cnst+net...@bugmail.mojo.ru> +.\" +.\" 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 <cnst+net...@bugmail.mojo.ru> + * + * 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 */