From owner-freebsd-drivers@FreeBSD.ORG Mon Apr 5 06:12:11 2010 Return-Path: Delivered-To: freebsd-drivers@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 51999106566B; Mon, 5 Apr 2010 06:12:11 +0000 (UTC) (envelope-from cnst@FreeBSD.org) Received: from hita.home.const.name (dale.cnst.cs.uwaterloo.ca [129.97.7.219]) by mx1.freebsd.org (Postfix) with ESMTP id A286E8FC08; Mon, 5 Apr 2010 06:12:10 +0000 (UTC) Received: from hita.home.const.name (localhost [127.0.0.1]) by hita.home.const.name (8.14.3/8.14.3) with ESMTP id o355xmup004035; Mon, 5 Apr 2010 01:59:48 -0400 (EDT) (envelope-from cnst@FreeBSD.org) Received: (from constant@localhost) by hita.home.const.name (8.14.3/8.14.3/Submit) id o355xmnn004034; Mon, 5 Apr 2010 01:59:48 -0400 (EDT) (envelope-from cnst@FreeBSD.org) X-Authentication-Warning: hita.home.const.name: constant set sender to cnst@FreeBSD.org using -f Date: Mon, 5 Apr 2010 01:59:47 -0400 From: "Constantine A. Murenin" To: freebsd-acpi@FreeBSD.org, freebsd-drivers@FreeBSD.org, freebsd-hardware@FreeBSD.org Message-ID: <20100405055947.GA3544@hita.home.const.name> Mail-Followup-To: freebsd-acpi@FreeBSD.org, cnst@FreeBSD.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="SLDf9lqlvOQaIe6s" Content-Disposition: inline User-Agent: Mutt/1.4.2.3i Organization: David R. Cheriton School of Computer Science, Faculty of Mathematics, University of Waterloo X-Postal-Address: Constantine A. Murenin, David R. Cheriton School of Computer Science, University of Waterloo, 200 University Avenue West, Waterloo, Ontario N2L 3G1 Canada X-Office-Phone: +1-519-888-4567 x33581 X-Mobile-Phone: +1-K1W-ST1-CNST X-WWW: http://Constantine.SU/ X-LinkedIn: http://www.linkedin.com/in/mureninc X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: "Constantine A. Murenin" Subject: aibs(4): ASUSTeK AI Booster (ACPI ATK0110) Hardware Monitor X-BeenThere: freebsd-drivers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Writing device drivers for FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Apr 2010 06:12:11 -0000 --SLDf9lqlvOQaIe6s Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline Dear freebsd-{acpi,drivers,hardware}@, Attached patch provides support for the hardware monitoring capabilities that are present in many modern desktop motherboards from ASUS featuring the ATK0110 ACPI device. This driver, aibs(4), is a fresh replacement for FreeBSD's existing acpi_aiboost(4). The new aibs(4) driver has the following advantages when compared to the old acpi_aiboost(4): * the sensors are now provided through the user-serviceable hw.acpi.aibs0 tree (with a subtree for each sensor type), instead of the Newbus-internal dev.acpi_aiboost.0 tree that contains various nonprime data at the same level as the actual sensors * the supposed range specifications are now reported for each input that is being sensed * the nature of the new tree, with "volt", "temp" and "fan" subtrees, allows one to specifically query for the sensors of a certain type * the temperature sensors are exported in the temperature 'K' units through sysctl(9), such that they are pretty-printed by sysctl(8) automatically * more user documentation is provided It is expected that aibs(4) should replace any and all functionality previously provided by acpi_aiboost(4), provide additional features as specified above and decrease the size of both the source and the binary code. Please find the demonstration below. > ll /usr/c/src/sys/dev/acpi_support/{acpi_aiboost,atk0110}.c -rw-r--r-- 1 constant wheel 8919 Apr 3 20:31 /usr/c/src/sys/dev/acpi_support/acpi_aiboost.c -rw-r--r-- 1 constant wheel 8638 Apr 4 17:34 /usr/c/src/sys/dev/acpi_support/atk0110.c > ll /boot/kernel/*aib*s* -r-xr-xr-x 1 root wheel 11581 Apr 4 18:24 /boot/kernel/acpi_aiboost.ko -r-xr-xr-x 1 root wheel 24504 Apr 4 18:24 /boot/kernel/acpi_aiboost.ko.symbols -r-xr-xr-x 1 root wheel 9958 Apr 4 18:24 /boot/kernel/aibs.ko -r-xr-xr-x 1 root wheel 24924 Apr 4 18:24 /boot/kernel/aibs.ko.symbols > sudo kldload acpi_aiboost.ko > sysctl dev.acpi_aiboost.0 dev.acpi_aiboost.0.%desc: ASUStek AIBOOSTER dev.acpi_aiboost.0.%driver: acpi_aiboost dev.acpi_aiboost.0.%location: handle=\_SB_.PCI0.SBRG.ASOC dev.acpi_aiboost.0.%pnpinfo: _HID=ATK0110 _UID=16843024 dev.acpi_aiboost.0.%parent: acpi0 dev.acpi_aiboost.0.temp0: 310 dev.acpi_aiboost.0.temp1: 580 dev.acpi_aiboost.0.volt0: 1192 dev.acpi_aiboost.0.volt1: 3312 dev.acpi_aiboost.0.volt2: 5017 dev.acpi_aiboost.0.volt3: 12302 dev.acpi_aiboost.0.fan0: 912 dev.acpi_aiboost.0.fan1: 0 > sysctl -d dev.acpi_aiboost.0 dev.acpi_aiboost.0: dev.acpi_aiboost.0.%desc: device description dev.acpi_aiboost.0.%driver: device driver name dev.acpi_aiboost.0.%location: device location relative to parent dev.acpi_aiboost.0.%pnpinfo: device identification dev.acpi_aiboost.0.%parent: parent device dev.acpi_aiboost.0.temp0: CPU Temperature dev.acpi_aiboost.0.temp1: MB Temperature dev.acpi_aiboost.0.volt0: Vcore Voltage dev.acpi_aiboost.0.volt1: +3.3 Voltage dev.acpi_aiboost.0.volt2: +5 Voltage dev.acpi_aiboost.0.volt3: +12 Voltage dev.acpi_aiboost.0.fan0: CPU FAN Speed dev.acpi_aiboost.0.fan1: CHASSIS FAN Speed > sudo kldunload acpi_aiboost.ko > sudo kldload aibs.ko > sysctl hw.acpi.aibs0 hw.acpi.aibs0.volt.0: 1192 850 1600 hw.acpi.aibs0.volt.1: 3312 2970 3630 hw.acpi.aibs0.volt.2: 5017 4500 5500 hw.acpi.aibs0.volt.3: 12302 10200 13800 hw.acpi.aibs0.temp.0: 31.0C 80.0C 95.0C hw.acpi.aibs0.temp.1: 58.0C 60.0C 95.0C hw.acpi.aibs0.fan.0: 907 600 7200 hw.acpi.aibs0.fan.1: 0 700 7200 > sysctl -d hw.acpi.aibs0 hw.acpi.aibs0: ASUSTeK AI Booster (ACPI ASOC ATK0110) hw.acpi.aibs0.volt.0: Vcore Voltage hw.acpi.aibs0.volt.1: +3.3 Voltage hw.acpi.aibs0.volt.2: +5 Voltage hw.acpi.aibs0.volt.3: +12 Voltage hw.acpi.aibs0.temp.0: CPU Temperature hw.acpi.aibs0.temp.1: MB Temperature hw.acpi.aibs0.fan.0: CPU FAN Speed hw.acpi.aibs0.fan.1: CHASSIS FAN Speed > sudo kldunload aibs.ko Best regards, Constantine.SU. --SLDf9lqlvOQaIe6s-- From owner-freebsd-drivers@FreeBSD.ORG Mon Apr 5 06:49:11 2010 Return-Path: Delivered-To: freebsd-drivers@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 362E4106564A; Mon, 5 Apr 2010 06:49:11 +0000 (UTC) (envelope-from cnst@FreeBSD.org) Received: from dale.cnst.cs.uwaterloo.ca (dale.cnst.cs.uwaterloo.ca [129.97.7.219]) by mx1.freebsd.org (Postfix) with SMTP id EF99A8FC18; Mon, 5 Apr 2010 06:46:40 +0000 (UTC) Date: Mon, 5 Apr 2010 01:59:47 -0400 From: "Constantine A. Murenin" To: freebsd-acpi@FreeBSD.org, freebsd-drivers@FreeBSD.org, freebsd-hardware@FreeBSD.org Message-ID: <20100405055947.GA3544@hita.home.const.name> Mail-Followup-To: freebsd-acpi@FreeBSD.org, cnst@FreeBSD.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="SLDf9lqlvOQaIe6s" Content-Disposition: inline User-Agent: Mutt/1.4.2.3i Organization: David R. Cheriton School of Computer Science, Faculty of Mathematics, University of Waterloo X-Postal-Address: Constantine A. Murenin, David R. Cheriton School of Computer Science, University of Waterloo, 200 University Avenue West, Waterloo, Ontario N2L 3G1 Canada X-Office-Phone: +1-519-888-4567 x33581 X-Mobile-Phone: +1-K1W-ST1-CNST X-WWW: http://Constantine.SU/ X-LinkedIn: http://www.linkedin.com/in/mureninc Cc: "Constantine A. Murenin" Subject: aibs(4): ASUSTeK AI Booster (ACPI ATK0110) Hardware Monitor X-BeenThere: freebsd-drivers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Writing device drivers for FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Apr 2010 06:49:11 -0000 --SLDf9lqlvOQaIe6s Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline Dear freebsd-{acpi,drivers,hardware}@, Attached patch provides support for the hardware monitoring capabilities that are present in many modern desktop motherboards from ASUS featuring the ATK0110 ACPI device. This driver, aibs(4), is a fresh replacement for FreeBSD's existing acpi_aiboost(4). The new aibs(4) driver has the following advantages when compared to the old acpi_aiboost(4): * the sensors are now provided through the user-serviceable hw.acpi.aibs0 tree (with a subtree for each sensor type), instead of the Newbus-internal dev.acpi_aiboost.0 tree that contains various nonprime data at the same level as the actual sensors * the supposed range specifications are now reported for each input that is being sensed * the nature of the new tree, with "volt", "temp" and "fan" subtrees, allows one to specifically query for the sensors of a certain type * the temperature sensors are exported in the temperature 'K' units through sysctl(9), such that they are pretty-printed by sysctl(8) automatically * more user documentation is provided It is expected that aibs(4) should replace any and all functionality previously provided by acpi_aiboost(4), provide additional features as specified above and decrease the size of both the source and the binary code. Please find the demonstration below. > ll /usr/c/src/sys/dev/acpi_support/{acpi_aiboost,atk0110}.c -rw-r--r-- 1 constant wheel 8919 Apr 3 20:31 /usr/c/src/sys/dev/acpi_support/acpi_aiboost.c -rw-r--r-- 1 constant wheel 8638 Apr 4 17:34 /usr/c/src/sys/dev/acpi_support/atk0110.c > ll /boot/kernel/*aib*s* -r-xr-xr-x 1 root wheel 11581 Apr 4 18:24 /boot/kernel/acpi_aiboost.ko -r-xr-xr-x 1 root wheel 24504 Apr 4 18:24 /boot/kernel/acpi_aiboost.ko.symbols -r-xr-xr-x 1 root wheel 9958 Apr 4 18:24 /boot/kernel/aibs.ko -r-xr-xr-x 1 root wheel 24924 Apr 4 18:24 /boot/kernel/aibs.ko.symbols > sudo kldload acpi_aiboost.ko > sysctl dev.acpi_aiboost.0 dev.acpi_aiboost.0.%desc: ASUStek AIBOOSTER dev.acpi_aiboost.0.%driver: acpi_aiboost dev.acpi_aiboost.0.%location: handle=\_SB_.PCI0.SBRG.ASOC dev.acpi_aiboost.0.%pnpinfo: _HID=ATK0110 _UID=16843024 dev.acpi_aiboost.0.%parent: acpi0 dev.acpi_aiboost.0.temp0: 310 dev.acpi_aiboost.0.temp1: 580 dev.acpi_aiboost.0.volt0: 1192 dev.acpi_aiboost.0.volt1: 3312 dev.acpi_aiboost.0.volt2: 5017 dev.acpi_aiboost.0.volt3: 12302 dev.acpi_aiboost.0.fan0: 912 dev.acpi_aiboost.0.fan1: 0 > sysctl -d dev.acpi_aiboost.0 dev.acpi_aiboost.0: dev.acpi_aiboost.0.%desc: device description dev.acpi_aiboost.0.%driver: device driver name dev.acpi_aiboost.0.%location: device location relative to parent dev.acpi_aiboost.0.%pnpinfo: device identification dev.acpi_aiboost.0.%parent: parent device dev.acpi_aiboost.0.temp0: CPU Temperature dev.acpi_aiboost.0.temp1: MB Temperature dev.acpi_aiboost.0.volt0: Vcore Voltage dev.acpi_aiboost.0.volt1: +3.3 Voltage dev.acpi_aiboost.0.volt2: +5 Voltage dev.acpi_aiboost.0.volt3: +12 Voltage dev.acpi_aiboost.0.fan0: CPU FAN Speed dev.acpi_aiboost.0.fan1: CHASSIS FAN Speed > sudo kldunload acpi_aiboost.ko > sudo kldload aibs.ko > sysctl hw.acpi.aibs0 hw.acpi.aibs0.volt.0: 1192 850 1600 hw.acpi.aibs0.volt.1: 3312 2970 3630 hw.acpi.aibs0.volt.2: 5017 4500 5500 hw.acpi.aibs0.volt.3: 12302 10200 13800 hw.acpi.aibs0.temp.0: 31.0C 80.0C 95.0C hw.acpi.aibs0.temp.1: 58.0C 60.0C 95.0C hw.acpi.aibs0.fan.0: 907 600 7200 hw.acpi.aibs0.fan.1: 0 700 7200 > sysctl -d hw.acpi.aibs0 hw.acpi.aibs0: ASUSTeK AI Booster (ACPI ASOC ATK0110) hw.acpi.aibs0.volt.0: Vcore Voltage hw.acpi.aibs0.volt.1: +3.3 Voltage hw.acpi.aibs0.volt.2: +5 Voltage hw.acpi.aibs0.volt.3: +12 Voltage hw.acpi.aibs0.temp.0: CPU Temperature hw.acpi.aibs0.temp.1: MB Temperature hw.acpi.aibs0.fan.0: CPU FAN Speed hw.acpi.aibs0.fan.1: CHASSIS FAN Speed > sudo kldunload aibs.ko Best regards, Constantine.SU. --SLDf9lqlvOQaIe6s Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="svn_diff.aibs.r0.2010-04-04T205818-0400.patch" Index: share/man/man4/aibs.4 =================================================================== --- share/man/man4/aibs.4 (revision 0) +++ share/man/man4/aibs.4 (revision 0) @@ -0,0 +1,207 @@ +.\" $FreeBSD$ +.\" $NetBSD: aibs.4,v 1.2 2010/02/09 05:37:25 cnst Exp $ +.\" $OpenBSD: aibs.4,v 1.4 2009/07/30 06:30:45 jmc Exp $ +.\" +.\" Copyright (c) 2009/2010 Constantine A. Murenin +.\" +.\" 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 April 4, 2010 +.Dt AIBS 4 +.Os +.Sh NAME +.Nm aibs +.Nd "ASUSTeK AI Booster ACPI ATK0110 voltage, temperature and fan sensor" +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device acpi" +.Cd "device aibs" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following lines in +.Xr loader.conf 5 : +.Bd -literal -offset indent +acpi_load="YES" +aibs_load="YES" +.Ed +.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 the current values as well as +the supposed range specifications of each sensor's input +as defined by the motherboard manufacturer through +.Tn ACPI . +.Pp +The range specifications are as follows: +.Bl -bullet +.It +Voltage sensors have a lower and an upper range specification. +.It +Temperature sensors have two upper specifications. +.It +Fan sensors may either have only the lower specification, +or, depending on the +.Tn DSDT , +one lower and one upper specification. +.El +.Pp +Sensor readings and the range specifications are made available through the +.Xr sysctl 3 +interface, +and can be monitored with +.Xr sysctl 8 . +For example, on an ASUS V3-P5G965 barebone: +.Bd -literal -offset indent +> sysctl hw.acpi.aibs0 +hw.acpi.aibs0.volt.0: 1192 850 1600 +hw.acpi.aibs0.volt.1: 3312 2970 3630 +hw.acpi.aibs0.volt.2: 5017 4500 5500 +hw.acpi.aibs0.volt.3: 12302 10200 13800 +hw.acpi.aibs0.temp.0: 30.0C 80.0C 95.0C +hw.acpi.aibs0.temp.1: 58.0C 60.0C 95.0C +hw.acpi.aibs0.fan.0: 902 600 7200 +hw.acpi.aibs0.fan.1: 0 700 7200 +.Pp +> sysctl -d hw.acpi.aibs0 +hw.acpi.aibs0: ASUSTeK AI Booster (ACPI ASOC ATK0110) +hw.acpi.aibs0.volt.0: Vcore Voltage +hw.acpi.aibs0.volt.1: +3.3 Voltage +hw.acpi.aibs0.volt.2: +5 Voltage +hw.acpi.aibs0.volt.3: +12 Voltage +hw.acpi.aibs0.temp.0: CPU Temperature +hw.acpi.aibs0.temp.1: MB Temperature +hw.acpi.aibs0.fan.0: CPU FAN Speed +hw.acpi.aibs0.fan.1: CHASSIS FAN Speed +.Ed +.Pp +Generally, sensors provided by the +.Nm +driver may also be supported by certain other drivers or utilities +that access the +.Tn ISA / +.Tn LPC +or +.Tn I2C / +.Tn SMBus +devices directly. +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 or other utilities: +.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 range specifications are supported by +.Nm . +The range specification is reported +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 +.Sh SEE ALSO +.Xr sysctl 3 , +.Xr acpi 4 , +.Xr sysctl 8 +.Sh HISTORY +The +.Nm +driver first appeared in +.Ox 4.7 , +.Dx 2.5 , +.Nx 6.0 +and +.Fx 9.0 . +.Pp +An earlier version of the driver, +.Nm acpi_aiboost , +first appeared in +.Fx 7.0 +and +.Nx 5.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written for +.Ox , +.Dx , +.Nx +and +.Fx +by +.An Constantine A. Murenin Aq cnst@FreeBSD.org , +Raouf Boutaba Research Group, +David R. Cheriton School of Computer Science, +University of Waterloo. +.Pp +An earlier version of the driver, named +.Nm acpi_aiboost , +was written for +.Fx +by +.An Takanori Watanabe . Index: share/man/man4/Makefile =================================================================== --- share/man/man4/Makefile (revision 206151) +++ share/man/man4/Makefile (working copy) @@ -26,6 +26,7 @@ ahc.4 \ ahci.4 \ ahd.4 \ + ${_aibs.4} \ aio.4 \ alc.4 \ ale.4 \ @@ -629,6 +630,7 @@ _acpi_sony.4= acpi_sony.4 _acpi_toshiba.4=acpi_toshiba.4 _acpi_wmi.4= acpi_wmi.4 +_aibs.4= aibs.4 _amdsbwd.4= amdsbwd.4 _amdsmb.4= amdsmb.4 _amdtemp.4= amdtemp.4 Index: sys/conf/files =================================================================== --- sys/conf/files (revision 206151) +++ sys/conf/files (working copy) @@ -416,6 +416,7 @@ dev/acpi_support/acpi_panasonic.c optional acpi_panasonic acpi dev/acpi_support/acpi_sony.c optional acpi_sony acpi dev/acpi_support/acpi_toshiba.c optional acpi_toshiba acpi +dev/acpi_support/atk0110.c optional aibs acpi dev/acpica/Osd/OsdDebug.c optional acpi dev/acpica/Osd/OsdHardware.c optional acpi dev/acpica/Osd/OsdInterrupt.c optional acpi Index: sys/modules/acpi/Makefile =================================================================== --- sys/modules/acpi/Makefile (revision 206151) +++ sys/modules/acpi/Makefile (working copy) @@ -6,6 +6,6 @@ SUBDIR+= acpi_aiboost acpi_asus acpi_fujitsu acpi_hp acpi_ibm \ acpi_panasonic acpi_sony acpi_toshiba acpi_video \ - acpi_dock acpi_wmi + acpi_dock acpi_wmi aibs .include Index: sys/modules/acpi/aibs/Makefile =================================================================== --- sys/modules/acpi/aibs/Makefile (revision 0) +++ sys/modules/acpi/aibs/Makefile (revision 0) @@ -0,0 +1,10 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../dev/acpi_support + +KMOD= aibs +SRCS= atk0110.c +SRCS+= opt_acpi.h acpi_if.h bus_if.h device_if.h +SRCS+= opt_ddb.h + +.include Index: sys/dev/acpi_support/atk0110.c =================================================================== --- sys/dev/acpi_support/atk0110.c (revision 0) +++ sys/dev/acpi_support/atk0110.c (revision 0) @@ -0,0 +1,366 @@ +/* $FreeBSD$ */ +/* $NetBSD: atk0110.c,v 1.4 2010/02/11 06:54:57 cnst Exp $ */ +/* $OpenBSD: atk0110.c,v 1.1 2009/07/23 01:38:16 cnst Exp $ */ + +/* + * Copyright (c) 2009/2010 Constantine A. Murenin + * + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* + * 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 Takanori Watanabe'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, to NetBSD's sysmon_envsys(9) and to FreeBSD's sysctl(9). + * + * -- Constantine A. Murenin + */ + +#define _COMPONENT ACPI_OEM +ACPI_MODULE_NAME("aibs"); +ACPI_SERIAL_DECL(aibs, "aibs"); + +#define AIBS_MORE_SENSORS +#define AIBS_VERBOSE + +enum aibs_type { + AIBS_VOLT, + AIBS_TEMP, + AIBS_FAN +}; + +struct aibs_sensor { + ACPI_INTEGER v; + ACPI_INTEGER i; + ACPI_INTEGER l; + ACPI_INTEGER h; + enum aibs_type t; +}; + +struct aibs_softc { + struct device *sc_dev; + ACPI_HANDLE sc_ah; + struct sysctl_oid *sc_sysctl_oid; + + struct aibs_sensor *sc_asens_volt; + struct aibs_sensor *sc_asens_temp; + struct aibs_sensor *sc_asens_fan; +}; + +static int aibs_probe(device_t); +static int aibs_attach(device_t); +static int aibs_detach(device_t); +static int aibs_sysctl(SYSCTL_HANDLER_ARGS); + +static void aibs_attach_sif(struct aibs_softc *, enum aibs_type); + +static device_method_t aibs_methods[] = { + DEVMETHOD(device_probe,aibs_probe), + DEVMETHOD(device_attach,aibs_attach), + DEVMETHOD(device_detach,aibs_detach), + { NULL, NULL } +}; + +static driver_t aibs_driver = { + "aibs", + aibs_methods, + sizeof(struct aibs_softc) +}; + +static devclass_t aibs_devclass; + +DRIVER_MODULE(aibs, acpi, aibs_driver, aibs_devclass, NULL, NULL); + + +static char* aibs_hids[] = { + "ATK0110", + NULL +}; + +static int +aibs_probe(device_t dev) +{ + if (acpi_disabled("aibs") || + ACPI_ID_PROBE(device_get_parent(dev), dev, aibs_hids) == NULL) + return ENXIO; + + device_set_desc(dev, "ASUSTeK AI Booster (ACPI ASOC ATK0110)"); + return 0; +} + +static int +aibs_attach(device_t dev) +{ + struct aibs_softc *sc = device_get_softc(dev); + struct acpi_softc *acpi_sc = acpi_device_get_parent_softc(dev); + + sc->sc_dev = dev; + sc->sc_ah = acpi_get_handle(dev); + + /* add our tree to hw.acpi, similar to acpi_thermal(4) */ + sc->sc_sysctl_oid = SYSCTL_ADD_NODE(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(acpi_sc->acpi_sysctl_tree), OID_AUTO, + device_get_nameunit(dev), CTLFLAG_RD, NULL, device_get_desc(dev)); + + aibs_attach_sif(sc, AIBS_VOLT); + aibs_attach_sif(sc, AIBS_TEMP); + aibs_attach_sif(sc, AIBS_FAN); + + return 0; +} + +static void +aibs_attach_sif(struct aibs_softc *sc, enum aibs_type st) +{ + ACPI_STATUS s; + ACPI_BUFFER b; + ACPI_OBJECT *bp, *o; + int i, n; + const char *node; + char name[] = "?SIF"; + struct aibs_sensor *as; + struct sysctl_oid *so; + + switch (st) { + case AIBS_VOLT: + node = "volt"; + name[0] = 'V'; + break; + case AIBS_TEMP: + node = "temp"; + name[0] = 'T'; + break; + case AIBS_FAN: + node = "fan"; + name[0] = 'F'; + break; + default: + return; + } + + b.Length = ACPI_ALLOCATE_BUFFER; + s = AcpiEvaluateObjectTyped(sc->sc_ah, name, NULL, &b, + ACPI_TYPE_PACKAGE); + if (ACPI_FAILURE(s)) { + device_printf(sc->sc_dev, "%s not found\n", name); + return; + } + + bp = b.Pointer; + o = bp->Package.Elements; + if (o[0].Type != ACPI_TYPE_INTEGER) { + device_printf(sc->sc_dev, "%s[0]: invalid type\n", name); + AcpiOsFree(b.Pointer); + return; + } + + n = o[0].Integer.Value; + if (bp->Package.Count - 1 < n) { + device_printf(sc->sc_dev, "%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 + device_printf(sc->sc_dev, "%s: malformed package: %i/%i" + ", assume %i\n", name, on, bp->Package.Count - 1, n); + } + if (n < 1) { + device_printf(sc->sc_dev, "%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) { + device_printf(sc->sc_dev, "%s: malloc fail\n", name); + AcpiOsFree(b.Pointer); + return; + } + switch (st) { + case AIBS_VOLT: + sc->sc_asens_volt = as; + break; + case AIBS_TEMP: + sc->sc_asens_temp = as; + break; + case AIBS_FAN: + sc->sc_asens_fan = as; + break; + } + + /* sysctl subtree for sensors of this type */ + so = SYSCTL_ADD_NODE(device_get_sysctl_ctx(sc->sc_dev), + SYSCTL_CHILDREN(sc->sc_sysctl_oid), st, + node, CTLFLAG_RD, NULL, NULL); + + for (i = 0, o++; i < n; i++, o++) { + ACPI_OBJECT *oi; + char si[3]; + const char *desc; + + /* acpica5 automatically evaluates the referenced package */ + if(o[0].Type != ACPI_TYPE_PACKAGE) { + device_printf(sc->sc_dev, + "%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) { + device_printf(sc->sc_dev, + "%s: %i: invalid package\n", + name, i); + continue; + } + as[i].i = oi[0].Integer.Value; + desc = oi[1].String.Pointer; + as[i].l = oi[2].Integer.Value; + as[i].h = oi[3].Integer.Value; + as[i].t = st; +#ifdef AIBS_VERBOSE + device_printf(sc->sc_dev, "%c%i: " + "0x%08"PRIx64" %20s %5"PRIi64" / %5"PRIi64" " + "0x%"PRIx64"\n", + name[0], i, + as[i].i, desc, (int64_t)as[i].l, (int64_t)as[i].h, + oi[4].Integer.Value); +#endif + snprintf(si, sizeof(si), "%i", i); + SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->sc_dev), + SYSCTL_CHILDREN(so), i, si, CTLTYPE_OPAQUE | CTLFLAG_RD, + sc, st, aibs_sysctl, st == AIBS_TEMP ? "IK" : "I", desc); + } + + AcpiOsFree(b.Pointer); +} + +static int +aibs_detach(device_t dev) +{ + struct aibs_softc *sc = device_get_softc(dev); + + 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; +} + +#ifdef AIBS_VERBOSE +#define ddevice_printf(x...) device_printf(x) +#else +#define ddevice_printf(x...) +#endif + +static int +aibs_sysctl(SYSCTL_HANDLER_ARGS) +{ + struct aibs_softc *sc = arg1; + enum aibs_type st = arg2; + int i = oidp->oid_number; + ACPI_STATUS rs; + ACPI_OBJECT p, *bp; + ACPI_OBJECT_LIST mp; + ACPI_BUFFER b; + char *name; + struct aibs_sensor *as; + ACPI_INTEGER v, l, h; + int so[3]; + + switch (st) { + case AIBS_VOLT: + name = "RVLT"; + as = sc->sc_asens_volt; + break; + case AIBS_TEMP: + name = "RTMP"; + as = sc->sc_asens_temp; + break; + case AIBS_FAN: + name = "RFAN"; + as = sc->sc_asens_fan; + break; + default: + return ENOENT; + } + if (as == NULL) + return ENOENT; + 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; + ACPI_SERIAL_BEGIN(aibs); + rs = AcpiEvaluateObjectTyped(sc->sc_ah, name, &mp, &b, + ACPI_TYPE_INTEGER); + if (ACPI_FAILURE(rs)) { + ddevice_printf(sc->sc_dev, + "%s: %i: evaluation failed\n", + name, i); + ACPI_SERIAL_END(aibs); + return EIO; + } + bp = b.Pointer; + v = bp->Integer.Value; + AcpiOsFree(b.Pointer); + ACPI_SERIAL_END(aibs); + + switch (st) { + case AIBS_VOLT: + break; + case AIBS_TEMP: + v += 2732; + l += 2732; + h += 2732; + break; + case AIBS_FAN: + break; + } + so[0] = v; + so[1] = l; + so[2] = h; + return sysctl_handle_opaque(oidp, &so, sizeof(so), req); +} Index: sys/i386/conf/NOTES =================================================================== --- sys/i386/conf/NOTES (revision 206151) +++ sys/i386/conf/NOTES (working copy) @@ -506,6 +506,9 @@ # ACPI Docking Station device acpi_dock +# ACPI ASOC ATK0110 ASUSTeK AI Booster (voltage, temperature and fan sensors) +device aibs + # The cpufreq(4) driver provides support for non-ACPI CPU frequency control device cpufreq --SLDf9lqlvOQaIe6s-- From owner-freebsd-drivers@FreeBSD.ORG Tue Apr 6 10:14:24 2010 Return-Path: Delivered-To: freebsd-drivers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9C693106566C; Tue, 6 Apr 2010 10:14:24 +0000 (UTC) (envelope-from rpaulo@gmail.com) Received: from mail-fx0-f225.google.com (mail-fx0-f225.google.com [209.85.220.225]) by mx1.freebsd.org (Postfix) with ESMTP id C5A218FC0A; Tue, 6 Apr 2010 10:14:23 +0000 (UTC) Received: by fxm25 with SMTP id 25so86649fxm.3 for ; Tue, 06 Apr 2010 03:14:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:subject:mime-version :content-type:from:in-reply-to:date:cc:content-transfer-encoding :message-id:references:to:x-mailer; bh=6D6/db6AEEdJoj2oD3owoB8R5tHTWAeH69acl1dQDI0=; b=jAzw+xwT8tLVFqoOrG/E27iGAUiwssFFsyhIoHwHZFHYhRl9/5y1KTcGRnmcmdZJpn pz8mvgbBaWyS//bLe7eSenwqKmIR5hT3Ld8py4V0L+Ub/I8vKTUsjScAiy93PyQKQMPc yj/c9FUoVkUXIT78+uXb7t8krZkwfSoeQtSxg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:subject:mime-version:content-type:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to:x-mailer; b=MJVHlobxfNphkND2DVsRRwOY8CBcJVmF2TmbmyK9r03bz0kwd5jVMlaxJ1lHelasG0 uVO+isJ9gonFHg5joO7BPsJwZvFuqqA4SpaCZRSR9pBvVdRzzQTPFWA/JwImJX2S5fvc zoV6h3PoX5JQ2vnIPboOty4ha1+K8InOjQokM= Received: by 10.223.15.65 with SMTP id j1mr6952381faa.0.1270548862159; Tue, 06 Apr 2010 03:14:22 -0700 (PDT) Received: from [10.0.10.2] (54.81.54.77.rev.vodafone.pt [77.54.81.54]) by mx.google.com with ESMTPS id z15sm196775fkz.51.2010.04.06.03.14.20 (version=TLSv1/SSLv3 cipher=RC4-MD5); Tue, 06 Apr 2010 03:14:20 -0700 (PDT) Sender: Rui Paulo Mime-Version: 1.0 (Apple Message framework v1078) Content-Type: text/plain; charset=us-ascii From: Rui Paulo In-Reply-To: <20100405055947.GA3544@hita.home.const.name> Date: Tue, 6 Apr 2010 11:14:19 +0100 Content-Transfer-Encoding: quoted-printable Message-Id: References: <20100405055947.GA3544@hita.home.const.name> To: Constantine A. Murenin X-Mailer: Apple Mail (2.1078) Cc: freebsd-acpi@FreeBSD.org, freebsd-drivers@FreeBSD.org, freebsd-hardware@FreeBSD.org Subject: Re: aibs(4): ASUSTeK AI Booster (ACPI ATK0110) Hardware Monitor X-BeenThere: freebsd-drivers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Writing device drivers for FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Apr 2010 10:14:24 -0000 Hi, On 5 Apr 2010, at 06:59, Constantine A. Murenin wrote: > Dear freebsd-{acpi,drivers,hardware}@,=20 >=20 > Attached patch provides support for the hardware monitoring = capabilities that are present in many modern desktop motherboards from = ASUS featuring the ATK0110 ACPI device.=20 >=20 > This driver, aibs(4), is a fresh replacement for FreeBSD's existing = acpi_aiboost(4). The new aibs(4) driver has the following advantages = when compared to the old acpi_aiboost(4):=20 > * the sensors are now provided through the user-serviceable = hw.acpi.aibs0 tree (with a subtree for each sensor type), instead of = the Newbus-internal dev.acpi_aiboost.0 tree that contains various = nonprime data at the same level as the actual sensors=20 I was under the impression that this the right way in FreeBSD. Regards, -- Rui Paulo From owner-freebsd-drivers@FreeBSD.ORG Tue Apr 6 14:03:31 2010 Return-Path: Delivered-To: freebsd-drivers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 65AD6106566C; Tue, 6 Apr 2010 14:03:31 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from harmony.bsdimp.com (bsdimp.com [199.45.160.85]) by mx1.freebsd.org (Postfix) with ESMTP id 116688FC1D; Tue, 6 Apr 2010 14:03:30 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by harmony.bsdimp.com (8.14.3/8.14.1) with ESMTP id o36Dlaiw010793; Tue, 6 Apr 2010 07:47:37 -0600 (MDT) (envelope-from imp@bsdimp.com) Date: Tue, 06 Apr 2010 07:43:13 -0600 (MDT) Message-Id: <20100406.074313.364718154403381345.imp@bsdimp.com> To: rpaulo@freebsd.org From: "M. Warner Losh" In-Reply-To: References: <20100405055947.GA3544@hita.home.const.name> X-Mailer: Mew version 6.3 on Emacs 22.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Cc: freebsd-acpi@freebsd.org, freebsd-hardware@freebsd.org, freebsd-drivers@freebsd.org, cnst@freebsd.org Subject: Re: aibs(4): ASUSTeK AI Booster (ACPI ATK0110) Hardware Monitor X-BeenThere: freebsd-drivers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Writing device drivers for FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Apr 2010 14:03:31 -0000 In message: Rui Paulo writes: : Hi, : : On 5 Apr 2010, at 06:59, Constantine A. Murenin wrote: : : > Dear freebsd-{acpi,drivers,hardware}@, : > : > Attached patch provides support for the hardware monitoring capabilities that are present in many modern desktop motherboards from ASUS featuring the ATK0110 ACPI device. : > : > This driver, aibs(4), is a fresh replacement for FreeBSD's existing acpi_aiboost(4). The new aibs(4) driver has the following advantages when compared to the old acpi_aiboost(4): : > * the sensors are now provided through the user-serviceable hw.acpi.aibs0 tree (with a subtree for each sensor type), instead of the Newbus-internal dev.acpi_aiboost.0 tree that contains various nonprime data at the same level as the actual sensors : : I was under the impression that this the right way in FreeBSD. To be clear, this is a regression. They should be through the dev tree. We've been migrating exposed functionality from the hw. tree to the dev. tree for quite some time now. hw. isn't any more user-serviceable than dev. is. Warner