b9d640760e
type is acpi_handle, to be used with the ACPI bus manager Change-Id: Ibbdd81a21bdd57fc651f7a7238e3676033204857 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2456 Reviewed-by: Rene Gollent <rene@gollent.com>
367 lines
9.9 KiB
C
367 lines
9.9 KiB
C
/*
|
|
* Copyright 2005-2008, Haiku Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License
|
|
*/
|
|
#ifndef _ACPI_H
|
|
#define _ACPI_H
|
|
|
|
|
|
#include <device_manager.h>
|
|
#include <KernelExport.h>
|
|
|
|
|
|
typedef struct acpi_module_info acpi_module_info;
|
|
typedef union acpi_object_type acpi_object_type;
|
|
|
|
#define B_ACPI_MODULE_NAME "bus_managers/acpi/v1"
|
|
|
|
typedef phys_addr_t acpi_physical_address;
|
|
typedef phys_addr_t acpi_io_address;
|
|
typedef size_t acpi_size;
|
|
|
|
/* Actually a ptr to a NS Node */
|
|
typedef void * acpi_handle;
|
|
|
|
#ifndef __ACTYPES_H__
|
|
|
|
/* Notify types */
|
|
|
|
#define ACPI_SYSTEM_NOTIFY 0x1
|
|
#define ACPI_DEVICE_NOTIFY 0x2
|
|
#define ACPI_ALL_NOTIFY (ACPI_SYSTEM_NOTIFY | ACPI_DEVICE_NOTIFY)
|
|
#define ACPI_MAX_NOTIFY_HANDLER_TYPE 0x3
|
|
|
|
#define ACPI_MAX_SYS_NOTIFY 0x7F
|
|
|
|
/* Address Space (Operation Region) Types */
|
|
|
|
enum {
|
|
ACPI_ADR_SPACE_SYSTEM_MEMORY = 0,
|
|
ACPI_ADR_SPACE_SYSTEM_IO = 1,
|
|
ACPI_ADR_SPACE_PCI_CONFIG = 2,
|
|
ACPI_ADR_SPACE_EC = 3,
|
|
ACPI_ADR_SPACE_SMBUS = 4,
|
|
ACPI_ADR_SPACE_CMOS = 5,
|
|
ACPI_ADR_SPACE_PCI_BAR_TARGET = 6,
|
|
ACPI_ADR_SPACE_IPMI = 7,
|
|
ACPI_ADR_SPACE_DATA_TABLE = 8,
|
|
ACPI_ADR_SPACE_FIXED_HARDWARE = 127
|
|
};
|
|
|
|
/* ACPI fixed event types */
|
|
|
|
enum {
|
|
ACPI_EVENT_PMTIMER = 0,
|
|
ACPI_EVENT_GLOBAL,
|
|
ACPI_EVENT_POWER_BUTTON,
|
|
ACPI_EVENT_SLEEP_BUTTON,
|
|
ACPI_EVENT_RTC
|
|
};
|
|
|
|
/* ACPI Object Types */
|
|
|
|
enum {
|
|
ACPI_TYPE_ANY = 0,
|
|
ACPI_TYPE_INTEGER,
|
|
ACPI_TYPE_STRING,
|
|
ACPI_TYPE_BUFFER,
|
|
ACPI_TYPE_PACKAGE,
|
|
ACPI_TYPE_FIELD_UNIT,
|
|
ACPI_TYPE_DEVICE,
|
|
ACPI_TYPE_EVENT,
|
|
ACPI_TYPE_METHOD,
|
|
ACPI_TYPE_MUTEX,
|
|
ACPI_TYPE_REGION,
|
|
ACPI_TYPE_POWER,
|
|
ACPI_TYPE_PROCESSOR,
|
|
ACPI_TYPE_THERMAL,
|
|
ACPI_TYPE_BUFFER_FIELD,
|
|
ACPI_TYPE_DDB_HANDLE,
|
|
ACPI_TYPE_DEBUG_OBJECT,
|
|
ACPI_TYPE_LOCAL_REFERENCE = 0x14
|
|
};
|
|
|
|
/* ACPI control method arg type */
|
|
|
|
union acpi_object_type {
|
|
uint32 object_type;
|
|
struct {
|
|
uint32 object_type;
|
|
uint64 integer;
|
|
} integer;
|
|
struct {
|
|
uint32 object_type;
|
|
uint32 len;
|
|
char *string; /* You have to allocate string space yourself */
|
|
} string;
|
|
struct {
|
|
uint32 object_type;
|
|
uint32 length;
|
|
void *buffer;
|
|
} buffer;
|
|
struct {
|
|
uint32 object_type;
|
|
uint32 count;
|
|
acpi_object_type *objects;
|
|
} package;
|
|
struct {
|
|
uint32 object_type;
|
|
uint32 actual_type;
|
|
acpi_handle handle;
|
|
} reference;
|
|
struct {
|
|
uint32 object_type;
|
|
uint32 cpu_id;
|
|
acpi_io_address pblk_address;
|
|
uint32 pblk_length;
|
|
} processor;
|
|
struct {
|
|
uint32 object_type;
|
|
uint32 min_power_state;
|
|
uint32 resource_order;
|
|
} power_resource;
|
|
};
|
|
|
|
|
|
/*
|
|
* List of objects, used as a parameter list for control method evaluation
|
|
*/
|
|
typedef struct acpi_objects {
|
|
uint32 count;
|
|
acpi_object_type *pointer;
|
|
} acpi_objects;
|
|
|
|
|
|
typedef struct acpi_data {
|
|
acpi_size length; /* Length in bytes of the buffer */
|
|
void *pointer; /* pointer to buffer */
|
|
} acpi_data;
|
|
|
|
|
|
enum {
|
|
ACPI_ALLOCATE_BUFFER = -1,
|
|
ACPI_ALLOCATE_LOCAL_BUFFER = -2,
|
|
};
|
|
|
|
|
|
/*
|
|
* acpi_status should return ACPI specific error codes, not BeOS ones.
|
|
*/
|
|
typedef uint32 acpi_status;
|
|
|
|
typedef struct acpi_resource acpi_resource;
|
|
|
|
#define ACPI_REENABLE_GPE 0x80
|
|
|
|
|
|
#endif // __ACTYPES_H__
|
|
|
|
|
|
typedef uint32 (*acpi_event_handler)(void *context);
|
|
typedef uint32 (*acpi_gpe_handler) (acpi_handle GpeDevice, uint32 GpeNumber,
|
|
void *context);
|
|
|
|
typedef acpi_status (*acpi_adr_space_handler)(uint32 function,
|
|
acpi_physical_address address, uint32 bitWidth, int *value,
|
|
void *handlerContext, void *regionContext);
|
|
|
|
typedef acpi_status (*acpi_adr_space_setup)(acpi_handle regionHandle,
|
|
uint32 function, void *handlerContext, void **regionContext);
|
|
|
|
typedef void (*acpi_notify_handler)(acpi_handle device, uint32 value,
|
|
void *context);
|
|
|
|
typedef acpi_status (*acpi_walk_resources_callback)(acpi_resource* resource,
|
|
void* context);
|
|
|
|
typedef acpi_status (*acpi_walk_callback) (acpi_handle object, uint32 nestingLevel,
|
|
void *context, void** returnValue);
|
|
|
|
|
|
struct acpi_module_info {
|
|
module_info info;
|
|
|
|
status_t (*get_handle)(acpi_handle parent, const char *pathname,
|
|
acpi_handle *retHandle);
|
|
status_t (*get_name)(acpi_handle handle, uint32 nameType,
|
|
char* returnedName, size_t bufferLength);
|
|
|
|
/* Global Lock */
|
|
|
|
status_t (*acquire_global_lock)(uint16 timeout, uint32 *handle);
|
|
status_t (*release_global_lock)(uint32 handle);
|
|
|
|
/* Notify Handler */
|
|
|
|
status_t (*install_notify_handler)(acpi_handle device,
|
|
uint32 handlerType, acpi_notify_handler handler,
|
|
void *context);
|
|
status_t (*remove_notify_handler)(acpi_handle device,
|
|
uint32 handlerType, acpi_notify_handler handler);
|
|
|
|
/* GPE Handler */
|
|
|
|
status_t (*update_all_gpes)();
|
|
status_t (*enable_gpe)(acpi_handle handle, uint32 gpeNumber);
|
|
status_t (*disable_gpe)(acpi_handle handle, uint32 gpeNumber);
|
|
status_t (*clear_gpe)(acpi_handle handle, uint32 gpeNumber);
|
|
status_t (*set_gpe)(acpi_handle handle, uint32 gpeNumber,
|
|
uint8 action);
|
|
status_t (*finish_gpe)(acpi_handle handle, uint32 gpeNumber);
|
|
status_t (*install_gpe_handler)(acpi_handle handle, uint32 gpeNumber,
|
|
uint32 type, acpi_gpe_handler handler, void *data);
|
|
status_t (*remove_gpe_handler)(acpi_handle handle, uint32 gpeNumber,
|
|
acpi_gpe_handler address);
|
|
|
|
/* Address Space Handler */
|
|
|
|
status_t (*install_address_space_handler)(acpi_handle handle,
|
|
uint32 spaceId,
|
|
acpi_adr_space_handler handler,
|
|
acpi_adr_space_setup setup, void *data);
|
|
status_t (*remove_address_space_handler)(acpi_handle handle,
|
|
uint32 spaceId,
|
|
acpi_adr_space_handler handler);
|
|
|
|
/* Fixed Event Management */
|
|
|
|
void (*enable_fixed_event)(uint32 event);
|
|
void (*disable_fixed_event)(uint32 event);
|
|
|
|
uint32 (*fixed_event_status) (uint32 event);
|
|
/* Returns 1 if event set, 0 otherwise */
|
|
void (*reset_fixed_event) (uint32 event);
|
|
|
|
status_t (*install_fixed_event_handler)(uint32 event,
|
|
acpi_event_handler handler, void *data);
|
|
status_t (*remove_fixed_event_handler)(uint32 event,
|
|
acpi_event_handler handler);
|
|
|
|
/* Namespace Access */
|
|
|
|
status_t (*get_next_entry)(uint32 objectType, const char *base,
|
|
char *result, size_t length, void **_counter);
|
|
status_t (*get_next_object)(uint32 objectType, acpi_handle parent,
|
|
acpi_handle* currentChild);
|
|
status_t (*walk_namespace)(acpi_handle busDeviceHandle,
|
|
uint32 objectType, uint32 maxDepth,
|
|
acpi_walk_callback descendingCallback,
|
|
acpi_walk_callback ascendingCallback, void* context,
|
|
void** returnValue);
|
|
|
|
status_t (*get_device)(const char *hid, uint32 index, char *result,
|
|
size_t resultLength);
|
|
|
|
status_t (*get_device_info)(const char *path, char** hid,
|
|
char** cidList, size_t cidListLength);
|
|
uint32 (*get_object_type)(const char *path);
|
|
status_t (*get_object)(const char *path,
|
|
acpi_object_type **_returnValue);
|
|
status_t (*get_object_typed)(const char *path,
|
|
acpi_object_type **_returnValue, uint32 objectType);
|
|
status_t (*ns_handle_to_pathname)(acpi_handle targetHandle,
|
|
acpi_data *buffer);
|
|
|
|
/* Control method execution and data acquisition */
|
|
|
|
status_t (*evaluate_object)(acpi_handle handle, const char* object,
|
|
acpi_objects *args, acpi_object_type *returnValue, size_t bufferLength);
|
|
status_t (*evaluate_method)(acpi_handle handle, const char *method,
|
|
acpi_objects *args, acpi_data *returnValue);
|
|
|
|
/* Resource Management */
|
|
|
|
status_t (*get_irq_routing_table)(acpi_handle busDeviceHandle,
|
|
acpi_data *retBuffer);
|
|
status_t (*get_current_resources)(acpi_handle busDeviceHandle,
|
|
acpi_data *retBuffer);
|
|
status_t (*get_possible_resources)(acpi_handle busDeviceHandle,
|
|
acpi_data *retBuffer);
|
|
status_t (*set_current_resources)(acpi_handle busDeviceHandle,
|
|
acpi_data *buffer);
|
|
status_t (*walk_resources)(acpi_handle busDeviceHandle,
|
|
char *method, acpi_walk_resources_callback callback,
|
|
void* context);
|
|
|
|
/* Power state setting */
|
|
|
|
status_t (*prepare_sleep_state)(uint8 state, void (*wakeFunc)(void),
|
|
size_t size);
|
|
status_t (*enter_sleep_state)(uint8 state);
|
|
status_t (*reboot)(void);
|
|
|
|
/* Table Access */
|
|
status_t (*get_table)(const char *signature, uint32 instance,
|
|
void **tableHeader);
|
|
|
|
/* Register Access */
|
|
status_t (*read_bit_register)(uint32 regid, uint32 *val);
|
|
status_t (*write_bit_register)(uint32 regid, uint32 val);
|
|
};
|
|
|
|
|
|
/* Sleep states */
|
|
|
|
enum {
|
|
ACPI_POWER_STATE_ON = 0,
|
|
ACPI_POWER_STATE_SLEEP_S1,
|
|
ACPI_POWER_STATE_SLEEP_S2,
|
|
ACPI_POWER_STATE_SLEEP_S3,
|
|
ACPI_POWER_STATE_HIBERNATE,
|
|
ACPI_POWER_STATE_OFF
|
|
};
|
|
|
|
|
|
#define ACPI_DEVICE_ADDR_ITEM "acpi/addr"
|
|
#define ACPI_DEVICE_CID_ITEM "acpi/cid"
|
|
#define ACPI_DEVICE_HANDLE_ITEM "acpi/handle"
|
|
#define ACPI_DEVICE_HID_ITEM "acpi/hid"
|
|
#define ACPI_DEVICE_PATH_ITEM "acpi/path"
|
|
#define ACPI_DEVICE_TYPE_ITEM "acpi/type"
|
|
|
|
|
|
typedef struct acpi_device_cookie *acpi_device;
|
|
|
|
// Interface to one ACPI device.
|
|
typedef struct acpi_device_module_info {
|
|
driver_module_info info;
|
|
|
|
/* Notify Handler */
|
|
|
|
status_t (*install_notify_handler)(acpi_device device,
|
|
uint32 handlerType, acpi_notify_handler handler,
|
|
void *context);
|
|
status_t (*remove_notify_handler)(acpi_device device,
|
|
uint32 handlerType, acpi_notify_handler handler);
|
|
|
|
/* Address Space Handler */
|
|
status_t (*install_address_space_handler)(acpi_device device,
|
|
uint32 spaceId,
|
|
acpi_adr_space_handler handler,
|
|
acpi_adr_space_setup setup, void *data);
|
|
status_t (*remove_address_space_handler)(acpi_device device,
|
|
uint32 spaceId,
|
|
acpi_adr_space_handler handler);
|
|
|
|
/* Namespace Access */
|
|
uint32 (*get_object_type)(acpi_device device);
|
|
status_t (*get_object)(acpi_device device, const char *path,
|
|
acpi_object_type **_returnValue);
|
|
status_t (*walk_namespace)(acpi_device device,
|
|
uint32 objectType, uint32 maxDepth,
|
|
acpi_walk_callback descendingCallback,
|
|
acpi_walk_callback ascendingCallback,
|
|
void* context, void** returnValue);
|
|
|
|
/* Control method execution and data acquisition */
|
|
status_t (*evaluate_method)(acpi_device device, const char *method,
|
|
acpi_objects *args, acpi_data *returnValue);
|
|
|
|
/* Resource Management */
|
|
status_t (*walk_resources)(acpi_device device, char *method,
|
|
acpi_walk_resources_callback callback, void* context);
|
|
} acpi_device_module_info;
|
|
|
|
|
|
#endif /* _ACPI_H */
|