2 * Copyright 2005-2008, Haiku Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License
9 #include <device_manager.h>
10 #include <KernelExport.h>
13 typedef struct acpi_module_info acpi_module_info
;
14 typedef union acpi_object_type acpi_object_type
;
16 #define B_ACPI_MODULE_NAME "bus_managers/acpi/v1"
18 typedef phys_addr_t acpi_physical_address
;
19 typedef phys_addr_t acpi_io_address
;
20 typedef size_t acpi_size
;
22 /* Actually a ptr to a NS Node */
23 typedef void * acpi_handle
;
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
34 #define ACPI_MAX_SYS_NOTIFY 0x7F
36 /* Address Space (Operation Region) Types */
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
51 /* ACPI fixed event types */
54 ACPI_EVENT_PMTIMER
= 0,
56 ACPI_EVENT_POWER_BUTTON
,
57 ACPI_EVENT_SLEEP_BUTTON
,
61 /* ACPI Object Types */
78 ACPI_TYPE_BUFFER_FIELD
,
80 ACPI_TYPE_DEBUG_OBJECT
,
81 ACPI_TYPE_LOCAL_REFERENCE
= 0x14
84 /* ACPI control method arg type */
86 union acpi_object_type
{
95 char *string
; /* You have to allocate string space yourself */
105 acpi_object_type
*objects
;
115 acpi_io_address pblk_address
;
120 uint32 min_power_state
;
121 uint32 resource_order
;
127 * List of objects, used as a parameter list for control method evaluation
129 typedef struct acpi_objects
{
131 acpi_object_type
*pointer
;
135 typedef struct acpi_data
{
136 acpi_size length
; /* Length in bytes of the buffer */
137 void *pointer
; /* pointer to buffer */
142 ACPI_ALLOCATE_BUFFER
= -1,
143 ACPI_ALLOCATE_LOCAL_BUFFER
= -2,
148 * acpi_status should return ACPI specific error codes, not BeOS ones.
150 typedef uint32 acpi_status
;
152 typedef struct acpi_resource acpi_resource
;
154 #define ACPI_REENABLE_GPE 0x80
157 #endif // __ACTYPES_H__
160 typedef uint32 (*acpi_event_handler
)(void *context
);
161 typedef uint32 (*acpi_gpe_handler
) (acpi_handle GpeDevice
, uint32 GpeNumber
,
164 typedef acpi_status (*acpi_adr_space_handler
)(uint32 function
,
165 acpi_physical_address address
, uint32 bitWidth
, int *value
,
166 void *handlerContext
, void *regionContext
);
168 typedef acpi_status (*acpi_adr_space_setup
)(acpi_handle regionHandle
,
169 uint32 function
, void *handlerContext
, void **regionContext
);
171 typedef void (*acpi_notify_handler
)(acpi_handle device
, uint32 value
,
174 typedef acpi_status (*acpi_walk_resources_callback
)(acpi_resource
* resource
,
178 struct acpi_module_info
{
181 status_t (*get_handle
)(acpi_handle parent
, const char *pathname
,
182 acpi_handle
*retHandle
);
183 status_t (*get_name
)(acpi_handle handle
, uint32 nameType
,
184 char* returnedName
, size_t bufferLength
);
188 status_t (*acquire_global_lock
)(uint16 timeout
, uint32
*handle
);
189 status_t (*release_global_lock
)(uint32 handle
);
193 status_t (*install_notify_handler
)(acpi_handle device
,
194 uint32 handlerType
, acpi_notify_handler handler
,
196 status_t (*remove_notify_handler
)(acpi_handle device
,
197 uint32 handlerType
, acpi_notify_handler handler
);
201 status_t (*update_all_gpes
)();
202 status_t (*enable_gpe
)(acpi_handle handle
, uint32 gpeNumber
);
203 status_t (*disable_gpe
)(acpi_handle handle
, uint32 gpeNumber
);
204 status_t (*clear_gpe
)(acpi_handle handle
, uint32 gpeNumber
);
205 status_t (*set_gpe
)(acpi_handle handle
, uint32 gpeNumber
,
207 status_t (*finish_gpe
)(acpi_handle handle
, uint32 gpeNumber
);
208 status_t (*install_gpe_handler
)(acpi_handle handle
, uint32 gpeNumber
,
209 uint32 type
, acpi_gpe_handler handler
, void *data
);
210 status_t (*remove_gpe_handler
)(acpi_handle handle
, uint32 gpeNumber
,
211 acpi_gpe_handler address
);
213 /* Address Space Handler */
215 status_t (*install_address_space_handler
)(acpi_handle handle
,
217 acpi_adr_space_handler handler
,
218 acpi_adr_space_setup setup
, void *data
);
219 status_t (*remove_address_space_handler
)(acpi_handle handle
,
221 acpi_adr_space_handler handler
);
223 /* Fixed Event Management */
225 void (*enable_fixed_event
)(uint32 event
);
226 void (*disable_fixed_event
)(uint32 event
);
228 uint32 (*fixed_event_status
) (uint32 event
);
229 /* Returns 1 if event set, 0 otherwise */
230 void (*reset_fixed_event
) (uint32 event
);
232 status_t (*install_fixed_event_handler
)(uint32 event
,
233 acpi_event_handler handler
, void *data
);
234 status_t (*remove_fixed_event_handler
)(uint32 event
,
235 acpi_event_handler handler
);
237 /* Namespace Access */
239 status_t (*get_next_entry
)(uint32 objectType
, const char *base
,
240 char *result
, size_t length
, void **_counter
);
241 status_t (*get_next_object
)(uint32 objectType
, acpi_handle parent
,
242 acpi_handle
* currentChild
);
243 status_t (*get_device
)(const char *hid
, uint32 index
, char *result
,
244 size_t resultLength
);
246 status_t (*get_device_hid
)(const char *path
, char *hid
,
248 uint32 (*get_object_type
)(const char *path
);
249 status_t (*get_object
)(const char *path
,
250 acpi_object_type
**_returnValue
);
251 status_t (*get_object_typed
)(const char *path
,
252 acpi_object_type
**_returnValue
, uint32 objectType
);
253 status_t (*ns_handle_to_pathname
)(acpi_handle targetHandle
,
256 /* Control method execution and data acquisition */
258 status_t (*evaluate_object
)(acpi_handle handle
, const char* object
,
259 acpi_objects
*args
, acpi_object_type
*returnValue
, size_t bufferLength
);
260 status_t (*evaluate_method
)(acpi_handle handle
, const char *method
,
261 acpi_objects
*args
, acpi_data
*returnValue
);
263 /* Resource Management */
265 status_t (*get_irq_routing_table
)(acpi_handle busDeviceHandle
,
266 acpi_data
*retBuffer
);
267 status_t (*get_current_resources
)(acpi_handle busDeviceHandle
,
268 acpi_data
*retBuffer
);
269 status_t (*get_possible_resources
)(acpi_handle busDeviceHandle
,
270 acpi_data
*retBuffer
);
271 status_t (*set_current_resources
)(acpi_handle busDeviceHandle
,
273 status_t (*walk_resources
)(acpi_handle busDeviceHandle
,
274 char *method
, acpi_walk_resources_callback callback
,
277 /* Power state setting */
279 status_t (*prepare_sleep_state
)(uint8 state
, void (*wakeFunc
)(void),
281 status_t (*enter_sleep_state
)(uint8 state
);
282 status_t (*reboot
)(void);
285 status_t (*get_table
)(const char *signature
, uint32 instance
,
288 /* Register Access */
289 status_t (*read_bit_register
)(uint32 regid
, uint32
*val
);
290 status_t (*write_bit_register
)(uint32 regid
, uint32 val
);
297 ACPI_POWER_STATE_ON
= 0,
298 ACPI_POWER_STATE_SLEEP_S1
,
299 ACPI_POWER_STATE_SLEEP_S2
,
300 ACPI_POWER_STATE_SLEEP_S3
,
301 ACPI_POWER_STATE_HIBERNATE
,
306 #define ACPI_DEVICE_HID_ITEM "acpi/hid"
307 #define ACPI_DEVICE_PATH_ITEM "acpi/path"
308 #define ACPI_DEVICE_TYPE_ITEM "acpi/type"
311 typedef struct acpi_device_cookie
*acpi_device
;
313 // Interface to one ACPI device.
314 typedef struct acpi_device_module_info
{
315 driver_module_info info
;
319 status_t (*install_notify_handler
)(acpi_device device
,
320 uint32 handlerType
, acpi_notify_handler handler
,
322 status_t (*remove_notify_handler
)(acpi_device device
,
323 uint32 handlerType
, acpi_notify_handler handler
);
325 /* Address Space Handler */
326 status_t (*install_address_space_handler
)(acpi_device device
,
328 acpi_adr_space_handler handler
,
329 acpi_adr_space_setup setup
, void *data
);
330 status_t (*remove_address_space_handler
)(acpi_device device
,
332 acpi_adr_space_handler handler
);
334 /* Namespace Access */
335 uint32 (*get_object_type
)(acpi_device device
);
336 status_t (*get_object
)(acpi_device device
, const char *path
,
337 acpi_object_type
**_returnValue
);
339 /* Control method execution and data acquisition */
340 status_t (*evaluate_method
)(acpi_device device
, const char *method
,
341 acpi_objects
*args
, acpi_data
*returnValue
);
343 /* Resource Management */
344 status_t (*walk_resources
)(acpi_device device
, char *method
,
345 acpi_walk_resources_callback callback
, void* context
);
346 } acpi_device_module_info
;