scroll mode for very long start menus
[reactos.git] / reactos / drivers / bus / acpi / ospm / include / bm.h
1 /*****************************************************************************
2 *
3 * Module name: bm.h
4 * $Revision: 1.1 $
5 *
6 *****************************************************************************/
7
8 /*
9 * Copyright (C) 2000, 2001 Andrew Grover
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
26 #ifndef __BM_H__
27 #define __BM_H__
28
29 #include <actypes.h>
30 #include <acexcep.h>
31
32
33 /*****************************************************************************
34 * Types & Defines
35 *****************************************************************************/
36
37 /*
38 * Output Flags (Debug):
39 * ---------------------
40 */
41 #define BM_PRINT_ALL (0x00000000)
42 #define BM_PRINT_GROUP (0x00000001)
43 #define BM_PRINT_LINKAGE (0x00000002)
44 #define BM_PRINT_IDENTIFICATION (0x00000004)
45 #define BM_PRINT_POWER (0x00000008)
46 #define BM_PRINT_PRESENT (0x00000010)
47
48
49 /*
50 * /proc Interface:
51 * ----------------
52 */
53 #define BM_PROC_ROOT "acpi"
54 #define BM_PROC_EVENT "event"
55
56 extern struct proc_dir_entry *bm_proc_root;
57
58
59 /*
60 * BM_COMMAND:
61 * -----------
62 */
63 typedef u32 BM_COMMAND;
64
65 #define BM_COMMAND_UNKNOWN ((BM_COMMAND) 0x00)
66
67 #define BM_COMMAND_GET_POWER_STATE ((BM_COMMAND) 0x01)
68 #define BM_COMMAND_SET_POWER_STATE ((BM_COMMAND) 0x02)
69
70 #define BM_COMMAND_DEVICE_SPECIFIC ((BM_COMMAND) 0x80)
71
72 /*
73 * BM_NOTIFY:
74 * ----------
75 * Standard ACPI notification values, from section 5.6.3 of the ACPI 2.0
76 * specification. Note that the Bus Manager internally handles all
77 * standard ACPI notifications -- driver modules are never sent these
78 * values (see "Bus Manager Notifications", below).
79 */
80 typedef u32 BM_NOTIFY;
81
82 #define BM_NOTIFY_BUS_CHECK ((BM_NOTIFY) 0x00)
83 #define BM_NOTIFY_DEVICE_CHECK ((BM_NOTIFY) 0x01)
84 #define BM_NOTIFY_DEVICE_WAKE ((BM_NOTIFY) 0x02)
85 #define BM_NOTIFY_EJECT_REQUEST ((BM_NOTIFY) 0x03)
86 #define BM_NOTIFY_DEVICE_CHECK_LIGHT ((BM_NOTIFY) 0x04)
87 #define BM_NOTIFY_FREQUENCY_MISMATCH ((BM_NOTIFY) 0x05)
88 #define BM_NOTIFY_BUS_MODE_MISMATCH ((BM_NOTIFY) 0x06)
89 #define BM_NOTIFY_POWER_FAULT ((BM_NOTIFY) 0x07)
90
91 /*
92 * These are a higher-level abstraction of ACPI notifications, intended
93 * for consumption by driver modules to facilitate PnP.
94 */
95 #define BM_NOTIFY_UNKNOWN ((BM_NOTIFY) 0x00)
96 #define BM_NOTIFY_DEVICE_ADDED ((BM_NOTIFY) 0x01)
97 #define BM_NOTIFY_DEVICE_REMOVED ((BM_NOTIFY) 0x02)
98
99
100 /*
101 * BM_HANDLE:
102 * ----------
103 */
104 typedef u32 BM_HANDLE;
105
106 #define BM_HANDLE_UNKNOWN ((BM_HANDLE) 0x00)
107 #define BM_HANDLE_ROOT ((BM_HANDLE) 0x00)
108 #define BM_HANDLES_MAX 256
109
110
111
112 /*
113 * BM_HANDLE_LIST:
114 * ---------------
115 */
116 typedef struct
117 {
118 u32 count;
119 BM_HANDLE handles[BM_HANDLES_MAX];
120 } BM_HANDLE_LIST;
121
122
123 /*
124 * BM_DEVICE_TYPE:
125 * ---------------
126 */
127 typedef u32 BM_DEVICE_TYPE;
128
129 #define BM_TYPE_UNKNOWN ((BM_DEVICE_TYPE) 0x00000000)
130
131 #define BM_TYPE_SCOPE ((BM_DEVICE_TYPE) 0x00000001)
132 #define BM_TYPE_PROCESSOR ((BM_DEVICE_TYPE) 0x00000002)
133 #define BM_TYPE_THERMAL_ZONE ((BM_DEVICE_TYPE) 0x00000004)
134 #define BM_TYPE_POWER_RESOURCE ((BM_DEVICE_TYPE) 0x00000008)
135 #define BM_TYPE_DEVICE ((BM_DEVICE_TYPE) 0x00000010)
136 #define BM_TYPE_FIXED_BUTTON ((BM_DEVICE_TYPE) 0x00000020)
137 #define BM_TYPE_SYSTEM ((BM_DEVICE_TYPE) 0x80000000)
138 #define BM_TYPE_ALL ((BM_DEVICE_TYPE) 0xFFFFFFFF)
139
140
141 /*
142 * BM_DEVICE_UID:
143 * --------------
144 */
145 typedef char BM_DEVICE_UID[9];
146
147 #define BM_UID_UNKNOWN '0'
148
149
150 /*
151 * BM_DEVICE_HID:
152 * --------------
153 */
154 typedef char BM_DEVICE_HID[9];
155
156 #define BM_HID_UNKNOWN '\0'
157 #define BM_HID_POWER_BUTTON "PNP0C0C"
158 #define BM_HID_SLEEP_BUTTON "PNP0C0E"
159
160 /*
161 * BM_DEVICE_CID:
162 * The compatibility ID can be a string with 44 characters
163 * The extra pad is in case there is a change. It also
164 * provides 8 byte alignment for the BM_DEVICE_ID structure.
165 * -------------------------------------------------------------
166 */
167 typedef char BM_DEVICE_CID[46];
168
169
170 /*
171 * BM_DEVICE_ADR:
172 * --------------
173 */
174 typedef u32 BM_DEVICE_ADR;
175
176 #define BM_ADDRESS_UNKNOWN 0
177
178
179 /*
180 * BM_DEVICE_FLAGS:
181 * ----------------
182 * The encoding of BM_DEVICE_FLAGS is illustrated below.
183 * Note that a set bit (1) indicates the property is TRUE
184 * (e.g. if bit 0 is set then the device has dynamic status).
185 * +--+------------+-+-+-+-+-+-+-+
186 * |31| Bits 31:11 |6|5|4|3|2|1|0|
187 * +--+------------+-+-+-+-+-+-+-+
188 * | | | | | | | | |
189 * | | | | | | | | +- Dynamic status?
190 * | | | | | | | +--- Identifiable?
191 * | | | | | | +----- Configurable?
192 * | | | | | +------- Power Manageable?
193 * | | | | +--------- Ejectable?
194 * | | | +----------- Docking Station?
195 * | | +------------- Fixed-Feature?
196 * | +-------------------- <Reserved>
197 * +---------------------------- Driver Control?
198 *
199 * Dynamic status: Device has a _STA object.
200 * Identifiable: Device has a _HID and/or _ADR and possibly other
201 * identification objects defined.
202 * Configurable: Device has a _CRS and possibly other configuration
203 * objects defined.
204 * Power Control: Device has a _PR0 and/or _PS0 and possibly other
205 * power management objects defined.
206 * Ejectable: Device has an _EJD and/or _EJx and possibly other
207 * dynamic insertion/removal objects defined.
208 * Docking Station: Device has a _DCK object defined.
209 * Fixed-Feature: Device does not exist in the namespace; was
210 * enumerated as a fixed-feature (e.g. power button).
211 * Power Manageable:Can change device's power consumption behavior.
212 * Has a HID: In the BIOS ASL this device has a hardware ID as
213 * defined in section 6.1.4 of ACPI Spec 2.0
214 * Has a CID: In the BIOS ASL this device has a compatible ID as
215 * defined in section 6.1.2 of ACPI Spec 2.0
216 * Has a ADR: In the BIOS ASL this device has an address ID as
217 * defined in section 6.1.1 of ACPI Spec 2.0
218 * Is a bridge: This device is recognized as a bridge to another bus.
219 * Is on PCI bus: This device is on a PCI bus or within PCI configuration
220 * address space.
221 * Is on USB bus: This device is on or within USB address space.
222 * Is on SCSI bus: This device is on or within SCSI address space.
223 * Driver Control: A driver has been installed for this device.
224 */
225 typedef u32 BM_DEVICE_FLAGS;
226
227 #define BM_FLAGS_UNKNOWN ((BM_DEVICE_FLAGS) 0x00000000)
228
229 #define BM_FLAGS_DYNAMIC_STATUS ((BM_DEVICE_FLAGS) 0x00000001)
230 #define BM_FLAGS_IDENTIFIABLE ((BM_DEVICE_FLAGS) 0x00000002)
231 #define BM_FLAGS_CONFIGURABLE ((BM_DEVICE_FLAGS) 0x00000004)
232 #define BM_FLAGS_POWER_CONTROL ((BM_DEVICE_FLAGS) 0x00000008)
233 #define BM_FLAGS_EJECTABLE ((BM_DEVICE_FLAGS) 0x00000010)
234 #define BM_FLAGS_DOCKING_STATION ((BM_DEVICE_FLAGS) 0x00000020)
235 #define BM_FLAGS_FIXED_FEATURE ((BM_DEVICE_FLAGS) 0x00000040)
236 #define BM_FLAGS_IS_POWER_MANAGEABLE ((BM_DEVICE_FLAGS) 0x00000080)
237 #define BM_FLAGS_HAS_A_HID ((BM_DEVICE_FLAGS) 0x00000100)
238 #define BM_FLAGS_HAS_A_CID ((BM_DEVICE_FLAGS) 0x00000200)
239 #define BM_FLAGS_HAS_A_ADR ((BM_DEVICE_FLAGS) 0x00000400)
240 #define BM_FLAGS_IS_A_BRIDGE ((BM_DEVICE_FLAGS) 0x00000800)
241 #define BM_FLAGS_IS_ON_PCI_BUS ((BM_DEVICE_FLAGS) 0x00001000)
242 #define BM_FLAGS_IS_ON_USB_BUS ((BM_DEVICE_FLAGS) 0x00002000)
243 #define BM_FLAGS_IS_ON_SCSI_BUS ((BM_DEVICE_FLAGS) 0x00004000)
244 #define BM_FLAGS_DRIVER_CONTROL ((BM_DEVICE_FLAGS) 0x80000000)
245
246 /*
247 * Device PM Flags:
248 * ----------------
249 * +-----------+-+-+-+-+-+-+-+
250 * | Bits 31:7 |6|5|4|3|2|1|0|
251 * +-----------+-+-+-+-+-+-+-+
252 * | | | | | | | |
253 * | | | | | | | +- D0 Support?
254 * | | | | | | +--- D1 Support?
255 * | | | | | +----- D2 Support?
256 * | | | | +------- D3 Support?
257 * | | | +--------- Power State Queriable?
258 * | | +----------- Inrush Current?
259 * | +------------- Wake Capable?
260 * +-------------------- <Reserved>
261 *
262 * D0-D3 Support: Device supports corresponding Dx state.
263 * Power State: Device has a _PSC (current power state) object defined.
264 * Inrush Current: Device has an _IRC (inrush current) object defined.
265 * Wake Capable: Device has a _PRW (wake-capable) object defined.
266 */
267 #define BM_FLAGS_D0_SUPPORT ((BM_DEVICE_FLAGS) 0x00000001)
268 #define BM_FLAGS_D1_SUPPORT ((BM_DEVICE_FLAGS) 0x00000002)
269 #define BM_FLAGS_D2_SUPPORT ((BM_DEVICE_FLAGS) 0x00000004)
270 #define BM_FLAGS_D3_SUPPORT ((BM_DEVICE_FLAGS) 0x00000008)
271 #define BM_FLAGS_POWER_STATE ((BM_DEVICE_FLAGS) 0x00000010)
272 #define BM_FLAGS_INRUSH_CURRENT ((BM_DEVICE_FLAGS) 0x00000020)
273 #define BM_FLAGS_WAKE_CAPABLE ((BM_DEVICE_FLAGS) 0x00000040)
274
275
276 /*
277 * BM_DEVICE_STATUS:
278 * -----------------
279 * The encoding of BM_DEVICE_STATUS is illustrated below.
280 * Note that a set bit (1) indicates the property is TRUE
281 * (e.g. if bit 0 is set then the device is present).
282 * +-----------+-+-+-+-+-+
283 * | Bits 31:4 |4|3|2|1|0|
284 * +-----------+-+-+-+-+-+
285 * | | | | | |
286 * | | | | | +- Present?
287 * | | | | +--- Enabled?
288 * | | | +----- Show in UI?
289 * | | +------- Functioning?
290 * | +--------- Battery Present?
291 * +---------------- <Reserved>
292 */
293 typedef u32 BM_DEVICE_STATUS;
294
295 #define BM_STATUS_UNKNOWN ((BM_DEVICE_STATUS) 0x00000000)
296 #define BM_STATUS_PRESENT ((BM_DEVICE_STATUS) 0x00000001)
297 #define BM_STATUS_ENABLED ((BM_DEVICE_STATUS) 0x00000002)
298 #define BM_STATUS_SHOW_UI ((BM_DEVICE_STATUS) 0x00000004)
299 #define BM_STATUS_FUNCTIONING ((BM_DEVICE_STATUS) 0x00000008)
300 #define BM_STATUS_BATTERY_PRESENT ((BM_DEVICE_STATUS) 0x00000010)
301 #define BM_STATUS_DEFAULT ((BM_DEVICE_STATUS) 0x0000000F)
302
303
304 typedef u32 BM_POWER_STATE;
305
306 typedef u8 BM_PCI_BUS_NUM;
307 typedef u8 BM_PCI_DEVICE_NUM;
308 typedef u8 BM_PCI_FUNCTION_NUM;
309 typedef u8 BM_U8_RESERVED;
310 typedef u8 BM_PCI_DEVICE_CLASS_ID;
311 typedef u8 BM_PCI_DEVICE_SUBCLASS_ID;
312 typedef u8 BM_PCI_DEVICE_PROG_IF;
313 typedef u8 BM_PCI_DEVICE_REVISION;
314 typedef u16 BM_PCI_VENDOR_ID;
315 typedef u16 BM_PCI_DEVICE_ID;
316 typedef u32 BM_U32_RESERVED;
317
318
319 /*
320 * BM_DEVICE_ID:
321 * This structure, when filled in for a device, provides
322 * an "association" between hardware space and ACPI.
323 * -----------------------------------------------------------
324 */
325 typedef struct
326 {
327 BM_DEVICE_CID cid;
328 BM_DEVICE_HID hid;
329 BM_DEVICE_UID uid;
330 BM_DEVICE_TYPE type;
331 BM_DEVICE_ADR adr;
332 BM_PCI_BUS_NUM pci_bus_num;
333 BM_PCI_DEVICE_NUM pci_device_num;
334 BM_PCI_FUNCTION_NUM pci_func_num;
335 BM_U8_RESERVED u8_reserved;
336 BM_PCI_DEVICE_CLASS_ID pci_device_class_id;
337 BM_PCI_DEVICE_SUBCLASS_ID pci_device_subclass_id;
338 BM_PCI_DEVICE_PROG_IF pci_device_prog_if;
339 BM_PCI_DEVICE_REVISION pci_device_rev_num;
340 BM_PCI_VENDOR_ID pci_vendor_id;
341 BM_PCI_DEVICE_ID pci_device_id;
342 BM_U32_RESERVED u32_reserved;
343 } BM_DEVICE_ID;
344
345
346 /*
347 * BM_DEVICE_POWER:
348 * ----------------
349 * Structure containing basic device power management information.
350 */
351 typedef struct
352 {
353 BM_DEVICE_FLAGS flags;
354 BM_POWER_STATE state;
355 BM_DEVICE_FLAGS dx_supported[ACPI_S_STATE_COUNT];
356 } BM_DEVICE_POWER;
357
358
359 /*
360 * BM_DEVICE:
361 * ----------
362 */
363 typedef struct
364 {
365 BM_HANDLE handle;
366 ACPI_HANDLE acpi_handle;
367 BM_DEVICE_FLAGS flags;
368 BM_DEVICE_STATUS status;
369 BM_DEVICE_ID id;
370 BM_DEVICE_POWER power;
371 } BM_DEVICE;
372
373
374 /*
375 * BM_SEARCH:
376 * ----------
377 * Structure used for searching the ACPI Bus Manager's device hierarchy.
378 */
379 typedef struct
380 {
381 BM_DEVICE_ID criteria;
382 BM_HANDLE_LIST results;
383 } BM_SEARCH;
384
385
386 /*
387 * BM_REQUEST:
388 * -----------
389 * Structure used for sending requests to/through the ACPI Bus Manager.
390 */
391 typedef struct
392 {
393 ACPI_STATUS status;
394 BM_COMMAND command;
395 BM_HANDLE handle;
396 ACPI_BUFFER buffer;
397 } BM_REQUEST;
398
399
400 /*
401 * Driver Registration:
402 * --------------------
403 */
404
405 /* Driver Context */
406 typedef void * BM_DRIVER_CONTEXT;
407
408 /* Notification Callback Function */
409 typedef
410 ACPI_STATUS (*BM_DRIVER_NOTIFY) (
411 BM_NOTIFY notify_type,
412 BM_HANDLE device_handle,
413 BM_DRIVER_CONTEXT *context);
414
415 /* Request Callback Function */
416 typedef
417 ACPI_STATUS (*BM_DRIVER_REQUEST) (
418 BM_REQUEST *request,
419 BM_DRIVER_CONTEXT context);
420
421 /* Driver Registration */
422 typedef struct
423 {
424 BM_DRIVER_NOTIFY notify;
425 BM_DRIVER_REQUEST request;
426 BM_DRIVER_CONTEXT context;
427 } BM_DRIVER;
428
429
430 /*
431 * BM_NODE:
432 * --------
433 * Structure used to maintain the device hierarchy.
434 */
435 typedef struct _BM_NODE
436 {
437 BM_DEVICE device;
438 BM_DRIVER driver;
439 struct _BM_NODE *parent;
440 struct _BM_NODE *next;
441 struct
442 {
443 struct _BM_NODE *head;
444 struct _BM_NODE *tail;
445 } scope;
446 } BM_NODE;
447
448
449 /*
450 * BM_NODE_LIST:
451 * -------------
452 * Structure used to maintain an array of node pointers.
453 */
454 typedef struct
455 {
456 u32 count;
457 BM_NODE *nodes[BM_HANDLES_MAX];
458 } BM_NODE_LIST;
459
460
461 /*****************************************************************************
462 * Macros
463 *****************************************************************************/
464
465 #define BM_DEVICE_PRESENT(d) (d->status & BM_STATUS_PRESENT)
466 #define BM_NODE_PRESENT(n) (n->device.status & BM_STATUS_PRESENT)
467
468
469 /*****************************************************************************
470 * Function Prototypes
471 *****************************************************************************/
472
473 /* bm.c */
474
475 ACPI_STATUS
476 bm_initialize (void);
477
478 ACPI_STATUS
479 bm_terminate (void);
480
481 ACPI_STATUS
482 bm_get_status (
483 BM_DEVICE *device);
484
485 ACPI_STATUS
486 bm_get_handle (
487 ACPI_HANDLE acpi_handle,
488 BM_HANDLE *device_handle);
489
490 ACPI_STATUS
491 bm_get_node (
492 BM_HANDLE device_handle,
493 ACPI_HANDLE acpi_handle,
494 BM_NODE **node);
495
496 /* bmsearch.c */
497
498 ACPI_STATUS
499 bm_search(
500 BM_HANDLE device_handle,
501 BM_DEVICE_ID *criteria,
502 BM_HANDLE_LIST *results);
503
504 /* bmnotify.c */
505
506 void
507 bm_notify (
508 ACPI_HANDLE acpi_handle,
509 u32 notify_value,
510 void *context);
511
512 /* bm_request.c */
513
514 ACPI_STATUS
515 bm_request (
516 BM_REQUEST *request_info);
517
518 /* bmxface.c */
519
520 ACPI_STATUS
521 bm_get_device_status (
522 BM_HANDLE device_handle,
523 BM_DEVICE_STATUS *device_status);
524
525 ACPI_STATUS
526 bm_get_device_info (
527 BM_HANDLE device_handle,
528 BM_DEVICE **device_info);
529
530 ACPI_STATUS
531 bm_get_device_context (
532 BM_HANDLE device_handle,
533 BM_DRIVER_CONTEXT *context);
534
535 ACPI_STATUS
536 bm_register_driver (
537 BM_DEVICE_ID *criteria,
538 BM_DRIVER *driver);
539
540 ACPI_STATUS
541 bm_unregister_driver (
542 BM_DEVICE_ID *criteria,
543 BM_DRIVER *driver);
544
545 /* bmpm.c */
546
547 ACPI_STATUS
548 bm_get_pm_capabilities (
549 BM_NODE *node);
550
551 ACPI_STATUS
552 bm_get_power_state (
553 BM_NODE *node);
554
555 ACPI_STATUS
556 bm_set_power_state (
557 BM_NODE *node,
558 BM_POWER_STATE target_state);
559
560 /* bmpower.c */
561
562 ACPI_STATUS
563 bm_pr_initialize (void);
564
565 ACPI_STATUS
566 bm_pr_terminate (void);
567
568 /* bmutils.c */
569
570 ACPI_STATUS
571 bm_cast_buffer (
572 ACPI_BUFFER *buffer,
573 void **pointer,
574 u32 length);
575
576 ACPI_STATUS
577 bm_copy_to_buffer (
578 ACPI_BUFFER *buffer,
579 void *data,
580 u32 length);
581
582 ACPI_STATUS
583 bm_extract_package_data (
584 ACPI_OBJECT *package,
585 ACPI_BUFFER *format,
586 ACPI_BUFFER *buffer);
587
588 ACPI_STATUS
589 bm_evaluate_object (
590 ACPI_HANDLE acpi_handle,
591 ACPI_STRING pathname,
592 ACPI_OBJECT_LIST *arguments,
593 ACPI_BUFFER *buffer);
594
595 ACPI_STATUS
596 bm_evaluate_simple_integer (
597 ACPI_HANDLE acpi_handle,
598 ACPI_STRING pathname,
599 u32 *data);
600
601 ACPI_STATUS
602 bm_evaluate_reference_list (
603 ACPI_HANDLE acpi_handle,
604 ACPI_STRING pathname,
605 BM_HANDLE_LIST *reference_list);
606
607 /* bm_proc.c */
608
609 ACPI_STATUS
610 bm_proc_initialize (void);
611
612 ACPI_STATUS
613 bm_proc_terminate (void);
614
615 ACPI_STATUS
616 bm_generate_event (
617 BM_HANDLE device_handle,
618 char *device_type,
619 char *device_instance,
620 u32 event_type,
621 u32 event_data);
622
623
624 #endif /* __BM_H__ */