15db2f26eSSascha Wildner#- 25db2f26eSSascha Wildner# Copyright (c) 2004 Nate Lawson 35db2f26eSSascha Wildner# All rights reserved. 45db2f26eSSascha Wildner# 55db2f26eSSascha Wildner# Redistribution and use in source and binary forms, with or without 65db2f26eSSascha Wildner# modification, are permitted provided that the following conditions 75db2f26eSSascha Wildner# are met: 85db2f26eSSascha Wildner# 1. Redistributions of source code must retain the above copyright 95db2f26eSSascha Wildner# notice, this list of conditions and the following disclaimer. 105db2f26eSSascha Wildner# 2. Redistributions in binary form must reproduce the above copyright 115db2f26eSSascha Wildner# notice, this list of conditions and the following disclaimer in the 125db2f26eSSascha Wildner# documentation and/or other materials provided with the distribution. 135db2f26eSSascha Wildner# 145db2f26eSSascha Wildner# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 155db2f26eSSascha Wildner# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165db2f26eSSascha Wildner# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 175db2f26eSSascha Wildner# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 185db2f26eSSascha Wildner# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 195db2f26eSSascha Wildner# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 205db2f26eSSascha Wildner# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 215db2f26eSSascha Wildner# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 225db2f26eSSascha Wildner# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 235db2f26eSSascha Wildner# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 245db2f26eSSascha Wildner# SUCH DAMAGE. 255db2f26eSSascha Wildner# 265db2f26eSSascha Wildner# $FreeBSD: src/sys/dev/acpica/acpi_if.m,v 1.8.8.1 2009/04/15 03:14:26 kensmith Exp $ 275db2f26eSSascha Wildner# 285db2f26eSSascha Wildner 295db2f26eSSascha Wildner#include <sys/bus.h> 305db2f26eSSascha Wildner#include <sys/types.h> 315db2f26eSSascha Wildner#include "acpi.h" 325db2f26eSSascha Wildner 335db2f26eSSascha WildnerINTERFACE acpi; 345db2f26eSSascha Wildner 355db2f26eSSascha Wildner# 365db2f26eSSascha Wildner# Callback function for each child handle traversed in acpi_scan_children(). 375db2f26eSSascha Wildner# 385db2f26eSSascha Wildner# ACPI_HANDLE h: current child device being considered 395db2f26eSSascha Wildner# 405db2f26eSSascha Wildner# device_t *dev: pointer to the child's original device_t or NULL if there 415db2f26eSSascha Wildner# was none. The callback should store a new device in *dev if it has 425db2f26eSSascha Wildner# created one. The method implementation will automatically clean up the 435db2f26eSSascha Wildner# previous device and properly associate the current ACPI_HANDLE with it. 445db2f26eSSascha Wildner# 455db2f26eSSascha Wildner# level: current level being scanned 465db2f26eSSascha Wildner# 475db2f26eSSascha Wildner# void *arg: argument passed in original call to acpi_scan_children() 485db2f26eSSascha Wildner# 495db2f26eSSascha Wildner# Returns: AE_OK if the scan should continue, otherwise an error 505db2f26eSSascha Wildner# 515db2f26eSSascha WildnerHEADER { 525db2f26eSSascha Wildner typedef ACPI_STATUS (*acpi_scan_cb_t)(ACPI_HANDLE h, device_t *dev, 535db2f26eSSascha Wildner int level, void *arg); 545db2f26eSSascha Wildner 555db2f26eSSascha Wildner struct acpi_bif; 565db2f26eSSascha Wildner struct acpi_bst; 575db2f26eSSascha Wildner}; 585db2f26eSSascha Wildner 595db2f26eSSascha Wildner# 605db2f26eSSascha Wildner# Default implementation for acpi_id_probe(). 615db2f26eSSascha Wildner# 625db2f26eSSascha WildnerCODE { 635db2f26eSSascha Wildner static char * 645db2f26eSSascha Wildner acpi_generic_id_probe(device_t bus, device_t dev, char **ids) 655db2f26eSSascha Wildner { 665db2f26eSSascha Wildner return (NULL); 675db2f26eSSascha Wildner } 685db2f26eSSascha Wildner}; 695db2f26eSSascha Wildner 705db2f26eSSascha Wildner# 715db2f26eSSascha Wildner# Check a device for a match in a list of ID strings. The strings can be 725db2f26eSSascha Wildner# EISA PNP IDs or ACPI _HID/_CID values. 735db2f26eSSascha Wildner# 745db2f26eSSascha Wildner# device_t bus: parent bus for the device 755db2f26eSSascha Wildner# 765db2f26eSSascha Wildner# device_t dev: device being considered 775db2f26eSSascha Wildner# 785db2f26eSSascha Wildner# char **ids: array of ID strings to consider 795db2f26eSSascha Wildner# 805db2f26eSSascha Wildner# Returns: ID string matched or NULL if no match 815db2f26eSSascha Wildner# 825db2f26eSSascha WildnerMETHOD char * id_probe { 835db2f26eSSascha Wildner device_t bus; 845db2f26eSSascha Wildner device_t dev; 855db2f26eSSascha Wildner char **ids; 865db2f26eSSascha Wildner} DEFAULT acpi_generic_id_probe; 875db2f26eSSascha Wildner 885db2f26eSSascha Wildner# 895db2f26eSSascha Wildner# Evaluate an ACPI method or object, given its path. 905db2f26eSSascha Wildner# 915db2f26eSSascha Wildner# device_t bus: parent bus for the device 925db2f26eSSascha Wildner# 935db2f26eSSascha Wildner# device_t dev: evaluate the object relative to this device's handle. 945db2f26eSSascha Wildner# Specify NULL to begin the search at the ACPI root. 955db2f26eSSascha Wildner# 965db2f26eSSascha Wildner# ACPI_STRING pathname: absolute or relative path to this object 975db2f26eSSascha Wildner# 985db2f26eSSascha Wildner# ACPI_OBJECT_LIST *parameters: array of arguments to pass to the object. 995db2f26eSSascha Wildner# Specify NULL if there are none. 1005db2f26eSSascha Wildner# 1015db2f26eSSascha Wildner# ACPI_BUFFER *ret: the result (if any) of the evaluation 1025db2f26eSSascha Wildner# Specify NULL if there is none. 1035db2f26eSSascha Wildner# 1045db2f26eSSascha Wildner# Returns: AE_OK or an error value 1055db2f26eSSascha Wildner# 1065db2f26eSSascha WildnerMETHOD ACPI_STATUS evaluate_object { 1075db2f26eSSascha Wildner device_t bus; 1085db2f26eSSascha Wildner device_t dev; 1095db2f26eSSascha Wildner ACPI_STRING pathname; 1105db2f26eSSascha Wildner ACPI_OBJECT_LIST *parameters; 1115db2f26eSSascha Wildner ACPI_BUFFER *ret; 1125db2f26eSSascha Wildner}; 1135db2f26eSSascha Wildner 1145db2f26eSSascha Wildner# 1155db2f26eSSascha Wildner# Get the highest power state (D0-D3) that is usable for a device when 1165db2f26eSSascha Wildner# suspending/resuming. If a bus calls this when suspending a device, it 1175db2f26eSSascha Wildner# must also call it when resuming. 1185db2f26eSSascha Wildner# 1195db2f26eSSascha Wildner# device_t bus: parent bus for the device 1205db2f26eSSascha Wildner# 1215db2f26eSSascha Wildner# device_t dev: check this device's appropriate power state 1225db2f26eSSascha Wildner# 1235db2f26eSSascha Wildner# int *dstate: if successful, contains the highest valid sleep state 1245db2f26eSSascha Wildner# 1255db2f26eSSascha Wildner# Returns: 0 on success, ESRCH if device has no special state, or 1265db2f26eSSascha Wildner# some other error value. 1275db2f26eSSascha Wildner# 1285db2f26eSSascha WildnerMETHOD int pwr_for_sleep { 1295db2f26eSSascha Wildner device_t bus; 1305db2f26eSSascha Wildner device_t dev; 1315db2f26eSSascha Wildner int *dstate; 1325db2f26eSSascha Wildner}; 1335db2f26eSSascha Wildner 1345db2f26eSSascha Wildner# 1355db2f26eSSascha Wildner# Rescan a subtree and optionally reattach devices to handles. Users 1365db2f26eSSascha Wildner# specify a callback that is called for each ACPI_HANDLE of type Device 1375db2f26eSSascha Wildner# that is a child of "dev". 1385db2f26eSSascha Wildner# 1395db2f26eSSascha Wildner# device_t bus: parent bus for the device 1405db2f26eSSascha Wildner# 1415db2f26eSSascha Wildner# device_t dev: begin the scan starting with this device's handle. 1425db2f26eSSascha Wildner# Specify NULL to begin the scan at the ACPI root. 1435db2f26eSSascha Wildner# 1445db2f26eSSascha Wildner# int max_depth: number of levels to traverse (i.e., 1 means just the 1455db2f26eSSascha Wildner# immediate children. 1465db2f26eSSascha Wildner# 1475db2f26eSSascha Wildner# acpi_scan_cb_t user_fn: called for each child handle 1485db2f26eSSascha Wildner# 1495db2f26eSSascha Wildner# void *arg: argument to pass to the callback function 1505db2f26eSSascha Wildner# 1515db2f26eSSascha Wildner# Returns: AE_OK or an error value, based on the callback return value 1525db2f26eSSascha Wildner# 1535db2f26eSSascha WildnerMETHOD ACPI_STATUS scan_children { 1545db2f26eSSascha Wildner device_t bus; 1555db2f26eSSascha Wildner device_t dev; 1565db2f26eSSascha Wildner int max_depth; 1575db2f26eSSascha Wildner acpi_scan_cb_t user_fn; 1585db2f26eSSascha Wildner void *arg; 1595db2f26eSSascha Wildner}; 1605db2f26eSSascha Wildner 1615db2f26eSSascha Wildner# 1625db2f26eSSascha Wildner# Query a given driver for its supported feature(s). This should be 1635db2f26eSSascha Wildner# called by the parent bus before the driver is probed. 1645db2f26eSSascha Wildner# 1655db2f26eSSascha Wildner# driver_t *driver: child driver 1665db2f26eSSascha Wildner# 1675db2f26eSSascha Wildner# u_int *features: returned bitmask of all supported features 1685db2f26eSSascha Wildner# 1695db2f26eSSascha WildnerSTATICMETHOD int get_features { 1705db2f26eSSascha Wildner driver_t *driver; 1715db2f26eSSascha Wildner u_int *features; 1725db2f26eSSascha Wildner}; 1735db2f26eSSascha Wildner 1745db2f26eSSascha Wildner# 1755db2f26eSSascha Wildner# Read embedded controller (EC) address space 1765db2f26eSSascha Wildner# 1775db2f26eSSascha Wildner# device_t dev: EC device 1785db2f26eSSascha Wildner# u_int addr: Address to read from in EC space 179*417dc5a4SSascha Wildner# UINT64 *val: Location to store read value 1805db2f26eSSascha Wildner# int width: Size of area to read in bytes 1815db2f26eSSascha Wildner# 1825db2f26eSSascha WildnerMETHOD int ec_read { 1835db2f26eSSascha Wildner device_t dev; 1845db2f26eSSascha Wildner u_int addr; 185*417dc5a4SSascha Wildner UINT64 *val; 1865db2f26eSSascha Wildner int width; 1875db2f26eSSascha Wildner}; 1885db2f26eSSascha Wildner 1895db2f26eSSascha Wildner# 1905db2f26eSSascha Wildner# Write embedded controller (EC) address space 1915db2f26eSSascha Wildner# 1925db2f26eSSascha Wildner# device_t dev: EC device 1935db2f26eSSascha Wildner# u_int addr: Address to write to in EC space 194*417dc5a4SSascha Wildner# UINT64 val: Value to write 1955db2f26eSSascha Wildner# int width: Size of value to write in bytes 1965db2f26eSSascha Wildner# 1975db2f26eSSascha WildnerMETHOD int ec_write { 1985db2f26eSSascha Wildner device_t dev; 1995db2f26eSSascha Wildner u_int addr; 200*417dc5a4SSascha Wildner UINT64 val; 2015db2f26eSSascha Wildner int width; 2025db2f26eSSascha Wildner}; 2035db2f26eSSascha Wildner 2045db2f26eSSascha Wildner# 2055db2f26eSSascha Wildner# Get battery information (_BIF format) 2065db2f26eSSascha Wildner# 2075db2f26eSSascha Wildner# device_t dev: Battery device 2085db2f26eSSascha Wildner# struct acpi_bif *bif: Pointer to storage for _BIF results 2095db2f26eSSascha Wildner# 2105db2f26eSSascha WildnerMETHOD int batt_get_info { 2115db2f26eSSascha Wildner device_t dev; 2125db2f26eSSascha Wildner struct acpi_bif *bif; 2135db2f26eSSascha Wildner}; 2145db2f26eSSascha Wildner 2155db2f26eSSascha Wildner# 2165db2f26eSSascha Wildner# Get battery status (_BST format) 2175db2f26eSSascha Wildner# 2185db2f26eSSascha Wildner# device_t dev: Battery device 2195db2f26eSSascha Wildner# struct acpi_bst *bst: Pointer to storage for _BST results 2205db2f26eSSascha Wildner# 2215db2f26eSSascha WildnerMETHOD int batt_get_status { 2225db2f26eSSascha Wildner device_t dev; 2235db2f26eSSascha Wildner struct acpi_bst *bst; 2245db2f26eSSascha Wildner}; 225