1/* 2 * Copyright 2005-2008, Haiku Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License 4 */ 5#ifndef _ACPI_H 6#define _ACPI_H 7 8 9#include <device_manager.h> 10#include <KernelExport.h> 11 12 13typedef struct acpi_module_info acpi_module_info; 14typedef struct acpi_object_type acpi_object_type; 15 16#define B_ACPI_MODULE_NAME "bus_managers/acpi/v1" 17 18typedef addr_t acpi_physical_address; 19typedef addr_t acpi_io_address; 20typedef size_t acpi_size; 21 22/* Actually a ptr to a NS Node */ 23typedef void * acpi_handle; 24 25#ifndef __ACTYPES_H__ 26 27/* Notify types */ 28 29#define ACPI_SYSTEM_NOTIFY 0x1 30#define ACPI_DEVICE_NOTIFY 0x2 31#define ACPI_ALL_NOTIFY (ACPI_SYSTEM_NOTIFY | ACPI_DEVICE_NOTIFY) 32#define ACPI_MAX_NOTIFY_HANDLER_TYPE 0x3 33 34#define ACPI_MAX_SYS_NOTIFY 0x7F 35 36/* Address Space (Operation Region) Types */ 37 38enum { 39 ACPI_ADR_SPACE_SYSTEM_MEMORY = 0, 40 ACPI_ADR_SPACE_SYSTEM_IO = 1, 41 ACPI_ADR_SPACE_PCI_CONFIG = 2, 42 ACPI_ADR_SPACE_EC = 3, 43 ACPI_ADR_SPACE_SMBUS = 4, 44 ACPI_ADR_SPACE_CMOS = 5, 45 ACPI_ADR_SPACE_PCI_BAR_TARGET = 6, 46 ACPI_ADR_SPACE_IPMI = 7, 47 ACPI_ADR_SPACE_DATA_TABLE = 8, 48 ACPI_ADR_SPACE_FIXED_HARDWARE = 127 49}; 50 51/* ACPI fixed event types */ 52 53enum { 54 ACPI_EVENT_PMTIMER = 0, 55 ACPI_EVENT_GLOBAL, 56 ACPI_EVENT_POWER_BUTTON, 57 ACPI_EVENT_SLEEP_BUTTON, 58 ACPI_EVENT_RTC 59}; 60 61/* ACPI Object Types */ 62 63enum { 64 ACPI_TYPE_ANY = 0, 65 ACPI_TYPE_INTEGER, 66 ACPI_TYPE_STRING, 67 ACPI_TYPE_BUFFER, 68 ACPI_TYPE_PACKAGE, 69 ACPI_TYPE_FIELD_UNIT, 70 ACPI_TYPE_DEVICE, 71 ACPI_TYPE_EVENT, 72 ACPI_TYPE_METHOD, 73 ACPI_TYPE_MUTEX, 74 ACPI_TYPE_REGION, 75 ACPI_TYPE_POWER, 76 ACPI_TYPE_PROCESSOR, 77 ACPI_TYPE_THERMAL, 78 ACPI_TYPE_BUFFER_FIELD, 79 ACPI_TYPE_DDB_HANDLE, 80 ACPI_TYPE_DEBUG_OBJECT, 81 ACPI_TYPE_LOCAL_REFERENCE = 0x14 82}; 83 84/* ACPI control method arg type */ 85 86struct acpi_object_type { 87 uint32 object_type; 88 union { 89 uint64 integer; 90 struct { 91 uint32 len; 92 char *string; /* You have to allocate string space yourself */ 93 } string; 94 struct { 95 size_t length; 96 void *buffer; 97 } buffer; 98 struct { 99 uint32 count; 100 acpi_object_type *objects; 101 } package; 102 struct { 103 uint32 actual_type; 104 acpi_handle handle; 105 } reference; 106 struct { 107 uint32 cpu_id; 108 int pblk_address; 109 size_t pblk_length; 110 } processor; 111 struct { 112 uint32 min_power_state; 113 uint32 resource_order; 114 } power_resource; 115 } data; 116}; 117 118 119/* 120 * List of objects, used as a parameter list for control method evaluation 121 */ 122typedef struct acpi_objects { 123 uint32 count; 124 acpi_object_type *pointer; 125} acpi_objects; 126 127 128typedef struct acpi_data { 129 acpi_size length; /* Length in bytes of the buffer */ 130 void *pointer; /* pointer to buffer */ 131} acpi_data; 132 133 134enum { 135 ACPI_ALLOCATE_BUFFER = -1, 136 ACPI_ALLOCATE_LOCAL_BUFFER = -2, 137}; 138 139 140/* 141 * acpi_status should return ACPI specific error codes, not BeOS ones. 142 */ 143typedef uint32 acpi_status; 144 145#endif // __ACTYPES_H__ 146 147 148typedef uint32 (*acpi_event_handler)(void *Context); 149typedef uint32 (*acpi_gpe_handler) (acpi_handle GpeDevice, uint32 GpeNumber, 150 void *Context); 151 152typedef acpi_status (*acpi_adr_space_handler)(uint32 function, 153 acpi_physical_address address, uint32 bitWidth, int *value, 154 void *handlerContext, void *regionContext); 155 156typedef acpi_status (*acpi_adr_space_setup)(acpi_handle regionHandle, 157 uint32 function, void *handlerContext, void **regionContext); 158 159typedef void (*acpi_notify_handler)(acpi_handle device, uint32 value, 160 void *context); 161 162 163struct acpi_module_info { 164 module_info info; 165 166 status_t (*get_handle)(acpi_handle parent, const char *pathname, 167 acpi_handle *retHandle); 168 169 /* Global Lock */ 170 171 status_t (*acquire_global_lock)(uint16 timeout, uint32 *handle); 172 status_t (*release_global_lock)(uint32 handle); 173 174 /* Notify Handler */ 175 176 status_t (*install_notify_handler)(acpi_handle device, 177 uint32 handlerType, acpi_notify_handler handler, 178 void *context); 179 status_t (*remove_notify_handler)(acpi_handle device, 180 uint32 handlerType, acpi_notify_handler handler); 181 182 /* GPE Handler */ 183 184 status_t (*update_all_gpes)(); 185 status_t (*enable_gpe)(acpi_handle handle, uint32 gpeNumber); 186 status_t (*disable_gpe)(acpi_handle handle, uint32 gpeNumber); 187 status_t (*clear_gpe)(acpi_handle handle, uint32 gpeNumber); 188 status_t (*set_gpe)(acpi_handle handle, uint32 gpeNumber, 189 uint8 action); 190 status_t (*finish_gpe)(acpi_handle handle, uint32 gpeNumber); 191 status_t (*install_gpe_handler)(acpi_handle handle, uint32 gpeNumber, 192 uint32 type, acpi_gpe_handler handler, void *data); 193 status_t (*remove_gpe_handler)(acpi_handle handle, uint32 gpeNumber, 194 acpi_gpe_handler address); 195 196 /* Address Space Handler */ 197 198 status_t (*install_address_space_handler)(acpi_handle handle, 199 uint32 spaceId, 200 acpi_adr_space_handler handler, 201 acpi_adr_space_setup setup, void *data); 202 status_t (*remove_address_space_handler)(acpi_handle handle, 203 uint32 spaceId, 204 acpi_adr_space_handler handler); 205 206 /* Fixed Event Management */ 207 208 void (*enable_fixed_event)(uint32 event); 209 void (*disable_fixed_event)(uint32 event); 210 211 uint32 (*fixed_event_status) (uint32 event); 212 /* Returns 1 if event set, 0 otherwise */ 213 void (*reset_fixed_event) (uint32 event); 214 215 status_t (*install_fixed_event_handler)(uint32 event, 216 interrupt_handler *handler, void *data); 217 status_t (*remove_fixed_event_handler)(uint32 event, 218 interrupt_handler *handler); 219 220 /* Namespace Access */ 221 222 status_t (*get_next_entry)(uint32 objectType, const char *base, 223 char *result, size_t length, void **_counter); 224 status_t (*get_device)(const char *hid, uint32 index, char *result, 225 size_t resultLength); 226 227 status_t (*get_device_hid)(const char *path, char *hid, 228 size_t hidLength); 229 uint32 (*get_object_type)(const char *path); 230 status_t (*get_object)(const char *path, 231 acpi_object_type **_returnValue); 232 status_t (*get_object_typed)(const char *path, 233 acpi_object_type **_returnValue, uint32 objectType); 234 status_t (*ns_handle_to_pathname)(acpi_handle targetHandle, 235 acpi_data *buffer); 236 237 /* Control method execution and data acquisition */ 238 239 status_t (*evaluate_object)(acpi_handle handle, const char* object, 240 acpi_objects *args, acpi_object_type *returnValue, size_t bufferLength); 241 status_t (*evaluate_method)(acpi_handle handle, const char *method, 242 acpi_objects *args, acpi_data *returnValue); 243 244 /* Resource Management */ 245 246 status_t (*get_irq_routing_table)(acpi_handle busDeviceHandle, 247 acpi_data *retBuffer); 248 status_t (*get_current_resources)(acpi_handle busDeviceHandle, 249 acpi_data *retBuffer); 250 status_t (*get_possible_resources)(acpi_handle busDeviceHandle, 251 acpi_data *retBuffer); 252 status_t (*set_current_resources)(acpi_handle busDeviceHandle, 253 acpi_data *buffer); 254 255 /* Power state setting */ 256 257 status_t (*prepare_sleep_state)(uint8 state, void (*wakeFunc)(void), 258 size_t size); 259 status_t (*enter_sleep_state)(uint8 state); 260 status_t (*reboot)(void); 261 262 /* Table Access */ 263 status_t (*get_table)(const char *signature, uint32 instance, 264 void **tableHeader); 265 266 /* Register Access */ 267 status_t (*read_bit_register)(uint32 regid, uint32 *val); 268 status_t (*write_bit_register)(uint32 regid, uint32 val); 269}; 270 271 272/* Sleep states */ 273 274enum { 275 ACPI_POWER_STATE_ON = 0, 276 ACPI_POWER_STATE_SLEEP_S1, 277 ACPI_POWER_STATE_SLEEP_S2, 278 ACPI_POWER_STATE_SLEEP_S3, 279 ACPI_POWER_STATE_HIBERNATE, 280 ACPI_POWER_STATE_OFF 281}; 282 283 284#define ACPI_DEVICE_HID_ITEM "acpi/hid" 285#define ACPI_DEVICE_PATH_ITEM "acpi/path" 286#define ACPI_DEVICE_TYPE_ITEM "acpi/type" 287 288 289typedef struct acpi_device_cookie *acpi_device; 290 291// Interface to one ACPI device. 292typedef struct acpi_device_module_info { 293 driver_module_info info; 294 295 /* Notify Handler */ 296 297 status_t (*install_notify_handler)(acpi_device device, 298 uint32 handlerType, acpi_notify_handler handler, 299 void *context); 300 status_t (*remove_notify_handler)(acpi_device device, 301 uint32 handlerType, acpi_notify_handler handler); 302 303 /* Address Space Handler */ 304 status_t (*install_address_space_handler)(acpi_device device, 305 uint32 spaceId, 306 acpi_adr_space_handler handler, 307 acpi_adr_space_setup setup, void *data); 308 status_t (*remove_address_space_handler)(acpi_device device, 309 uint32 spaceId, 310 acpi_adr_space_handler handler); 311 312 /* Namespace Access */ 313 uint32 (*get_object_type)(acpi_device device); 314 status_t (*get_object)(acpi_device device, const char *path, 315 acpi_object_type **_returnValue); 316 317 /* Control method execution and data acquisition */ 318 status_t (*evaluate_method)(acpi_device device, const char *method, 319 acpi_objects *args, acpi_data *returnValue); 320} acpi_device_module_info; 321 322 323#endif /* _ACPI_H */ 324