1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-19 10:53:58 +00:00

Import the acpi_aibs(4) driver written by Constantine A. Murenin.

It has more features than acpi_aiboost(4) and it will eventually replace
acpi_aiboost(4).

Submitted by:	Constantine A. Murenin <cnst at FreeBSD.org>
Reviewed by:	freebsd-acpi, imp
MFC after:	1 month
This commit is contained in:
Rui Paulo 2010-06-25 15:32:46 +00:00
parent 60ddfa2837
commit bbe4a97d41
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=209523
7 changed files with 584 additions and 1 deletions

View File

@ -26,6 +26,7 @@ MAN= aac.4 \
ahc.4 \
ahci.4 \
ahd.4 \
${_aibs.4} \
aio.4 \
alc.4 \
ale.4 \
@ -633,6 +634,7 @@ _acpi_panasonic.4=acpi_panasonic.4
_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

209
share/man/man4/aibs.4 Normal file
View File

@ -0,0 +1,209 @@
.\" $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 <cnst++@FreeBSD.org>
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
.Dd 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 dev.aibs.0.{volt,temp,fan}
dev.aibs.0.volt.0: 1192 850 1600
dev.aibs.0.volt.1: 3312 2970 3630
dev.aibs.0.volt.2: 5017 4500 5500
dev.aibs.0.volt.3: 12302 10200 13800
dev.aibs.0.temp.0: 28.0C 80.0C 95.0C
dev.aibs.0.temp.1: 55.0C 60.0C 95.0C
dev.aibs.0.fan.0: 878 600 7200
dev.aibs.0.fan.1: 0 700 7200
.Pp
> sysctl -d dev.aibs.0.{volt,temp,fan}
dev.aibs.0.volt:
dev.aibs.0.volt.0: Vcore Voltage
dev.aibs.0.volt.1: +3.3 Voltage
dev.aibs.0.volt.2: +5 Voltage
dev.aibs.0.volt.3: +12 Voltage
dev.aibs.0.temp:
dev.aibs.0.temp.0: CPU Temperature
dev.aibs.0.temp.1: MB Temperature
dev.aibs.0.fan:
dev.aibs.0.fan.0: CPU FAN Speed
dev.aibs.0.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 .

View File

@ -436,6 +436,7 @@ dev/acpi_support/acpi_ibm.c optional acpi_ibm acpi
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

View File

@ -0,0 +1,358 @@
/* $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 <cnst++@FreeBSD.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/cdefs.h>
__FBSDID("$FreeBSD$");
#include <machine/_inttypes.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/module.h>
#include <sys/malloc.h>
#include <sys/sysctl.h>
#include <contrib/dev/acpica/include/acpi.h>
#include <dev/acpica/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 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 <http://cnst.su/>
*/
#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 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);
sc->sc_dev = dev;
sc->sc_ah = acpi_get_handle(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(device_get_sysctl_tree(sc->sc_dev)), 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);
}

View File

@ -512,6 +512,9 @@ device acpi_video
# 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

View File

@ -6,6 +6,6 @@ SUBDIR= acpi
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 <bsd.subdir.mk>

View File

@ -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 <bsd.kmod.mk>