@@ -70,7 +70,7 @@ to matching WMI devices using a struct wmi_device_id table:
7070 .probe = foo_probe,
7171 .remove = foo_remove, /* optional, devres is preferred */
7272 .shutdown = foo_shutdown, /* optional, called during shutdown */
73- .notify = foo_notify, /* optional, for event handling */
73+ .notify_new = foo_notify, /* optional, for event handling */
7474 .no_notify_data = true, /* optional, enables events containing no additional data */
7575 .no_singleton = true, /* required for new WMI drivers */
7676 };
@@ -90,9 +90,9 @@ the WMI device and put it in a well-known state for the WMI driver to pick up la
9090or kexec. Most WMI drivers need no special shutdown handling and can thus omit this callback.
9191
9292Please note that new WMI drivers are required to be able to be instantiated multiple times,
93- and are forbidden from using any deprecated GUID-based WMI functions. This means that the
94- WMI driver should be prepared for the scenario that multiple matching WMI devices are present
95- on a given machine.
93+ and are forbidden from using any deprecated GUID-based or ACPI-based WMI functions. This means
94+ that the WMI driver should be prepared for the scenario that multiple matching WMI devices are
95+ present on a given machine.
9696
9797Because of this, WMI drivers should use the state container design pattern as described in
9898Documentation/driver-api/driver-model/design-patterns.rst.
@@ -104,38 +104,37 @@ Documentation/driver-api/driver-model/design-patterns.rst.
104104WMI method drivers
105105------------------
106106
107- WMI drivers can call WMI device methods using wmidev_evaluate_method(), the
108- structure of the ACPI buffer passed to this function is device-specific and usually
109- needs some tinkering to get right. Looking at the ACPI tables containing the WMI
110- device usually helps here. The method id and instance number passed to this function
111- are also device-specific, looking at the decoded Binary MOF is usually enough to
112- find the right values.
107+ WMI drivers can call WMI device methods using wmidev_invoke_method(). For each WMI method
108+ invocation the WMI driver needs to provide the instance number and the method ID, as well as
109+ a buffer with the method arguments and optionally a buffer for the results.
113110
114- The maximum instance number can be retrieved during runtime using wmidev_instance_count().
111+ The layout of said buffers is device-specific and described by the Binary MOF data associated
112+ with a given WMI device. Said Binary MOF data also describes the method ID of a given WMI method
113+ with the ``WmiMethodId `` qualifier. WMI devices exposing WMI methods usually expose only a single
114+ instance (instance number 0), but in theory can expose multiple instances as well. In such a case
115+ the number of instances can be retrieved using wmidev_instance_count().
115116
116- Take a look at drivers/platform/x86/inspur_platform_profile .c for an example WMI method driver.
117+ Take a look at drivers/platform/x86/intel/wmi/thunderbolt .c for an example WMI method driver.
117118
118119WMI data block drivers
119120----------------------
120121
121- WMI drivers can query WMI device data blocks using wmidev_block_query(), the
122- structure of the returned ACPI object is again device-specific. Some WMI devices
123- also allow for setting data blocks using wmidev_block_set().
122+ WMI drivers can query WMI data blocks using wmidev_query_block(), the layout of the returned
123+ buffer is again device-specific and described by the Binary MOF data. Some WMI data blocks are
124+ also writeable and can be set using wmidev_set_block(). The number of data block instances can
125+ again be retrieved using wmidev_instance_count().
124126
125- The maximum instance number can also be retrieved using wmidev_instance_count().
126-
127- Take a look at drivers/platform/x86/intel/wmi/sbl-fw-update.c for an example
128- WMI data block driver.
127+ Take a look at drivers/platform/x86/intel/wmi/sbl-fw-update.c for an example WMI data block driver.
129128
130129WMI event drivers
131130-----------------
132131
133- WMI drivers can receive WMI events via the notify () callback inside the struct wmi_driver.
132+ WMI drivers can receive WMI events via the notify_new () callback inside the struct wmi_driver.
134133The WMI subsystem will then take care of setting up the WMI event accordingly. Please note that
135- the structure of the ACPI object passed to this callback is device-specific, and freeing the
136- ACPI object is being done by the WMI subsystem, not the driver.
134+ the layout of the buffer passed to this callback is device-specific, and freeing of the buffer
135+ is done by the WMI subsystem itself , not the driver.
137136
138- The WMI driver core will take care that the notify () callback will only be called after
137+ The WMI driver core will take care that the notify_new () callback will only be called after
139138the probe() callback has been called, and that no events are being received by the driver
140139right before and after calling its remove() or shutdown() callback.
141140
@@ -147,6 +146,36 @@ the ``no_notify_data`` flag inside struct wmi_driver should be set to ``true``.
147146
148147Take a look at drivers/platform/x86/xiaomi-wmi.c for an example WMI event driver.
149148
149+ Exchanging data with the WMI driver core
150+ ----------------------------------------
151+
152+ WMI drivers can exchange data with the WMI driver core using struct wmi_buffer. The internal
153+ structure of those buffers is device-specific and only known by the WMI driver. Because of this
154+ the WMI driver itself is responsible for parsing and validating the data received from its
155+ WMI device.
156+
157+ The structure of said buffers is described by the MOF data associated with the WMI device in
158+ question. When such a buffer contains multiple data items it usually makes sense to define a
159+ C structure and use it during parsing. Since the WMI driver core guarantees that all buffers
160+ received from a WMI device are aligned on an 8-byte boundary, WMI drivers can simply perform
161+ a cast between the WMI buffer data and this C structure.
162+
163+ This however should only be done after the size of the buffer was verified to be large enough
164+ to hold the whole C structure. WMI drivers should reject undersized buffers as they are usually
165+ sent by the WMI device to signal an internal error. Oversized buffers however should be accepted
166+ to emulate the behavior of the Windows WMI implementation.
167+
168+ When defining a C structure for parsing WMI buffers the alignment of the data items should be
169+ respected. This is especially important for 64-bit integers as those have different alignments
170+ on 64-bit (8-byte alignment) and 32-bit (4-byte alignment) architectures. It is thus a good idea
171+ to manually specify the alignment of such data items or mark the whole structure as packed when
172+ appropriate. Integer data items in general are little-endian integers and should be marked as
173+ such using ``__le64 `` and friends. When parsing WMI string data items the struct wmi_string should
174+ be used as WMI strings have a different layout than C strings.
175+
176+ See Documentation/wmi/acpi-interface.rst for more information regarding the binary format
177+ of WMI data items.
178+
150179Handling multiple WMI devices at once
151180-------------------------------------
152181
@@ -171,6 +200,7 @@ Things to avoid
171200When developing WMI drivers, there are a couple of things which should be avoided:
172201
173202- usage of the deprecated GUID-based WMI interface which uses GUIDs instead of WMI device structs
203+ - usage of the deprecated ACPI-based WMI interface which uses ACPI objects instead of plain buffers
174204- bypassing of the WMI subsystem when talking to WMI devices
175205- WMI drivers which cannot be instantiated multiple times.
176206
0 commit comments