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