| .. SPDX-License-Identifier: GPL-2.0-or-later |
| |
| ================== |
| ACPI WMI interface |
| ================== |
| |
| The ACPI WMI interface is a proprietary extension of the ACPI specification made |
| by Microsoft to allow hardware vendors to embed WMI (Windows Management Instrumentation) |
| objects inside their ACPI firmware. Typical functions implemented over ACPI WMI |
| are hotkey events on modern notebooks and configuration of BIOS options. |
| |
| PNP0C14 ACPI device |
| ------------------- |
| |
| Discovery of WMI objects is handled by defining ACPI devices with a PNP ID |
| of ``PNP0C14``. These devices will contain a set of ACPI buffers and methods |
| used for mapping and execution of WMI methods and/or queries. If there exist |
| multiple of such devices, then each device is required to have a |
| unique ACPI UID. |
| |
| _WDG buffer |
| ----------- |
| |
| The ``_WDG`` buffer is used to discover WMI objects and is required to be |
| static. Its internal structure consists of data blocks with a size of 20 bytes, |
| containing the following data: |
| |
| ======= =============== ===================================================== |
| Offset Size (in bytes) Content |
| ======= =============== ===================================================== |
| 0x00 16 128 bit Variant 2 object GUID. |
| 0x10 2 2 character method ID or single byte notification ID. |
| 0x12 1 Object instance count. |
| 0x13 1 Object flags. |
| ======= =============== ===================================================== |
| |
| The WMI object flags control whether the method or notification ID is used: |
| |
| - 0x1: Data block usage is expensive and must be explicitly enabled/disabled. |
| - 0x2: Data block contains WMI methods. |
| - 0x4: Data block contains ASCIZ string. |
| - 0x8: Data block describes a WMI event, use notification ID instead |
| of method ID. |
| |
| Each WMI object GUID can appear multiple times inside a system. |
| The method/notification ID is used to construct the ACPI method names used for |
| interacting with the WMI object. |
| |
| WQxx ACPI methods |
| ----------------- |
| |
| If a data block does not contain WMI methods, then its content can be retrieved |
| by this required ACPI method. The last two characters of the ACPI method name |
| are the method ID of the data block to query. Their single parameter is an |
| integer describing the instance which should be queried. This parameter can be |
| omitted if the data block contains only a single instance. |
| |
| WSxx ACPI methods |
| ----------------- |
| |
| Similar to the ``WQxx`` ACPI methods, except that it is optional and takes an |
| additional buffer as its second argument. The instance argument also cannot |
| be omitted. |
| |
| WMxx ACPI methods |
| ----------------- |
| |
| Used for executing WMI methods associated with a data block. The last two |
| characters of the ACPI method name are the method ID of the data block |
| containing the WMI methods. Their first parameter is a integer describing the |
| instance which methods should be executed. The second parameter is an integer |
| describing the WMI method ID to execute, and the third parameter is a buffer |
| containing the WMI method parameters. If the data block is marked as containing |
| an ASCIZ string, then this buffer should contain an ASCIZ string. The ACPI |
| method will return the result of the executed WMI method. |
| |
| WExx ACPI methods |
| ----------------- |
| |
| Used for optionally enabling/disabling WMI events, the last two characters of |
| the ACPI method are the notification ID of the data block describing the WMI |
| event as hexadecimal value. Their first parameter is an integer with a value |
| of 0 if the WMI event should be disabled, other values will enable |
| the WMI event. |
| |
| WCxx ACPI methods |
| ----------------- |
| Similar to the ``WExx`` ACPI methods, except that it controls data collection |
| instead of events and thus the last two characters of the ACPI method name are |
| the method ID of the data block to enable/disable. |
| |
| _WED ACPI method |
| ---------------- |
| |
| Used to retrieve additional WMI event data, its single parameter is a integer |
| holding the notification ID of the event. This method should be evaluated every |
| time an ACPI notification is received, since some ACPI implementations use a |
| queue to store WMI event data items. This queue will overflow after a couple |
| of WMI events are received without retrieving the associated WMI event data. |