.\" $OpenBSD: aml_evalnode.9,v 1.10 2014/01/21 03:15:46 schwarze Exp $ .\" .\" Copyright (c) 2007 Michael Knudsen .\" .\" 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 $Mdocdate: January 21 2014 $ .Dt AML_EVALNODE 9 .Os .Sh NAME .Nm aml_evalnode , .Nm aml_evalname , .Nm aml_find_node , .Nm aml_freevalue , .Nm aml_val2int .Nd AML API .Sh SYNOPSIS .In dev/acpi/acpireg.h .In dev/acpi/acpivar.h .In dev/acpi/acpidev.h .In dev/acpi/amltypes.h .In dev/acpi/dsdt.h .Ft int .Fn "aml_evalnode" "struct acpi_softc *sc" "struct aml_node *node" \ "int argc" "struct aml_value *argv" "struct aml_value *res" .Ft int .Fn "aml_evalname" "struct acpi_softc *sc" "struct aml_node *parent" \ "const char *name" "int argc" "struct aml_value *argv" \ "struct aml_value *res" .Ft int .Fn "aml_find_node" "struct aml_node *node" "const char *name" \ "int (*cbproc)(struct aml_node *, void *arg)" "void *arg" .Ft void .Fn "aml_freevalue" "struct aml_value *val" .Ft int64_t .Fn "aml_val2int" "struct aml_value *rval" .Sh DESCRIPTION The AML API handles decoding and evaluation of the AML code embedded in a machine's ACPI tables. This code is used to implement configuration and control mechanisms for machines. .Pp .Fn aml_evalnode evaluates the AML node .Fa node located in the ACPI table specified by .Fa sc . Parameters may be passed using the .Fa argv parameters with the parameter .Fa argc specifying the number of parameters passed. If there are no arguments, a value of 0 is used for .Fa argc and .Fa argv should be .Dv NULL . If evaluating the node produces any result, for example a string with a device name reference, this result is stored in the .Fa res parameter unless it is .Dv NULL . .Fa res is cleared before storing the result. If .Fa node does not exist, .Fn aml_evalnode returns .Dv ACPI_E_BADVALUE , otherwise it returns 0. .Pp .Fn aml_evalname is similar to .Fn aml_evalnode but differs in that it searches for a subnode of .Fa parent with the name .Fa name . If such a node is found, it is evaluated using .Fn aml_evalnode , passing whatever parameters were passed to itself. .Fn aml_evalname returns the return value of .Fn aml_evalnode . .Pp .Fn aml_find_node is used to find all subnodes of .Fa parent with a name of .Fa name . For each node found, the function specified as the .Fa cbproc parameter is called with the node and .Fa arg as the first and second parameters, respectively. The function specified as the .Fa cbproc parameter returns a value that specifies if the tree walk should be terminated (!0) or continued (0) with the children. .Fn aml_find_node always returns 0. .Pp .Fn aml_freevalue is used to free up the result returned from .Fn aml_evalnode or the other AML evaluation functions. Note that no attempt is made to free the .Vt struct aml_value itself so it is safe to allocate this on the stack. Also, calling .Fn aml_freevalue with a parameter of .Dv NULL is not an error. .Pp .Fn aml_val2int is used to convert the .Vt struct aml_value pointed to by the .Fa rval parameter to a signed 64-bit integer value. Multiple types exist for .Vt struct aml_value , and the conversion value depends on the type of the value object as follows. For objects of type .Dv AML_OBJTYPE_INTEGER and .Dv AML_OBJTYPE_STATICINT , the return value is simply the integer value stored in the object. For objects of type .Dv AML_OBJTYPE_BUFFER , the return value is the integer interpretation of the buffer contents. For objects of type .Dv AML_OBJTYPE_STRING , the return value is the integer value represented as a string in base 10 or, if prefixed by .Dq 0x , in base 16. If .Fa rval is .Dv NULL or not of one of the types mentioned above, .Fn aml_val2int returns 0. .Sh EXAMPLES Using .Fn aml_evalname to invoke the .Dq _STA method on a node .Fa node should be done like the following: .Bd -literal -offset indent struct acpi_softc *sc struct aml_node *node; struct aml_value res; if (aml_evalname(sc->sc_acpi, node, "_STA", 0, NULL, &res) != 0) { dnprintf(10, "%s: no _STA\en", DEVNAME(sc)); return; } .Ed .Pp Using the .Vt struct aml_value obtained from the .Dq _STA call to determine if the device is a battery is done as follows: .Bd -literal -offset indent if ((aml_val2int(&res) & STA_BATTERY) == 0) { dnprintf(10, %s: no battery present\en", DEVNAME(sc)); return; .Ed .Pp Finally, when the result stored in .Fa res is no longer needed, free it using .Fn aml_freevalue : .Bd -literal -offset indent aml_freevalue(&res); .Ed .Sh SEE ALSO .Xr acpi 4 , .Xr acpidump 8 .Sh HISTORY The AML API was written by .An Jordan Hargrave Aq Mt jordan@openbsd.org .