:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / drivers / bus / acpi / ospm / include / bm.h
1 /*****************************************************************************
2  *
3  * Module name: bm.h
4  *   $Revision$
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__ */