#ifndef _SYS_ACPIDEV_H
#define _SYS_ACPIDEV_H
#include <sys/types.h>
#include <sys/obpdefs.h>
#include <sys/sunddi.h>
#ifdef _KERNEL
#include <sys/acpi/acpi.h>
#include <sys/acpica.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define ACPIDEV_MAX_ENUM_LEVELS 32
#define ACPIDEV_MAX_NAMELEN OBP_MAXDRVNAME
#define ACPIDEV_HID_ROOTNEX "SOLA0001"
#define ACPIDEV_HID_VIRTNEX "SOLA0002"
#define ACPIDEV_HID_SCOPE "SOLA0003"
#define ACPIDEV_HID_PROCESSOR "SOLA0004"
#define ACPIDEV_HID_CONTAINER1 "PNP0A05"
#define ACPIDEV_HID_CONTAINER2 "PNP0A06"
#define ACPIDEV_HID_MODULE "ACPI0004"
#define ACPIDEV_HID_CPU "ACPI0007"
#define ACPIDEV_HID_PCI_HOSTBRIDGE "PNP0A03"
#define ACPIDEV_HID_PCIE_HOSTBRIDGE "PNP0A08"
#define ACPIDEV_HID_PCIEX_HOSTBRIDGE "PNP0A08"
#define ACPIDEV_HID_MEMORY "PNP0C80"
#define ACPIDEV_NODE_NAME_ROOT "fw"
#define ACPIDEV_NODE_NAME_ACPIDR "acpidr"
#define ACPIDEV_NODE_NAME_CONTAINER "container"
#define ACPIDEV_NODE_NAME_MODULE_SBD "sb"
#define ACPIDEV_NODE_NAME_MODULE_CPU "socket"
#define ACPIDEV_NODE_NAME_CPU "cpu"
#define ACPIDEV_NODE_NAME_PROCESSOR "cpus"
#define ACPIDEV_NODE_NAME_MEMORY "mem"
#define ACPIDEV_NODE_NAME_PCI "pci"
#define ACPIDEV_TYPE_ROOTNEX "acpirootnex"
#define ACPIDEV_TYPE_VIRTNEX "acpivirtnex"
#define ACPIDEV_TYPE_SCOPE "acpiscope"
#define ACPIDEV_TYPE_DEVICE "acpidevice"
#define ACPIDEV_TYPE_CONTAINER "acpicontainer"
#define ACPIDEV_TYPE_CPU "acpicpu"
#define ACPIDEV_TYPE_MEMORY "acpimemory"
#define ACPIDEV_TYPE_PCI "pci"
#define ACPIDEV_TYPE_PCIEX "pciex"
#define ACPIDEV_TYPE_USBPORT "acpiusbport"
#define ACPIDEV_PROP_NAME_UNIT_ADDR "unit-address"
#define ACPIDEV_PROP_NAME_ACPI_UID "acpi-uid"
#define ACPIDEV_PROP_NAME_PROCESSOR_ID "acpi-processor-id"
#define ACPIDEV_PROP_NAME_LOCALAPIC_ID "apic-id"
#define ACPIDEV_PROP_NAME_PROXIMITY_ID "proximity-id"
#define ACPIDEV_PROP_NAME_UID_FORMAT "acpidev-uid-format"
#define ACPIDEV_CMD_OST_PREFIX "acpi-update-status"
#define ACPIDEV_CMD_OST_INPROGRESS "acpi-update-status=inprogress"
#define ACPIDEV_CMD_OST_SUCCESS "acpi-update-status=success"
#define ACPIDEV_CMD_OST_FAILURE "acpi-update-status=failure"
#define ACPIDEV_CMD_OST_NOOP "acpi-update-status=noop"
#define ACPIDEV_EVENT_TYPE_ATTR_NAME "acpi-event-type"
#define ACPIDEV_EVENT_TYPE_BUS_CHECK "bus_check"
#define ACPIDEV_EVENT_TYPE_DEVICE_CHECK "device_check"
#define ACPIDEV_EVENT_TYPE_DEVICE_CHECK_LIGHT "device_check_light"
#define ACPIDEV_EVENT_TYPE_EJECT_REQUEST "eject_request"
typedef enum acpidev_class_id {
ACPIDEV_CLASS_ID_INVALID = 0,
ACPIDEV_CLASS_ID_ROOTNEX = 1,
ACPIDEV_CLASS_ID_SCOPE = 2,
ACPIDEV_CLASS_ID_DEVICE = 3,
ACPIDEV_CLASS_ID_CONTAINER = 4,
ACPIDEV_CLASS_ID_CPU = 5,
ACPIDEV_CLASS_ID_MEMORY = 6,
ACPIDEV_CLASS_ID_PCI = 7,
ACPIDEV_CLASS_ID_PCIEX = 8,
ACPIDEV_CLASS_ID_USB = 9,
ACPIDEV_CLASS_ID_MAX
} acpidev_class_id_t;
#define ACPIDEV_OUSER_NO_CPU 0x1
#define ACPIDEV_OUSER_NO_MEM 0x2
#define ACPIDEV_OUSER_NO_CONTAINER 0x4
#define ACPIDEV_OUSER_NO_PCI 0x8
#define ACPIDEV_OUSER_NO_CACHE 0x10000
#ifdef _KERNEL
#define ACPIDEV_OBJECT_NAME_SB METHOD_NAME__SB_
#define ACPIDEV_OBJECT_NAME_PR "_PR_"
#define ACPIDEV_METHOD_NAME_MAT "_MAT"
#define ACPIDEV_METHOD_NAME_EJ0 "_EJ0"
#define ACPIDEV_METHOD_NAME_EDL "_EDL"
#define ACPIDEV_METHOD_NAME_EJD "_EJD"
#define ACPIDEV_METHOD_NAME_OST "_OST"
#define ACPIDEV_METHOD_NAME_PXM "_PXM"
#define ACPIDEV_METHOD_NAME_SLI "_SLI"
#define ACPI_OST_EVENT_EJECTING 0x103
#define ACPI_OST_EVENT_INSERTING 0x200
#define ACPI_OST_STA_SUCCESS 0x0
#define ACPI_OST_STA_FAILURE 0x1
#define ACPI_OST_STA_NOT_SUPPORT 0x2
#define ACPI_OST_STA_EJECT_NOT_SUPPORT 0x80
#define ACPI_OST_STA_EJECT_IN_USE 0x81
#define ACPI_OST_STA_EJECT_BUSY 0x82
#define ACPI_OST_STA_EJECT_DEPENDENCY 0x83
#define ACPI_OST_STA_EJECT_IN_PROGRESS 0x84
#define ACPI_OST_STA_INSERT_IN_PROGRESS 0x80
#define ACPI_OST_STA_INSERT_DRIVER 0x81
#define ACPI_OST_STA_INSERT_NOT_SUPPORT 0x82
#define ACPI_OST_STA_INSERT_NO_RESOURCE 0x90
#define ACPI_OST_STA_INSERT_NO_BUS 0x8
#define ACPI_OST_STA_INSERT_NO_INTR 0x4
#define ACPI_OST_STA_INSERT_NO_IO 0x2
#define ACPI_OST_STA_INSERT_NO_MEM 0x1
#define ACPI_SLIT_SELF_LATENCY 10
#define ACPI_MEMNODE_DEVID_BOOT UINT32_MAX
typedef struct acpidev_data_impl *acpidev_data_handle_t;
typedef struct acpidev_walk_info acpidev_walk_info_t;
typedef struct acpidev_filter_rule acpidev_filter_rule_t;
typedef struct acpidev_class acpidev_class_t;
typedef struct acpidev_class_list acpidev_class_list_t;
typedef enum acpidev_op_type {
ACPIDEV_OP_BOOT_PROBE = 0,
ACPIDEV_OP_BOOT_REPROBE,
ACPIDEV_OP_HOTPLUG_PROBE
} acpidev_op_type_t;
struct acpidev_walk_info {
acpidev_op_type_t awi_op_type;
int awi_level;
acpidev_walk_info_t *awi_parent;
acpidev_class_t *awi_class_curr;
int awi_flags;
ACPI_HANDLE awi_hdl;
ACPI_DEVICE_INFO *awi_info;
char *awi_name;
acpidev_data_handle_t awi_data;
dev_info_t *awi_dip;
acpidev_class_list_t **awi_class_list;
intptr_t awi_scratchpad[4];
};
#define AWI_SCRATCH_USBPORT 2
#define ACPIDEV_WI_DISABLE_CREATE 0x1
#define ACPIDEV_WI_DEVICE_CREATED 0x2
#define ACPIDEV_WI_DISABLE_SCAN 0x10
#define ACPIDEV_WI_CHILD_SCANNED 0x20
typedef enum acpidev_filter_result {
ACPIDEV_FILTER_FAILED = -1,
ACPIDEV_FILTER_CONTINUE = 0,
ACPIDEV_FILTER_DEFAULT,
ACPIDEV_FILTER_SCAN,
ACPIDEV_FILTER_CREATE,
ACPIDEV_FILTER_SKIP,
} acpidev_filter_result_t;
typedef acpidev_filter_result_t (* acpidev_filter_func_t)(acpidev_walk_info_t *,
ACPI_HANDLE, acpidev_filter_rule_t *, char *, int);
struct acpidev_filter_rule {
acpidev_filter_func_t adf_filter_func;
intptr_t adf_filter_arg;
acpidev_filter_result_t adf_retcode;
acpidev_class_list_t **adf_class_list;
intptr_t adf_minlvl;
intptr_t adf_maxlvl;
char *adf_pattern;
char *adf_replace;
};
typedef ACPI_STATUS (* acpidev_pre_probe_t)(acpidev_walk_info_t *);
typedef ACPI_STATUS (* acpidev_post_probe_t)(acpidev_walk_info_t *);
typedef ACPI_STATUS (* acpidev_probe_t)(acpidev_walk_info_t *);
typedef acpidev_filter_result_t (* acpidev_filter_t)(acpidev_walk_info_t *,
char *, int);
typedef ACPI_STATUS (* acpidev_init_t)(acpidev_walk_info_t *);
typedef void (* acpidev_fini_t)(ACPI_HANDLE, acpidev_data_handle_t,
acpidev_class_t *);
struct acpidev_class {
volatile uint32_t adc_refcnt;
int adc_version;
acpidev_class_id_t adc_class_id;
char *adc_class_name;
char *adc_dev_type;
void *adc_private;
acpidev_pre_probe_t adc_pre_probe;
acpidev_post_probe_t adc_post_probe;
acpidev_probe_t adc_probe;
acpidev_filter_t adc_filter;
acpidev_init_t adc_init;
acpidev_fini_t adc_fini;
};
#define ACPIDEV_CLASS_REV1 1
#define ACPIDEV_CLASS_REV ACPIDEV_CLASS_REV1
extern acpidev_class_t acpidev_class_scope;
extern acpidev_class_t acpidev_class_device;
extern acpidev_class_t acpidev_class_container;
extern acpidev_class_t acpidev_class_cpu;
extern acpidev_class_t acpidev_class_memory;
extern acpidev_class_t acpidev_class_pci;
extern acpidev_class_t acpidev_class_usbport;
extern acpidev_class_list_t *acpidev_class_list_root;
extern acpidev_class_list_t *acpidev_class_list_scope;
extern acpidev_class_list_t *acpidev_class_list_device;
extern acpidev_class_list_t *acpidev_class_list_cpu;
extern acpidev_class_list_t *acpidev_class_list_memory;
extern acpidev_class_list_t *acpidev_class_list_usbport;
extern ACPI_STATUS acpidev_register_class(acpidev_class_list_t **listpp,
acpidev_class_t *clsp, boolean_t tail);
extern ACPI_STATUS acpidev_unregister_class(acpidev_class_list_t **listpp,
acpidev_class_t *clsp);
extern ACPI_STATUS acpidev_probe_child(acpidev_walk_info_t *infop);
extern ACPI_STATUS acpidev_process_object(acpidev_walk_info_t *infop,
int flags);
#define ACPIDEV_PROCESS_FLAG_CREATE 0x1
#define ACPIDEV_PROCESS_FLAG_SCAN 0x2
#define ACPIDEV_PROCESS_FLAG_CHECK 0x100
#define ACPIDEV_PROCESS_FLAG_NOBIND 0x200
#define ACPIDEV_PROCESS_FLAG_OFFLINE 0x400
#define ACPIDEV_PROCESS_FLAG_NOTAG 0x800
#define ACPIDEV_PROCESS_FLAG_SYNCSTATUS 0x1000
#define ACPIDEV_PROCESS_FLAG_HOLDBRANCH 0x10000
extern acpidev_filter_result_t acpidev_filter_device(acpidev_walk_info_t *infop,
ACPI_HANDLE hdl, acpidev_filter_rule_t *afrp, int entries,
char *devname, int len);
extern acpidev_filter_result_t acpidev_filter_default(
acpidev_walk_info_t *infop, ACPI_HANDLE hdl, acpidev_filter_rule_t *afrp,
char *devname, int len);
extern dev_info_t *acpidev_root_node(void);
extern char *acpidev_get_object_name(ACPI_HANDLE hdl);
extern void acpidev_free_object_name(char *objname);
extern acpidev_walk_info_t *acpidev_alloc_walk_info(acpidev_op_type_t op_type,
int lvl, ACPI_HANDLE hdl, acpidev_class_list_t **listpp,
acpidev_walk_info_t *pinfop);
extern void acpidev_free_walk_info(acpidev_walk_info_t *infop);
extern dev_info_t *acpidev_walk_info_get_pdip(acpidev_walk_info_t *infop);
extern acpidev_data_handle_t acpidev_data_get_handle(ACPI_HANDLE hdl);
extern acpidev_data_handle_t acpidev_data_create_handle(ACPI_HANDLE hdl);
extern void acpidev_data_destroy_handle(ACPI_HANDLE hdl);
extern ACPI_HANDLE acpidev_data_get_object(acpidev_data_handle_t hdl);
extern dev_info_t *acpidev_data_get_devinfo(acpidev_data_handle_t hdl);
extern int acpidev_data_get_status(acpidev_data_handle_t hdl);
extern boolean_t acpidev_data_dr_capable(acpidev_data_handle_t hdl);
extern boolean_t acpidev_data_dr_ready(acpidev_data_handle_t hdl);
extern boolean_t acpidev_data_dr_failed(acpidev_data_handle_t hdl);
extern void acpidev_data_set_flag(acpidev_data_handle_t hdl, uint32_t flag);
extern void acpidev_data_clear_flag(acpidev_data_handle_t hdl, uint32_t flag);
extern uint32_t acpidev_data_get_flag(acpidev_data_handle_t hdl, uint32_t flag);
#define ACPIDEV_DATA_HANDLER_READY 0x1
extern char *acpidev_generate_unitaddr(char *uid, char **fmts, size_t nfmt,
char *buf, size_t len);
extern ACPI_STATUS acpidev_set_unitaddr(acpidev_walk_info_t *infop,
char **fmts, size_t nfmt, char *unitaddr);
extern ACPI_STATUS acpidev_set_compatible(acpidev_walk_info_t *infop,
char **compat, int acount);
extern int acpidev_query_device_status(ACPI_HANDLE hdl);
extern boolean_t acpidev_check_device_present(int status);
extern boolean_t acpidev_check_device_enabled(int status);
extern boolean_t acpidev_match_device_id(ACPI_DEVICE_INFO *infop,
char **ids, int count);
extern ACPI_STATUS acpidev_get_device_by_id(ACPI_HANDLE hdl,
char **ids, int count, int maxdepth, boolean_t skip_non_exist,
ACPI_WALK_CALLBACK userfunc, void *userarg, void** retval);
typedef ACPI_STATUS (* acpidev_apic_walker_t)(ACPI_SUBTABLE_HEADER *, void *);
extern ACPI_STATUS acpidev_walk_apic(ACPI_BUFFER *bufp, ACPI_HANDLE hdl,
char *method, acpidev_apic_walker_t func, void *context);
extern ACPI_STATUS acpidev_eval_ost(ACPI_HANDLE hdl, uint32_t code,
uint32_t status, char *bufp, size_t len);
extern ACPI_STATUS acpidev_eval_ej0(ACPI_HANDLE hdl);
extern ACPI_STATUS acpidev_eval_pxm(ACPI_HANDLE hdl, uint32_t *idp);
#endif
#ifdef __cplusplus
}
#endif
#endif