1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ACPI-WMI mapping driver
5 * Copyright (C) 2007-2008 Carlos Corbacho <carlos@strangeworlds.co.uk>
7 * GUID parsing code from ldm.c is:
8 * Copyright (C) 2001,2002 Richard Russon <ldm@flatcap.org>
9 * Copyright (c) 2001-2007 Anton Altaparmakov
10 * Copyright (C) 2001,2002 Jakob Kemi <jakob.kemi@telia.com>
12 * WMI bus infrastructure by Andrew Lutomirski and Darren Hart:
13 * Copyright (C) 2015 Andrew Lutomirski
14 * Copyright (C) 2017 VMware, Inc. All Rights Reserved.
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19 #include <linux/acpi.h>
20 #include <linux/bits.h>
21 #include <linux/build_bug.h>
22 #include <linux/device.h>
23 #include <linux/init.h>
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/platform_device.h>
27 #include <linux/rwsem.h>
28 #include <linux/slab.h>
29 #include <linux/sysfs.h>
30 #include <linux/types.h>
31 #include <linux/uuid.h>
32 #include <linux/wmi.h>
35 MODULE_AUTHOR("Carlos Corbacho");
36 MODULE_DESCRIPTION("ACPI-WMI Mapping Driver");
37 MODULE_LICENSE("GPL");
44 unsigned char notify_id
;
45 unsigned char reserved
;
51 static_assert(sizeof(typeof_member(struct guid_block
, guid
)) == 16);
52 static_assert(sizeof(struct guid_block
) == 20);
53 static_assert(__alignof__(struct guid_block
) == 1);
55 enum { /* wmi_block flags */
56 WMI_READ_TAKES_NO_ARGS
,
62 struct wmi_device dev
;
63 struct guid_block gblock
;
64 struct acpi_device
*acpi_device
;
65 struct rw_semaphore notify_lock
; /* Protects notify callback add/remove */
66 wmi_notify_handler handler
;
72 struct wmi_guid_count_context
{
78 * If the GUID data block is marked as expensive, we must enable and
79 * explicitily disable data collection.
81 #define ACPI_WMI_EXPENSIVE BIT(0)
82 #define ACPI_WMI_METHOD BIT(1) /* GUID is a method */
83 #define ACPI_WMI_STRING BIT(2) /* GUID takes & returns a string */
84 #define ACPI_WMI_EVENT BIT(3) /* GUID is an event */
86 static const struct acpi_device_id wmi_device_ids
[] = {
91 MODULE_DEVICE_TABLE(acpi
, wmi_device_ids
);
93 #define dev_to_wblock(__dev) container_of_const(__dev, struct wmi_block, dev.dev)
96 * GUID parsing functions
99 static bool guid_parse_and_compare(const char *string
, const guid_t
*guid
)
103 if (guid_parse(string
, &guid_input
))
106 return guid_equal(&guid_input
, guid
);
109 static const void *find_guid_context(struct wmi_block
*wblock
,
110 struct wmi_driver
*wdriver
)
112 const struct wmi_device_id
*id
;
114 id
= wdriver
->id_table
;
118 while (*id
->guid_string
) {
119 if (guid_parse_and_compare(id
->guid_string
, &wblock
->gblock
.guid
))
126 static acpi_status
wmi_method_enable(struct wmi_block
*wblock
, bool enable
)
128 struct guid_block
*block
;
133 block
= &wblock
->gblock
;
134 handle
= wblock
->acpi_device
->handle
;
136 snprintf(method
, 5, "WE%02X", block
->notify_id
);
137 status
= acpi_execute_simple_method(handle
, method
, enable
);
138 if (status
== AE_NOT_FOUND
)
144 #define WMI_ACPI_METHOD_NAME_SIZE 5
146 static inline void get_acpi_method_name(const struct wmi_block
*wblock
,
148 char buffer
[static WMI_ACPI_METHOD_NAME_SIZE
])
150 static_assert(ARRAY_SIZE(wblock
->gblock
.object_id
) == 2);
151 static_assert(WMI_ACPI_METHOD_NAME_SIZE
>= 5);
155 buffer
[2] = wblock
->gblock
.object_id
[0];
156 buffer
[3] = wblock
->gblock
.object_id
[1];
160 static inline acpi_object_type
get_param_acpi_type(const struct wmi_block
*wblock
)
162 if (wblock
->gblock
.flags
& ACPI_WMI_STRING
)
163 return ACPI_TYPE_STRING
;
165 return ACPI_TYPE_BUFFER
;
168 static int wmidev_match_guid(struct device
*dev
, const void *data
)
170 struct wmi_block
*wblock
= dev_to_wblock(dev
);
171 const guid_t
*guid
= data
;
173 /* Legacy GUID-based functions are restricted to only see
174 * a single WMI device for each GUID.
176 if (test_bit(WMI_GUID_DUPLICATED
, &wblock
->flags
))
179 if (guid_equal(guid
, &wblock
->gblock
.guid
))
185 static const struct bus_type wmi_bus_type
;
187 static struct wmi_device
*wmi_find_device_by_guid(const char *guid_string
)
193 ret
= guid_parse(guid_string
, &guid
);
197 dev
= bus_find_device(&wmi_bus_type
, NULL
, &guid
, wmidev_match_guid
);
199 return ERR_PTR(-ENODEV
);
201 return to_wmi_device(dev
);
204 static void wmi_device_put(struct wmi_device
*wdev
)
206 put_device(&wdev
->dev
);
210 * Exported WMI functions
214 * wmi_instance_count - Get number of WMI object instances
215 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
217 * Get the number of WMI object instances.
219 * Returns: Number of WMI object instances or negative error code.
221 int wmi_instance_count(const char *guid_string
)
223 struct wmi_device
*wdev
;
226 wdev
= wmi_find_device_by_guid(guid_string
);
228 return PTR_ERR(wdev
);
230 ret
= wmidev_instance_count(wdev
);
231 wmi_device_put(wdev
);
235 EXPORT_SYMBOL_GPL(wmi_instance_count
);
238 * wmidev_instance_count - Get number of WMI object instances
239 * @wdev: A wmi bus device from a driver
241 * Get the number of WMI object instances.
243 * Returns: Number of WMI object instances.
245 u8
wmidev_instance_count(struct wmi_device
*wdev
)
247 struct wmi_block
*wblock
= container_of(wdev
, struct wmi_block
, dev
);
249 return wblock
->gblock
.instance_count
;
251 EXPORT_SYMBOL_GPL(wmidev_instance_count
);
254 * wmi_evaluate_method - Evaluate a WMI method (deprecated)
255 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
256 * @instance: Instance index
257 * @method_id: Method ID to call
258 * @in: Mandatory buffer containing input for the method call
259 * @out: Empty buffer to return the method results
261 * Call an ACPI-WMI method, the caller must free @out.
263 * Return: acpi_status signaling success or error.
265 acpi_status
wmi_evaluate_method(const char *guid_string
, u8 instance
, u32 method_id
,
266 const struct acpi_buffer
*in
, struct acpi_buffer
*out
)
268 struct wmi_device
*wdev
;
271 wdev
= wmi_find_device_by_guid(guid_string
);
275 status
= wmidev_evaluate_method(wdev
, instance
, method_id
, in
, out
);
277 wmi_device_put(wdev
);
281 EXPORT_SYMBOL_GPL(wmi_evaluate_method
);
284 * wmidev_evaluate_method - Evaluate a WMI method
285 * @wdev: A wmi bus device from a driver
286 * @instance: Instance index
287 * @method_id: Method ID to call
288 * @in: Mandatory buffer containing input for the method call
289 * @out: Empty buffer to return the method results
291 * Call an ACPI-WMI method, the caller must free @out.
293 * Return: acpi_status signaling success or error.
295 acpi_status
wmidev_evaluate_method(struct wmi_device
*wdev
, u8 instance
, u32 method_id
,
296 const struct acpi_buffer
*in
, struct acpi_buffer
*out
)
298 struct guid_block
*block
;
299 struct wmi_block
*wblock
;
301 struct acpi_object_list input
;
302 union acpi_object params
[3];
303 char method
[WMI_ACPI_METHOD_NAME_SIZE
];
305 wblock
= container_of(wdev
, struct wmi_block
, dev
);
306 block
= &wblock
->gblock
;
307 handle
= wblock
->acpi_device
->handle
;
312 if (!(block
->flags
& ACPI_WMI_METHOD
))
315 if (block
->instance_count
<= instance
)
316 return AE_BAD_PARAMETER
;
319 input
.pointer
= params
;
321 params
[0].type
= ACPI_TYPE_INTEGER
;
322 params
[0].integer
.value
= instance
;
323 params
[1].type
= ACPI_TYPE_INTEGER
;
324 params
[1].integer
.value
= method_id
;
325 params
[2].type
= get_param_acpi_type(wblock
);
326 params
[2].buffer
.length
= in
->length
;
327 params
[2].buffer
.pointer
= in
->pointer
;
329 get_acpi_method_name(wblock
, 'M', method
);
331 return acpi_evaluate_object(handle
, method
, &input
, out
);
333 EXPORT_SYMBOL_GPL(wmidev_evaluate_method
);
335 static acpi_status
__query_block(struct wmi_block
*wblock
, u8 instance
,
336 struct acpi_buffer
*out
)
338 struct guid_block
*block
;
340 acpi_status status
, wc_status
= AE_ERROR
;
341 struct acpi_object_list input
;
342 union acpi_object wq_params
[1];
343 char wc_method
[WMI_ACPI_METHOD_NAME_SIZE
];
344 char method
[WMI_ACPI_METHOD_NAME_SIZE
];
347 return AE_BAD_PARAMETER
;
349 block
= &wblock
->gblock
;
350 handle
= wblock
->acpi_device
->handle
;
352 if (block
->instance_count
<= instance
)
353 return AE_BAD_PARAMETER
;
355 /* Check GUID is a data block */
356 if (block
->flags
& (ACPI_WMI_EVENT
| ACPI_WMI_METHOD
))
360 input
.pointer
= wq_params
;
361 wq_params
[0].type
= ACPI_TYPE_INTEGER
;
362 wq_params
[0].integer
.value
= instance
;
364 if (instance
== 0 && test_bit(WMI_READ_TAKES_NO_ARGS
, &wblock
->flags
))
368 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method first to
371 if (block
->flags
& ACPI_WMI_EXPENSIVE
) {
372 get_acpi_method_name(wblock
, 'C', wc_method
);
375 * Some GUIDs break the specification by declaring themselves
376 * expensive, but have no corresponding WCxx method. So we
377 * should not fail if this happens.
379 wc_status
= acpi_execute_simple_method(handle
, wc_method
, 1);
382 get_acpi_method_name(wblock
, 'Q', method
);
383 status
= acpi_evaluate_object(handle
, method
, &input
, out
);
386 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if
387 * the WQxx method failed - we should disable collection anyway.
389 if ((block
->flags
& ACPI_WMI_EXPENSIVE
) && ACPI_SUCCESS(wc_status
)) {
391 * Ignore whether this WCxx call succeeds or not since
392 * the previously executed WQxx method call might have
393 * succeeded, and returning the failing status code
394 * of this call would throw away the result of the WQxx
395 * call, potentially leaking memory.
397 acpi_execute_simple_method(handle
, wc_method
, 0);
404 * wmi_query_block - Return contents of a WMI block (deprecated)
405 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
406 * @instance: Instance index
407 * @out: Empty buffer to return the contents of the data block to
409 * Query a ACPI-WMI block, the caller must free @out.
411 * Return: ACPI object containing the content of the WMI block.
413 acpi_status
wmi_query_block(const char *guid_string
, u8 instance
,
414 struct acpi_buffer
*out
)
416 struct wmi_block
*wblock
;
417 struct wmi_device
*wdev
;
420 wdev
= wmi_find_device_by_guid(guid_string
);
424 wblock
= container_of(wdev
, struct wmi_block
, dev
);
425 status
= __query_block(wblock
, instance
, out
);
427 wmi_device_put(wdev
);
431 EXPORT_SYMBOL_GPL(wmi_query_block
);
434 * wmidev_block_query - Return contents of a WMI block
435 * @wdev: A wmi bus device from a driver
436 * @instance: Instance index
438 * Query an ACPI-WMI block, the caller must free the result.
440 * Return: ACPI object containing the content of the WMI block.
442 union acpi_object
*wmidev_block_query(struct wmi_device
*wdev
, u8 instance
)
444 struct acpi_buffer out
= { ACPI_ALLOCATE_BUFFER
, NULL
};
445 struct wmi_block
*wblock
= container_of(wdev
, struct wmi_block
, dev
);
447 if (ACPI_FAILURE(__query_block(wblock
, instance
, &out
)))
452 EXPORT_SYMBOL_GPL(wmidev_block_query
);
455 * wmi_set_block - Write to a WMI block (deprecated)
456 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
457 * @instance: Instance index
458 * @in: Buffer containing new values for the data block
460 * Write the contents of the input buffer to an ACPI-WMI data block.
462 * Return: acpi_status signaling success or error.
464 acpi_status
wmi_set_block(const char *guid_string
, u8 instance
, const struct acpi_buffer
*in
)
466 struct wmi_device
*wdev
;
469 wdev
= wmi_find_device_by_guid(guid_string
);
473 status
= wmidev_block_set(wdev
, instance
, in
);
474 wmi_device_put(wdev
);
478 EXPORT_SYMBOL_GPL(wmi_set_block
);
481 * wmidev_block_set - Write to a WMI block
482 * @wdev: A wmi bus device from a driver
483 * @instance: Instance index
484 * @in: Buffer containing new values for the data block
486 * Write contents of the input buffer to an ACPI-WMI data block.
488 * Return: acpi_status signaling success or error.
490 acpi_status
wmidev_block_set(struct wmi_device
*wdev
, u8 instance
, const struct acpi_buffer
*in
)
492 struct wmi_block
*wblock
= container_of(wdev
, struct wmi_block
, dev
);
493 acpi_handle handle
= wblock
->acpi_device
->handle
;
494 struct guid_block
*block
= &wblock
->gblock
;
495 char method
[WMI_ACPI_METHOD_NAME_SIZE
];
496 struct acpi_object_list input
;
497 union acpi_object params
[2];
502 if (block
->instance_count
<= instance
)
503 return AE_BAD_PARAMETER
;
505 /* Check GUID is a data block */
506 if (block
->flags
& (ACPI_WMI_EVENT
| ACPI_WMI_METHOD
))
510 input
.pointer
= params
;
511 params
[0].type
= ACPI_TYPE_INTEGER
;
512 params
[0].integer
.value
= instance
;
513 params
[1].type
= get_param_acpi_type(wblock
);
514 params
[1].buffer
.length
= in
->length
;
515 params
[1].buffer
.pointer
= in
->pointer
;
517 get_acpi_method_name(wblock
, 'S', method
);
519 return acpi_evaluate_object(handle
, method
, &input
, NULL
);
521 EXPORT_SYMBOL_GPL(wmidev_block_set
);
524 * wmi_install_notify_handler - Register handler for WMI events (deprecated)
525 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
526 * @handler: Function to handle notifications
527 * @data: Data to be returned to handler when event is fired
529 * Register a handler for events sent to the ACPI-WMI mapper device.
531 * Return: acpi_status signaling success or error.
533 acpi_status
wmi_install_notify_handler(const char *guid
,
534 wmi_notify_handler handler
,
537 struct wmi_block
*wblock
;
538 struct wmi_device
*wdev
;
541 wdev
= wmi_find_device_by_guid(guid
);
545 wblock
= container_of(wdev
, struct wmi_block
, dev
);
547 down_write(&wblock
->notify_lock
);
548 if (wblock
->handler
) {
549 status
= AE_ALREADY_ACQUIRED
;
551 wblock
->handler
= handler
;
552 wblock
->handler_data
= data
;
554 if (ACPI_FAILURE(wmi_method_enable(wblock
, true)))
555 dev_warn(&wblock
->dev
.dev
, "Failed to enable device\n");
559 up_write(&wblock
->notify_lock
);
561 wmi_device_put(wdev
);
565 EXPORT_SYMBOL_GPL(wmi_install_notify_handler
);
568 * wmi_remove_notify_handler - Unregister handler for WMI events (deprecated)
569 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
571 * Unregister handler for events sent to the ACPI-WMI mapper device.
573 * Return: acpi_status signaling success or error.
575 acpi_status
wmi_remove_notify_handler(const char *guid
)
577 struct wmi_block
*wblock
;
578 struct wmi_device
*wdev
;
581 wdev
= wmi_find_device_by_guid(guid
);
585 wblock
= container_of(wdev
, struct wmi_block
, dev
);
587 down_write(&wblock
->notify_lock
);
588 if (!wblock
->handler
) {
589 status
= AE_NULL_ENTRY
;
591 if (ACPI_FAILURE(wmi_method_enable(wblock
, false)))
592 dev_warn(&wblock
->dev
.dev
, "Failed to disable device\n");
594 wblock
->handler
= NULL
;
595 wblock
->handler_data
= NULL
;
599 up_write(&wblock
->notify_lock
);
601 wmi_device_put(wdev
);
605 EXPORT_SYMBOL_GPL(wmi_remove_notify_handler
);
608 * wmi_has_guid - Check if a GUID is available
609 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
611 * Check if a given GUID is defined by _WDG.
613 * Return: True if GUID is available, false otherwise.
615 bool wmi_has_guid(const char *guid_string
)
617 struct wmi_device
*wdev
;
619 wdev
= wmi_find_device_by_guid(guid_string
);
623 wmi_device_put(wdev
);
627 EXPORT_SYMBOL_GPL(wmi_has_guid
);
630 * wmi_get_acpi_device_uid() - Get _UID name of ACPI device that defines GUID (deprecated)
631 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
633 * Find the _UID of ACPI device associated with this WMI GUID.
635 * Return: The ACPI _UID field value or NULL if the WMI GUID was not found.
637 char *wmi_get_acpi_device_uid(const char *guid_string
)
639 struct wmi_block
*wblock
;
640 struct wmi_device
*wdev
;
643 wdev
= wmi_find_device_by_guid(guid_string
);
647 wblock
= container_of(wdev
, struct wmi_block
, dev
);
648 uid
= acpi_device_uid(wblock
->acpi_device
);
650 wmi_device_put(wdev
);
654 EXPORT_SYMBOL_GPL(wmi_get_acpi_device_uid
);
659 static ssize_t
modalias_show(struct device
*dev
, struct device_attribute
*attr
,
662 struct wmi_block
*wblock
= dev_to_wblock(dev
);
664 return sysfs_emit(buf
, "wmi:%pUL\n", &wblock
->gblock
.guid
);
666 static DEVICE_ATTR_RO(modalias
);
668 static ssize_t
guid_show(struct device
*dev
, struct device_attribute
*attr
,
671 struct wmi_block
*wblock
= dev_to_wblock(dev
);
673 return sysfs_emit(buf
, "%pUL\n", &wblock
->gblock
.guid
);
675 static DEVICE_ATTR_RO(guid
);
677 static ssize_t
instance_count_show(struct device
*dev
,
678 struct device_attribute
*attr
, char *buf
)
680 struct wmi_block
*wblock
= dev_to_wblock(dev
);
682 return sysfs_emit(buf
, "%d\n", (int)wblock
->gblock
.instance_count
);
684 static DEVICE_ATTR_RO(instance_count
);
686 static ssize_t
expensive_show(struct device
*dev
,
687 struct device_attribute
*attr
, char *buf
)
689 struct wmi_block
*wblock
= dev_to_wblock(dev
);
691 return sysfs_emit(buf
, "%d\n",
692 (wblock
->gblock
.flags
& ACPI_WMI_EXPENSIVE
) != 0);
694 static DEVICE_ATTR_RO(expensive
);
696 static ssize_t
driver_override_show(struct device
*dev
, struct device_attribute
*attr
,
699 struct wmi_device
*wdev
= to_wmi_device(dev
);
703 ret
= sysfs_emit(buf
, "%s\n", wdev
->driver_override
);
709 static ssize_t
driver_override_store(struct device
*dev
, struct device_attribute
*attr
,
710 const char *buf
, size_t count
)
712 struct wmi_device
*wdev
= to_wmi_device(dev
);
715 ret
= driver_set_override(dev
, &wdev
->driver_override
, buf
, count
);
721 static DEVICE_ATTR_RW(driver_override
);
723 static struct attribute
*wmi_attrs
[] = {
724 &dev_attr_modalias
.attr
,
726 &dev_attr_instance_count
.attr
,
727 &dev_attr_expensive
.attr
,
728 &dev_attr_driver_override
.attr
,
731 ATTRIBUTE_GROUPS(wmi
);
733 static ssize_t
notify_id_show(struct device
*dev
, struct device_attribute
*attr
,
736 struct wmi_block
*wblock
= dev_to_wblock(dev
);
738 return sysfs_emit(buf
, "%02X\n", (unsigned int)wblock
->gblock
.notify_id
);
740 static DEVICE_ATTR_RO(notify_id
);
742 static struct attribute
*wmi_event_attrs
[] = {
743 &dev_attr_notify_id
.attr
,
746 ATTRIBUTE_GROUPS(wmi_event
);
748 static ssize_t
object_id_show(struct device
*dev
, struct device_attribute
*attr
,
751 struct wmi_block
*wblock
= dev_to_wblock(dev
);
753 return sysfs_emit(buf
, "%c%c\n", wblock
->gblock
.object_id
[0],
754 wblock
->gblock
.object_id
[1]);
756 static DEVICE_ATTR_RO(object_id
);
758 static ssize_t
setable_show(struct device
*dev
, struct device_attribute
*attr
,
761 struct wmi_device
*wdev
= to_wmi_device(dev
);
763 return sysfs_emit(buf
, "%d\n", (int)wdev
->setable
);
765 static DEVICE_ATTR_RO(setable
);
767 static struct attribute
*wmi_data_attrs
[] = {
768 &dev_attr_object_id
.attr
,
769 &dev_attr_setable
.attr
,
772 ATTRIBUTE_GROUPS(wmi_data
);
774 static struct attribute
*wmi_method_attrs
[] = {
775 &dev_attr_object_id
.attr
,
778 ATTRIBUTE_GROUPS(wmi_method
);
780 static int wmi_dev_uevent(const struct device
*dev
, struct kobj_uevent_env
*env
)
782 const struct wmi_block
*wblock
= dev_to_wblock(dev
);
784 if (add_uevent_var(env
, "MODALIAS=wmi:%pUL", &wblock
->gblock
.guid
))
787 if (add_uevent_var(env
, "WMI_GUID=%pUL", &wblock
->gblock
.guid
))
793 static void wmi_dev_release(struct device
*dev
)
795 struct wmi_block
*wblock
= dev_to_wblock(dev
);
797 kfree(wblock
->dev
.driver_override
);
801 static int wmi_dev_match(struct device
*dev
, const struct device_driver
*driver
)
803 const struct wmi_driver
*wmi_driver
= to_wmi_driver(driver
);
804 struct wmi_block
*wblock
= dev_to_wblock(dev
);
805 const struct wmi_device_id
*id
= wmi_driver
->id_table
;
807 /* When driver_override is set, only bind to the matching driver */
808 if (wblock
->dev
.driver_override
)
809 return !strcmp(wblock
->dev
.driver_override
, driver
->name
);
814 while (*id
->guid_string
) {
815 if (guid_parse_and_compare(id
->guid_string
, &wblock
->gblock
.guid
))
824 static int wmi_dev_probe(struct device
*dev
)
826 struct wmi_block
*wblock
= dev_to_wblock(dev
);
827 struct wmi_driver
*wdriver
= to_wmi_driver(dev
->driver
);
830 /* Some older WMI drivers will break if instantiated multiple times,
831 * so they are blocked from probing WMI devices with a duplicated GUID.
833 * New WMI drivers should support being instantiated multiple times.
835 if (test_bit(WMI_GUID_DUPLICATED
, &wblock
->flags
) && !wdriver
->no_singleton
) {
836 dev_warn(dev
, "Legacy driver %s cannot be instantiated multiple times\n",
842 if (wdriver
->notify
) {
843 if (test_bit(WMI_NO_EVENT_DATA
, &wblock
->flags
) && !wdriver
->no_notify_data
)
847 if (ACPI_FAILURE(wmi_method_enable(wblock
, true)))
848 dev_warn(dev
, "failed to enable device -- probing anyway\n");
850 if (wdriver
->probe
) {
851 ret
= wdriver
->probe(to_wmi_device(dev
),
852 find_guid_context(wblock
, wdriver
));
854 if (ACPI_FAILURE(wmi_method_enable(wblock
, false)))
855 dev_warn(dev
, "Failed to disable device\n");
861 down_write(&wblock
->notify_lock
);
862 wblock
->driver_ready
= true;
863 up_write(&wblock
->notify_lock
);
868 static void wmi_dev_remove(struct device
*dev
)
870 struct wmi_block
*wblock
= dev_to_wblock(dev
);
871 struct wmi_driver
*wdriver
= to_wmi_driver(dev
->driver
);
873 down_write(&wblock
->notify_lock
);
874 wblock
->driver_ready
= false;
875 up_write(&wblock
->notify_lock
);
878 wdriver
->remove(to_wmi_device(dev
));
880 if (ACPI_FAILURE(wmi_method_enable(wblock
, false)))
881 dev_warn(dev
, "failed to disable device\n");
884 static void wmi_dev_shutdown(struct device
*dev
)
886 struct wmi_driver
*wdriver
;
887 struct wmi_block
*wblock
;
890 wdriver
= to_wmi_driver(dev
->driver
);
891 wblock
= dev_to_wblock(dev
);
894 * Some machines return bogus WMI event data when disabling
895 * the WMI event. Because of this we must prevent the associated
896 * WMI driver from receiving new WMI events before disabling it.
898 down_write(&wblock
->notify_lock
);
899 wblock
->driver_ready
= false;
900 up_write(&wblock
->notify_lock
);
902 if (wdriver
->shutdown
)
903 wdriver
->shutdown(to_wmi_device(dev
));
905 if (ACPI_FAILURE(wmi_method_enable(wblock
, false)))
906 dev_warn(dev
, "Failed to disable device\n");
910 static struct class wmi_bus_class
= {
914 static const struct bus_type wmi_bus_type
= {
916 .dev_groups
= wmi_groups
,
917 .match
= wmi_dev_match
,
918 .uevent
= wmi_dev_uevent
,
919 .probe
= wmi_dev_probe
,
920 .remove
= wmi_dev_remove
,
921 .shutdown
= wmi_dev_shutdown
,
924 static const struct device_type wmi_type_event
= {
926 .groups
= wmi_event_groups
,
927 .release
= wmi_dev_release
,
930 static const struct device_type wmi_type_method
= {
932 .groups
= wmi_method_groups
,
933 .release
= wmi_dev_release
,
936 static const struct device_type wmi_type_data
= {
938 .groups
= wmi_data_groups
,
939 .release
= wmi_dev_release
,
942 static int wmi_count_guids(struct device
*dev
, void *data
)
944 struct wmi_guid_count_context
*context
= data
;
945 struct wmi_block
*wblock
= dev_to_wblock(dev
);
947 if (guid_equal(&wblock
->gblock
.guid
, context
->guid
))
953 static int guid_count(const guid_t
*guid
)
955 struct wmi_guid_count_context context
= {
961 ret
= bus_for_each_dev(&wmi_bus_type
, NULL
, &context
, wmi_count_guids
);
965 return context
.count
;
968 static int wmi_create_device(struct device
*wmi_bus_dev
,
969 struct wmi_block
*wblock
,
970 struct acpi_device
*device
)
972 char method
[WMI_ACPI_METHOD_NAME_SIZE
];
973 struct acpi_device_info
*info
;
974 acpi_handle method_handle
;
978 if (wblock
->gblock
.flags
& ACPI_WMI_EVENT
) {
979 wblock
->dev
.dev
.type
= &wmi_type_event
;
983 if (wblock
->gblock
.flags
& ACPI_WMI_METHOD
) {
984 get_acpi_method_name(wblock
, 'M', method
);
985 if (!acpi_has_method(device
->handle
, method
)) {
986 dev_warn(wmi_bus_dev
,
987 FW_BUG
"%s method block execution control method not found\n",
993 wblock
->dev
.dev
.type
= &wmi_type_method
;
998 * Data Block Query Control Method (WQxx by convention) is
999 * required per the WMI documentation. If it is not present,
1000 * we ignore this data block.
1002 get_acpi_method_name(wblock
, 'Q', method
);
1003 status
= acpi_get_handle(device
->handle
, method
, &method_handle
);
1004 if (ACPI_FAILURE(status
)) {
1005 dev_warn(wmi_bus_dev
,
1006 FW_BUG
"%s data block query control method not found\n",
1012 status
= acpi_get_object_info(method_handle
, &info
);
1013 if (ACPI_FAILURE(status
))
1016 wblock
->dev
.dev
.type
= &wmi_type_data
;
1019 * The Microsoft documentation specifically states:
1021 * Data blocks registered with only a single instance
1022 * can ignore the parameter.
1024 * ACPICA will get mad at us if we call the method with the wrong number
1025 * of arguments, so check what our method expects. (On some Dell
1026 * laptops, WQxx may not be a method at all.)
1028 if (info
->type
!= ACPI_TYPE_METHOD
|| info
->param_count
== 0)
1029 set_bit(WMI_READ_TAKES_NO_ARGS
, &wblock
->flags
);
1033 get_acpi_method_name(wblock
, 'S', method
);
1034 if (acpi_has_method(device
->handle
, method
))
1035 wblock
->dev
.setable
= true;
1038 init_rwsem(&wblock
->notify_lock
);
1039 wblock
->driver_ready
= false;
1040 wblock
->dev
.dev
.bus
= &wmi_bus_type
;
1041 wblock
->dev
.dev
.parent
= wmi_bus_dev
;
1043 count
= guid_count(&wblock
->gblock
.guid
);
1048 dev_set_name(&wblock
->dev
.dev
, "%pUL-%d", &wblock
->gblock
.guid
, count
);
1049 set_bit(WMI_GUID_DUPLICATED
, &wblock
->flags
);
1051 dev_set_name(&wblock
->dev
.dev
, "%pUL", &wblock
->gblock
.guid
);
1054 device_initialize(&wblock
->dev
.dev
);
1059 static int wmi_add_device(struct platform_device
*pdev
, struct wmi_device
*wdev
)
1061 struct device_link
*link
;
1064 * Many aggregate WMI drivers do not use -EPROBE_DEFER when they
1065 * are unable to find a WMI device during probe, instead they require
1066 * all WMI devices associated with an platform device to become available
1067 * at once. This device link thus prevents WMI drivers from probing until
1068 * the associated platform device has finished probing (and has registered
1069 * all discovered WMI devices).
1072 link
= device_link_add(&wdev
->dev
, &pdev
->dev
, DL_FLAG_AUTOREMOVE_SUPPLIER
);
1076 return device_add(&wdev
->dev
);
1080 * Parse the _WDG method for the GUID data blocks
1082 static int parse_wdg(struct device
*wmi_bus_dev
, struct platform_device
*pdev
)
1084 struct acpi_device
*device
= ACPI_COMPANION(&pdev
->dev
);
1085 struct acpi_buffer out
= {ACPI_ALLOCATE_BUFFER
, NULL
};
1086 const struct guid_block
*gblock
;
1087 bool event_data_available
;
1088 struct wmi_block
*wblock
;
1089 union acpi_object
*obj
;
1094 status
= acpi_evaluate_object(device
->handle
, "_WDG", NULL
, &out
);
1095 if (ACPI_FAILURE(status
))
1102 if (obj
->type
!= ACPI_TYPE_BUFFER
) {
1107 event_data_available
= acpi_has_method(device
->handle
, "_WED");
1108 gblock
= (const struct guid_block
*)obj
->buffer
.pointer
;
1109 total
= obj
->buffer
.length
/ sizeof(struct guid_block
);
1111 for (i
= 0; i
< total
; i
++) {
1112 if (!gblock
[i
].instance_count
) {
1113 dev_info(wmi_bus_dev
, FW_INFO
"%pUL has zero instances\n", &gblock
[i
].guid
);
1117 wblock
= kzalloc(sizeof(*wblock
), GFP_KERNEL
);
1121 wblock
->acpi_device
= device
;
1122 wblock
->gblock
= gblock
[i
];
1123 if (gblock
[i
].flags
& ACPI_WMI_EVENT
&& !event_data_available
)
1124 set_bit(WMI_NO_EVENT_DATA
, &wblock
->flags
);
1126 retval
= wmi_create_device(wmi_bus_dev
, wblock
, device
);
1132 retval
= wmi_add_device(pdev
, &wblock
->dev
);
1134 dev_err(wmi_bus_dev
, "failed to register %pUL\n",
1135 &wblock
->gblock
.guid
);
1137 put_device(&wblock
->dev
.dev
);
1146 static int wmi_get_notify_data(struct wmi_block
*wblock
, union acpi_object
**obj
)
1148 struct acpi_buffer data
= { ACPI_ALLOCATE_BUFFER
, NULL
};
1149 union acpi_object param
= {
1151 .type
= ACPI_TYPE_INTEGER
,
1152 .value
= wblock
->gblock
.notify_id
,
1155 struct acpi_object_list input
= {
1161 status
= acpi_evaluate_object(wblock
->acpi_device
->handle
, "_WED", &input
, &data
);
1162 if (ACPI_FAILURE(status
)) {
1163 dev_warn(&wblock
->dev
.dev
, "Failed to get event data\n");
1167 *obj
= data
.pointer
;
1172 static void wmi_notify_driver(struct wmi_block
*wblock
, union acpi_object
*obj
)
1174 struct wmi_driver
*driver
= to_wmi_driver(wblock
->dev
.dev
.driver
);
1176 if (!obj
&& !driver
->no_notify_data
) {
1177 dev_warn(&wblock
->dev
.dev
, "Event contains no event data\n");
1182 driver
->notify(&wblock
->dev
, obj
);
1185 static int wmi_notify_device(struct device
*dev
, void *data
)
1187 struct wmi_block
*wblock
= dev_to_wblock(dev
);
1188 union acpi_object
*obj
= NULL
;
1192 if (!(wblock
->gblock
.flags
& ACPI_WMI_EVENT
&& wblock
->gblock
.notify_id
== *event
))
1195 /* The ACPI WMI specification says that _WED should be
1196 * evaluated every time an notification is received, even
1197 * if no consumers are present.
1199 * Some firmware implementations actually depend on this
1200 * by using a queue for events which will fill up if the
1201 * WMI driver core stops evaluating _WED due to missing
1202 * WMI event consumers.
1204 if (!test_bit(WMI_NO_EVENT_DATA
, &wblock
->flags
)) {
1205 ret
= wmi_get_notify_data(wblock
, &obj
);
1210 down_read(&wblock
->notify_lock
);
1212 if (wblock
->dev
.dev
.driver
&& wblock
->driver_ready
)
1213 wmi_notify_driver(wblock
, obj
);
1215 if (wblock
->handler
)
1216 wblock
->handler(obj
, wblock
->handler_data
);
1218 up_read(&wblock
->notify_lock
);
1222 acpi_bus_generate_netlink_event("wmi", acpi_dev_name(wblock
->acpi_device
), *event
, 0);
1227 static void acpi_wmi_notify_handler(acpi_handle handle
, u32 event
, void *context
)
1229 struct device
*wmi_bus_dev
= context
;
1231 device_for_each_child(wmi_bus_dev
, &event
, wmi_notify_device
);
1234 static int wmi_remove_device(struct device
*dev
, void *data
)
1236 device_unregister(dev
);
1241 static void acpi_wmi_remove(struct platform_device
*device
)
1243 struct device
*wmi_bus_device
= dev_get_drvdata(&device
->dev
);
1245 device_for_each_child_reverse(wmi_bus_device
, NULL
, wmi_remove_device
);
1248 static void acpi_wmi_remove_notify_handler(void *data
)
1250 struct acpi_device
*acpi_device
= data
;
1252 acpi_remove_notify_handler(acpi_device
->handle
, ACPI_ALL_NOTIFY
, acpi_wmi_notify_handler
);
1255 static void acpi_wmi_remove_bus_device(void *data
)
1257 struct device
*wmi_bus_dev
= data
;
1259 device_unregister(wmi_bus_dev
);
1262 static int acpi_wmi_probe(struct platform_device
*device
)
1264 struct acpi_device
*acpi_device
;
1265 struct device
*wmi_bus_dev
;
1269 acpi_device
= ACPI_COMPANION(&device
->dev
);
1271 dev_err(&device
->dev
, "ACPI companion is missing\n");
1275 wmi_bus_dev
= device_create(&wmi_bus_class
, &device
->dev
, MKDEV(0, 0), NULL
, "wmi_bus-%s",
1276 dev_name(&device
->dev
));
1277 if (IS_ERR(wmi_bus_dev
))
1278 return PTR_ERR(wmi_bus_dev
);
1280 error
= devm_add_action_or_reset(&device
->dev
, acpi_wmi_remove_bus_device
, wmi_bus_dev
);
1284 dev_set_drvdata(&device
->dev
, wmi_bus_dev
);
1286 status
= acpi_install_notify_handler(acpi_device
->handle
, ACPI_ALL_NOTIFY
,
1287 acpi_wmi_notify_handler
, wmi_bus_dev
);
1288 if (ACPI_FAILURE(status
)) {
1289 dev_err(&device
->dev
, "Error installing notify handler\n");
1292 error
= devm_add_action_or_reset(&device
->dev
, acpi_wmi_remove_notify_handler
,
1297 error
= parse_wdg(wmi_bus_dev
, device
);
1299 dev_err(&device
->dev
, "Failed to parse _WDG method\n");
1306 int __must_check
__wmi_driver_register(struct wmi_driver
*driver
,
1307 struct module
*owner
)
1309 driver
->driver
.owner
= owner
;
1310 driver
->driver
.bus
= &wmi_bus_type
;
1312 return driver_register(&driver
->driver
);
1314 EXPORT_SYMBOL(__wmi_driver_register
);
1317 * wmi_driver_unregister() - Unregister a WMI driver
1318 * @driver: WMI driver to unregister
1320 * Unregisters a WMI driver from the WMI bus.
1322 void wmi_driver_unregister(struct wmi_driver
*driver
)
1324 driver_unregister(&driver
->driver
);
1326 EXPORT_SYMBOL(wmi_driver_unregister
);
1328 static struct platform_driver acpi_wmi_driver
= {
1331 .acpi_match_table
= wmi_device_ids
,
1333 .probe
= acpi_wmi_probe
,
1334 .remove
= acpi_wmi_remove
,
1337 static int __init
acpi_wmi_init(void)
1344 error
= class_register(&wmi_bus_class
);
1348 error
= bus_register(&wmi_bus_type
);
1350 goto err_unreg_class
;
1352 error
= platform_driver_register(&acpi_wmi_driver
);
1354 pr_err("Error loading mapper\n");
1361 bus_unregister(&wmi_bus_type
);
1364 class_unregister(&wmi_bus_class
);
1369 static void __exit
acpi_wmi_exit(void)
1371 platform_driver_unregister(&acpi_wmi_driver
);
1372 bus_unregister(&wmi_bus_type
);
1373 class_unregister(&wmi_bus_class
);
1376 subsys_initcall_sync(acpi_wmi_init
);
1377 module_exit(acpi_wmi_exit
);