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/device.h>
21 #include <linux/init.h>
22 #include <linux/kernel.h>
23 #include <linux/list.h>
24 #include <linux/miscdevice.h>
25 #include <linux/module.h>
26 #include <linux/platform_device.h>
27 #include <linux/slab.h>
28 #include <linux/types.h>
29 #include <linux/uaccess.h>
30 #include <linux/uuid.h>
31 #include <linux/wmi.h>
33 #include <uapi/linux/wmi.h>
35 ACPI_MODULE_NAME("wmi");
36 MODULE_AUTHOR("Carlos Corbacho");
37 MODULE_DESCRIPTION("ACPI-WMI Mapping Driver");
38 MODULE_LICENSE("GPL");
40 static LIST_HEAD(wmi_block_list
);
47 unsigned char notify_id
;
48 unsigned char reserved
;
56 struct wmi_device dev
;
57 struct list_head list
;
58 struct guid_block gblock
;
59 struct miscdevice char_dev
;
60 struct mutex char_mutex
;
61 struct acpi_device
*acpi_device
;
62 wmi_notify_handler handler
;
66 bool read_takes_no_args
;
71 * If the GUID data block is marked as expensive, we must enable and
72 * explicitily disable data collection.
74 #define ACPI_WMI_EXPENSIVE 0x1
75 #define ACPI_WMI_METHOD 0x2 /* GUID is a method */
76 #define ACPI_WMI_STRING 0x4 /* GUID takes & returns a string */
77 #define ACPI_WMI_EVENT 0x8 /* GUID is an event */
79 static bool debug_event
;
80 module_param(debug_event
, bool, 0444);
81 MODULE_PARM_DESC(debug_event
,
82 "Log WMI Events [0/1]");
84 static bool debug_dump_wdg
;
85 module_param(debug_dump_wdg
, bool, 0444);
86 MODULE_PARM_DESC(debug_dump_wdg
,
87 "Dump available WMI interfaces [0/1]");
89 static int acpi_wmi_remove(struct platform_device
*device
);
90 static int acpi_wmi_probe(struct platform_device
*device
);
92 static const struct acpi_device_id wmi_device_ids
[] = {
97 MODULE_DEVICE_TABLE(acpi
, wmi_device_ids
);
99 static struct platform_driver acpi_wmi_driver
= {
102 .acpi_match_table
= wmi_device_ids
,
104 .probe
= acpi_wmi_probe
,
105 .remove
= acpi_wmi_remove
,
109 * GUID parsing functions
112 static bool find_guid(const char *guid_string
, struct wmi_block
**out
)
115 struct wmi_block
*wblock
;
116 struct guid_block
*block
;
118 if (guid_parse(guid_string
, &guid_input
))
121 list_for_each_entry(wblock
, &wmi_block_list
, list
) {
122 block
= &wblock
->gblock
;
124 if (memcmp(block
->guid
, &guid_input
, 16) == 0) {
133 static const void *find_guid_context(struct wmi_block
*wblock
,
134 struct wmi_driver
*wdriver
)
136 const struct wmi_device_id
*id
;
139 if (wblock
== NULL
|| wdriver
== NULL
)
141 if (wdriver
->id_table
== NULL
)
144 id
= wdriver
->id_table
;
145 while (*id
->guid_string
) {
146 if (guid_parse(id
->guid_string
, &guid_input
))
148 if (!memcmp(wblock
->gblock
.guid
, &guid_input
, 16))
155 static int get_subobj_info(acpi_handle handle
, const char *pathname
,
156 struct acpi_device_info
**info
)
158 struct acpi_device_info
*dummy_info
, **info_ptr
;
159 acpi_handle subobj_handle
;
162 status
= acpi_get_handle(handle
, (char *)pathname
, &subobj_handle
);
163 if (status
== AE_NOT_FOUND
)
165 else if (ACPI_FAILURE(status
))
168 info_ptr
= info
? info
: &dummy_info
;
169 status
= acpi_get_object_info(subobj_handle
, info_ptr
);
170 if (ACPI_FAILURE(status
))
179 static acpi_status
wmi_method_enable(struct wmi_block
*wblock
, int enable
)
181 struct guid_block
*block
= NULL
;
186 block
= &wblock
->gblock
;
187 handle
= wblock
->acpi_device
->handle
;
189 snprintf(method
, 5, "WE%02X", block
->notify_id
);
190 status
= acpi_execute_simple_method(handle
, method
, enable
);
192 if (status
!= AE_OK
&& status
!= AE_NOT_FOUND
)
199 * Exported WMI functions
203 * set_required_buffer_size - Sets the buffer size needed for performing IOCTL
204 * @wdev: A wmi bus device from a driver
205 * @length: Required buffer size
207 * Allocates memory needed for buffer, stores the buffer size in that memory
209 int set_required_buffer_size(struct wmi_device
*wdev
, u64 length
)
211 struct wmi_block
*wblock
;
213 wblock
= container_of(wdev
, struct wmi_block
, dev
);
214 wblock
->req_buf_size
= length
;
218 EXPORT_SYMBOL_GPL(set_required_buffer_size
);
221 * wmi_evaluate_method - Evaluate a WMI method
222 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
223 * @instance: Instance index
224 * @method_id: Method ID to call
225 * @in: Buffer containing input for the method call
226 * @out: Empty buffer to return the method results
228 * Call an ACPI-WMI method
230 acpi_status
wmi_evaluate_method(const char *guid_string
, u8 instance
,
231 u32 method_id
, const struct acpi_buffer
*in
, struct acpi_buffer
*out
)
233 struct wmi_block
*wblock
= NULL
;
235 if (!find_guid(guid_string
, &wblock
))
237 return wmidev_evaluate_method(&wblock
->dev
, instance
, method_id
,
240 EXPORT_SYMBOL_GPL(wmi_evaluate_method
);
243 * wmidev_evaluate_method - Evaluate a WMI method
244 * @wdev: A wmi bus device from a driver
245 * @instance: Instance index
246 * @method_id: Method ID to call
247 * @in: Buffer containing input for the method call
248 * @out: Empty buffer to return the method results
250 * Call an ACPI-WMI method
252 acpi_status
wmidev_evaluate_method(struct wmi_device
*wdev
, u8 instance
,
253 u32 method_id
, const struct acpi_buffer
*in
, struct acpi_buffer
*out
)
255 struct guid_block
*block
= NULL
;
256 struct wmi_block
*wblock
= NULL
;
259 struct acpi_object_list input
;
260 union acpi_object params
[3];
261 char method
[5] = "WM";
263 wblock
= container_of(wdev
, struct wmi_block
, dev
);
264 block
= &wblock
->gblock
;
265 handle
= wblock
->acpi_device
->handle
;
267 if (!(block
->flags
& ACPI_WMI_METHOD
))
270 if (block
->instance_count
<= instance
)
271 return AE_BAD_PARAMETER
;
274 input
.pointer
= params
;
275 params
[0].type
= ACPI_TYPE_INTEGER
;
276 params
[0].integer
.value
= instance
;
277 params
[1].type
= ACPI_TYPE_INTEGER
;
278 params
[1].integer
.value
= method_id
;
283 if (block
->flags
& ACPI_WMI_STRING
) {
284 params
[2].type
= ACPI_TYPE_STRING
;
286 params
[2].type
= ACPI_TYPE_BUFFER
;
288 params
[2].buffer
.length
= in
->length
;
289 params
[2].buffer
.pointer
= in
->pointer
;
292 strncat(method
, block
->object_id
, 2);
294 status
= acpi_evaluate_object(handle
, method
, &input
, out
);
298 EXPORT_SYMBOL_GPL(wmidev_evaluate_method
);
300 static acpi_status
__query_block(struct wmi_block
*wblock
, u8 instance
,
301 struct acpi_buffer
*out
)
303 struct guid_block
*block
= NULL
;
305 acpi_status status
, wc_status
= AE_ERROR
;
306 struct acpi_object_list input
;
307 union acpi_object wq_params
[1];
309 char wc_method
[5] = "WC";
312 return AE_BAD_PARAMETER
;
314 block
= &wblock
->gblock
;
315 handle
= wblock
->acpi_device
->handle
;
317 if (block
->instance_count
<= instance
)
318 return AE_BAD_PARAMETER
;
320 /* Check GUID is a data block */
321 if (block
->flags
& (ACPI_WMI_EVENT
| ACPI_WMI_METHOD
))
325 input
.pointer
= wq_params
;
326 wq_params
[0].type
= ACPI_TYPE_INTEGER
;
327 wq_params
[0].integer
.value
= instance
;
329 if (instance
== 0 && wblock
->read_takes_no_args
)
333 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method first to
336 if (block
->flags
& ACPI_WMI_EXPENSIVE
) {
337 strncat(wc_method
, block
->object_id
, 2);
340 * Some GUIDs break the specification by declaring themselves
341 * expensive, but have no corresponding WCxx method. So we
342 * should not fail if this happens.
344 wc_status
= acpi_execute_simple_method(handle
, wc_method
, 1);
347 strcpy(method
, "WQ");
348 strncat(method
, block
->object_id
, 2);
350 status
= acpi_evaluate_object(handle
, method
, &input
, out
);
353 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if
354 * the WQxx method failed - we should disable collection anyway.
356 if ((block
->flags
& ACPI_WMI_EXPENSIVE
) && ACPI_SUCCESS(wc_status
)) {
357 status
= acpi_execute_simple_method(handle
, wc_method
, 0);
364 * wmi_query_block - Return contents of a WMI block (deprecated)
365 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
366 * @instance: Instance index
367 * @out: Empty buffer to return the contents of the data block to
369 * Return the contents of an ACPI-WMI data block to a buffer
371 acpi_status
wmi_query_block(const char *guid_string
, u8 instance
,
372 struct acpi_buffer
*out
)
374 struct wmi_block
*wblock
;
377 return AE_BAD_PARAMETER
;
379 if (!find_guid(guid_string
, &wblock
))
382 return __query_block(wblock
, instance
, out
);
384 EXPORT_SYMBOL_GPL(wmi_query_block
);
386 union acpi_object
*wmidev_block_query(struct wmi_device
*wdev
, u8 instance
)
388 struct acpi_buffer out
= { ACPI_ALLOCATE_BUFFER
, NULL
};
389 struct wmi_block
*wblock
= container_of(wdev
, struct wmi_block
, dev
);
391 if (ACPI_FAILURE(__query_block(wblock
, instance
, &out
)))
394 return (union acpi_object
*)out
.pointer
;
396 EXPORT_SYMBOL_GPL(wmidev_block_query
);
399 * wmi_set_block - Write to a WMI block
400 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
401 * @instance: Instance index
402 * @in: Buffer containing new values for the data block
404 * Write the contents of the input buffer to an ACPI-WMI data block
406 acpi_status
wmi_set_block(const char *guid_string
, u8 instance
,
407 const struct acpi_buffer
*in
)
409 struct guid_block
*block
= NULL
;
410 struct wmi_block
*wblock
= NULL
;
412 struct acpi_object_list input
;
413 union acpi_object params
[2];
414 char method
[5] = "WS";
416 if (!guid_string
|| !in
)
419 if (!find_guid(guid_string
, &wblock
))
422 block
= &wblock
->gblock
;
423 handle
= wblock
->acpi_device
->handle
;
425 if (block
->instance_count
<= instance
)
426 return AE_BAD_PARAMETER
;
428 /* Check GUID is a data block */
429 if (block
->flags
& (ACPI_WMI_EVENT
| ACPI_WMI_METHOD
))
433 input
.pointer
= params
;
434 params
[0].type
= ACPI_TYPE_INTEGER
;
435 params
[0].integer
.value
= instance
;
437 if (block
->flags
& ACPI_WMI_STRING
) {
438 params
[1].type
= ACPI_TYPE_STRING
;
440 params
[1].type
= ACPI_TYPE_BUFFER
;
442 params
[1].buffer
.length
= in
->length
;
443 params
[1].buffer
.pointer
= in
->pointer
;
445 strncat(method
, block
->object_id
, 2);
447 return acpi_evaluate_object(handle
, method
, &input
, NULL
);
449 EXPORT_SYMBOL_GPL(wmi_set_block
);
451 static void wmi_dump_wdg(const struct guid_block
*g
)
453 pr_info("%pUL:\n", g
->guid
);
454 if (g
->flags
& ACPI_WMI_EVENT
)
455 pr_info("\tnotify_id: 0x%02X\n", g
->notify_id
);
457 pr_info("\tobject_id: %2pE\n", g
->object_id
);
458 pr_info("\tinstance_count: %d\n", g
->instance_count
);
459 pr_info("\tflags: %#x", g
->flags
);
461 if (g
->flags
& ACPI_WMI_EXPENSIVE
)
462 pr_cont(" ACPI_WMI_EXPENSIVE");
463 if (g
->flags
& ACPI_WMI_METHOD
)
464 pr_cont(" ACPI_WMI_METHOD");
465 if (g
->flags
& ACPI_WMI_STRING
)
466 pr_cont(" ACPI_WMI_STRING");
467 if (g
->flags
& ACPI_WMI_EVENT
)
468 pr_cont(" ACPI_WMI_EVENT");
474 static void wmi_notify_debug(u32 value
, void *context
)
476 struct acpi_buffer response
= { ACPI_ALLOCATE_BUFFER
, NULL
};
477 union acpi_object
*obj
;
480 status
= wmi_get_event_data(value
, &response
);
481 if (status
!= AE_OK
) {
482 pr_info("bad event status 0x%x\n", status
);
486 obj
= (union acpi_object
*)response
.pointer
;
491 pr_info("DEBUG Event ");
493 case ACPI_TYPE_BUFFER
:
494 pr_cont("BUFFER_TYPE - length %d\n", obj
->buffer
.length
);
496 case ACPI_TYPE_STRING
:
497 pr_cont("STRING_TYPE - %s\n", obj
->string
.pointer
);
499 case ACPI_TYPE_INTEGER
:
500 pr_cont("INTEGER_TYPE - %llu\n", obj
->integer
.value
);
502 case ACPI_TYPE_PACKAGE
:
503 pr_cont("PACKAGE_TYPE - %d elements\n", obj
->package
.count
);
506 pr_cont("object type 0x%X\n", obj
->type
);
512 * wmi_install_notify_handler - Register handler for WMI events
513 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
514 * @handler: Function to handle notifications
515 * @data: Data to be returned to handler when event is fired
517 * Register a handler for events sent to the ACPI-WMI mapper device.
519 acpi_status
wmi_install_notify_handler(const char *guid
,
520 wmi_notify_handler handler
, void *data
)
522 struct wmi_block
*block
;
523 acpi_status status
= AE_NOT_EXIST
;
526 if (!guid
|| !handler
)
527 return AE_BAD_PARAMETER
;
529 if (guid_parse(guid
, &guid_input
))
530 return AE_BAD_PARAMETER
;
532 list_for_each_entry(block
, &wmi_block_list
, list
) {
533 acpi_status wmi_status
;
535 if (memcmp(block
->gblock
.guid
, &guid_input
, 16) == 0) {
536 if (block
->handler
&&
537 block
->handler
!= wmi_notify_debug
)
538 return AE_ALREADY_ACQUIRED
;
540 block
->handler
= handler
;
541 block
->handler_data
= data
;
543 wmi_status
= wmi_method_enable(block
, 1);
544 if ((wmi_status
!= AE_OK
) ||
545 ((wmi_status
== AE_OK
) && (status
== AE_NOT_EXIST
)))
552 EXPORT_SYMBOL_GPL(wmi_install_notify_handler
);
555 * wmi_uninstall_notify_handler - Unregister handler for WMI events
556 * @guid: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
558 * Unregister handler for events sent to the ACPI-WMI mapper device.
560 acpi_status
wmi_remove_notify_handler(const char *guid
)
562 struct wmi_block
*block
;
563 acpi_status status
= AE_NOT_EXIST
;
567 return AE_BAD_PARAMETER
;
569 if (guid_parse(guid
, &guid_input
))
570 return AE_BAD_PARAMETER
;
572 list_for_each_entry(block
, &wmi_block_list
, list
) {
573 acpi_status wmi_status
;
575 if (memcmp(block
->gblock
.guid
, &guid_input
, 16) == 0) {
576 if (!block
->handler
||
577 block
->handler
== wmi_notify_debug
)
578 return AE_NULL_ENTRY
;
581 block
->handler
= wmi_notify_debug
;
584 wmi_status
= wmi_method_enable(block
, 0);
585 block
->handler
= NULL
;
586 block
->handler_data
= NULL
;
587 if ((wmi_status
!= AE_OK
) ||
588 ((wmi_status
== AE_OK
) &&
589 (status
== AE_NOT_EXIST
)))
597 EXPORT_SYMBOL_GPL(wmi_remove_notify_handler
);
600 * wmi_get_event_data - Get WMI data associated with an event
602 * @event: Event to find
603 * @out: Buffer to hold event data. out->pointer should be freed with kfree()
605 * Returns extra data associated with an event in WMI.
607 acpi_status
wmi_get_event_data(u32 event
, struct acpi_buffer
*out
)
609 struct acpi_object_list input
;
610 union acpi_object params
[1];
611 struct guid_block
*gblock
;
612 struct wmi_block
*wblock
;
615 input
.pointer
= params
;
616 params
[0].type
= ACPI_TYPE_INTEGER
;
617 params
[0].integer
.value
= event
;
619 list_for_each_entry(wblock
, &wmi_block_list
, list
) {
620 gblock
= &wblock
->gblock
;
622 if ((gblock
->flags
& ACPI_WMI_EVENT
) &&
623 (gblock
->notify_id
== event
))
624 return acpi_evaluate_object(wblock
->acpi_device
->handle
,
625 "_WED", &input
, out
);
630 EXPORT_SYMBOL_GPL(wmi_get_event_data
);
633 * wmi_has_guid - Check if a GUID is available
634 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
636 * Check if a given GUID is defined by _WDG
638 bool wmi_has_guid(const char *guid_string
)
640 return find_guid(guid_string
, NULL
);
642 EXPORT_SYMBOL_GPL(wmi_has_guid
);
645 * wmi_get_acpi_device_uid() - Get _UID name of ACPI device that defines GUID
646 * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
648 * Find the _UID of ACPI device associated with this WMI GUID.
650 * Return: The ACPI _UID field value or NULL if the WMI GUID was not found
652 char *wmi_get_acpi_device_uid(const char *guid_string
)
654 struct wmi_block
*wblock
= NULL
;
656 if (!find_guid(guid_string
, &wblock
))
659 return acpi_device_uid(wblock
->acpi_device
);
661 EXPORT_SYMBOL_GPL(wmi_get_acpi_device_uid
);
663 static struct wmi_block
*dev_to_wblock(struct device
*dev
)
665 return container_of(dev
, struct wmi_block
, dev
.dev
);
668 static struct wmi_device
*dev_to_wdev(struct device
*dev
)
670 return container_of(dev
, struct wmi_device
, dev
);
676 static ssize_t
modalias_show(struct device
*dev
, struct device_attribute
*attr
,
679 struct wmi_block
*wblock
= dev_to_wblock(dev
);
681 return sprintf(buf
, "wmi:%pUL\n", wblock
->gblock
.guid
);
683 static DEVICE_ATTR_RO(modalias
);
685 static ssize_t
guid_show(struct device
*dev
, struct device_attribute
*attr
,
688 struct wmi_block
*wblock
= dev_to_wblock(dev
);
690 return sprintf(buf
, "%pUL\n", wblock
->gblock
.guid
);
692 static DEVICE_ATTR_RO(guid
);
694 static ssize_t
instance_count_show(struct device
*dev
,
695 struct device_attribute
*attr
, char *buf
)
697 struct wmi_block
*wblock
= dev_to_wblock(dev
);
699 return sprintf(buf
, "%d\n", (int)wblock
->gblock
.instance_count
);
701 static DEVICE_ATTR_RO(instance_count
);
703 static ssize_t
expensive_show(struct device
*dev
,
704 struct device_attribute
*attr
, char *buf
)
706 struct wmi_block
*wblock
= dev_to_wblock(dev
);
708 return sprintf(buf
, "%d\n",
709 (wblock
->gblock
.flags
& ACPI_WMI_EXPENSIVE
) != 0);
711 static DEVICE_ATTR_RO(expensive
);
713 static struct attribute
*wmi_attrs
[] = {
714 &dev_attr_modalias
.attr
,
716 &dev_attr_instance_count
.attr
,
717 &dev_attr_expensive
.attr
,
720 ATTRIBUTE_GROUPS(wmi
);
722 static ssize_t
notify_id_show(struct device
*dev
, struct device_attribute
*attr
,
725 struct wmi_block
*wblock
= dev_to_wblock(dev
);
727 return sprintf(buf
, "%02X\n", (unsigned int)wblock
->gblock
.notify_id
);
729 static DEVICE_ATTR_RO(notify_id
);
731 static struct attribute
*wmi_event_attrs
[] = {
732 &dev_attr_notify_id
.attr
,
735 ATTRIBUTE_GROUPS(wmi_event
);
737 static ssize_t
object_id_show(struct device
*dev
, struct device_attribute
*attr
,
740 struct wmi_block
*wblock
= dev_to_wblock(dev
);
742 return sprintf(buf
, "%c%c\n", wblock
->gblock
.object_id
[0],
743 wblock
->gblock
.object_id
[1]);
745 static DEVICE_ATTR_RO(object_id
);
747 static ssize_t
setable_show(struct device
*dev
, struct device_attribute
*attr
,
750 struct wmi_device
*wdev
= dev_to_wdev(dev
);
752 return sprintf(buf
, "%d\n", (int)wdev
->setable
);
754 static DEVICE_ATTR_RO(setable
);
756 static struct attribute
*wmi_data_attrs
[] = {
757 &dev_attr_object_id
.attr
,
758 &dev_attr_setable
.attr
,
761 ATTRIBUTE_GROUPS(wmi_data
);
763 static struct attribute
*wmi_method_attrs
[] = {
764 &dev_attr_object_id
.attr
,
767 ATTRIBUTE_GROUPS(wmi_method
);
769 static int wmi_dev_uevent(struct device
*dev
, struct kobj_uevent_env
*env
)
771 struct wmi_block
*wblock
= dev_to_wblock(dev
);
773 if (add_uevent_var(env
, "MODALIAS=wmi:%pUL", wblock
->gblock
.guid
))
776 if (add_uevent_var(env
, "WMI_GUID=%pUL", wblock
->gblock
.guid
))
782 static void wmi_dev_release(struct device
*dev
)
784 struct wmi_block
*wblock
= dev_to_wblock(dev
);
789 static int wmi_dev_match(struct device
*dev
, struct device_driver
*driver
)
791 struct wmi_driver
*wmi_driver
=
792 container_of(driver
, struct wmi_driver
, driver
);
793 struct wmi_block
*wblock
= dev_to_wblock(dev
);
794 const struct wmi_device_id
*id
= wmi_driver
->id_table
;
799 while (*id
->guid_string
) {
802 if (WARN_ON(guid_parse(id
->guid_string
, &driver_guid
)))
804 if (!memcmp(&driver_guid
, wblock
->gblock
.guid
, 16))
812 static int wmi_char_open(struct inode
*inode
, struct file
*filp
)
814 const char *driver_name
= filp
->f_path
.dentry
->d_iname
;
815 struct wmi_block
*wblock
= NULL
;
816 struct wmi_block
*next
= NULL
;
818 list_for_each_entry_safe(wblock
, next
, &wmi_block_list
, list
) {
819 if (!wblock
->dev
.dev
.driver
)
821 if (strcmp(driver_name
, wblock
->dev
.dev
.driver
->name
) == 0) {
822 filp
->private_data
= wblock
;
827 if (!filp
->private_data
)
830 return nonseekable_open(inode
, filp
);
833 static ssize_t
wmi_char_read(struct file
*filp
, char __user
*buffer
,
834 size_t length
, loff_t
*offset
)
836 struct wmi_block
*wblock
= filp
->private_data
;
838 return simple_read_from_buffer(buffer
, length
, offset
,
839 &wblock
->req_buf_size
,
840 sizeof(wblock
->req_buf_size
));
843 static long wmi_ioctl(struct file
*filp
, unsigned int cmd
, unsigned long arg
)
845 struct wmi_ioctl_buffer __user
*input
=
846 (struct wmi_ioctl_buffer __user
*) arg
;
847 struct wmi_block
*wblock
= filp
->private_data
;
848 struct wmi_ioctl_buffer
*buf
= NULL
;
849 struct wmi_driver
*wdriver
= NULL
;
852 if (_IOC_TYPE(cmd
) != WMI_IOC
)
855 /* make sure we're not calling a higher instance than exists*/
856 if (_IOC_NR(cmd
) >= wblock
->gblock
.instance_count
)
859 mutex_lock(&wblock
->char_mutex
);
860 buf
= wblock
->handler_data
;
861 if (get_user(buf
->length
, &input
->length
)) {
862 dev_dbg(&wblock
->dev
.dev
, "Read length from user failed\n");
866 /* if it's too small, abort */
867 if (buf
->length
< wblock
->req_buf_size
) {
868 dev_err(&wblock
->dev
.dev
,
869 "Buffer %lld too small, need at least %lld\n",
870 buf
->length
, wblock
->req_buf_size
);
874 /* if it's too big, warn, driver will only use what is needed */
875 if (buf
->length
> wblock
->req_buf_size
)
876 dev_warn(&wblock
->dev
.dev
,
877 "Buffer %lld is bigger than required %lld\n",
878 buf
->length
, wblock
->req_buf_size
);
880 /* copy the structure from userspace */
881 if (copy_from_user(buf
, input
, wblock
->req_buf_size
)) {
882 dev_dbg(&wblock
->dev
.dev
, "Copy %llu from user failed\n",
883 wblock
->req_buf_size
);
888 /* let the driver do any filtering and do the call */
889 wdriver
= container_of(wblock
->dev
.dev
.driver
,
890 struct wmi_driver
, driver
);
891 if (!try_module_get(wdriver
->driver
.owner
)) {
895 ret
= wdriver
->filter_callback(&wblock
->dev
, cmd
, buf
);
896 module_put(wdriver
->driver
.owner
);
900 /* return the result (only up to our internal buffer size) */
901 if (copy_to_user(input
, buf
, wblock
->req_buf_size
)) {
902 dev_dbg(&wblock
->dev
.dev
, "Copy %llu to user failed\n",
903 wblock
->req_buf_size
);
908 mutex_unlock(&wblock
->char_mutex
);
912 static const struct file_operations wmi_fops
= {
913 .owner
= THIS_MODULE
,
914 .read
= wmi_char_read
,
915 .open
= wmi_char_open
,
916 .unlocked_ioctl
= wmi_ioctl
,
917 .compat_ioctl
= compat_ptr_ioctl
,
920 static int wmi_dev_probe(struct device
*dev
)
922 struct wmi_block
*wblock
= dev_to_wblock(dev
);
923 struct wmi_driver
*wdriver
=
924 container_of(dev
->driver
, struct wmi_driver
, driver
);
928 if (ACPI_FAILURE(wmi_method_enable(wblock
, 1)))
929 dev_warn(dev
, "failed to enable device -- probing anyway\n");
931 if (wdriver
->probe
) {
932 ret
= wdriver
->probe(dev_to_wdev(dev
),
933 find_guid_context(wblock
, wdriver
));
938 /* driver wants a character device made */
939 if (wdriver
->filter_callback
) {
940 /* check that required buffer size declared by driver or MOF */
941 if (!wblock
->req_buf_size
) {
942 dev_err(&wblock
->dev
.dev
,
943 "Required buffer size not set\n");
948 wblock
->handler_data
= kmalloc(wblock
->req_buf_size
,
950 if (!wblock
->handler_data
) {
955 buf
= kasprintf(GFP_KERNEL
, "wmi/%s", wdriver
->driver
.name
);
958 goto probe_string_failure
;
960 wblock
->char_dev
.minor
= MISC_DYNAMIC_MINOR
;
961 wblock
->char_dev
.name
= buf
;
962 wblock
->char_dev
.fops
= &wmi_fops
;
963 wblock
->char_dev
.mode
= 0444;
964 ret
= misc_register(&wblock
->char_dev
);
966 dev_warn(dev
, "failed to register char dev: %d\n", ret
);
968 goto probe_misc_failure
;
976 probe_string_failure
:
977 kfree(wblock
->handler_data
);
979 if (ACPI_FAILURE(wmi_method_enable(wblock
, 0)))
980 dev_warn(dev
, "failed to disable device\n");
984 static int wmi_dev_remove(struct device
*dev
)
986 struct wmi_block
*wblock
= dev_to_wblock(dev
);
987 struct wmi_driver
*wdriver
=
988 container_of(dev
->driver
, struct wmi_driver
, driver
);
991 if (wdriver
->filter_callback
) {
992 misc_deregister(&wblock
->char_dev
);
993 kfree(wblock
->char_dev
.name
);
994 kfree(wblock
->handler_data
);
998 ret
= wdriver
->remove(dev_to_wdev(dev
));
1000 if (ACPI_FAILURE(wmi_method_enable(wblock
, 0)))
1001 dev_warn(dev
, "failed to disable device\n");
1006 static struct class wmi_bus_class
= {
1010 static struct bus_type wmi_bus_type
= {
1012 .dev_groups
= wmi_groups
,
1013 .match
= wmi_dev_match
,
1014 .uevent
= wmi_dev_uevent
,
1015 .probe
= wmi_dev_probe
,
1016 .remove
= wmi_dev_remove
,
1019 static const struct device_type wmi_type_event
= {
1021 .groups
= wmi_event_groups
,
1022 .release
= wmi_dev_release
,
1025 static const struct device_type wmi_type_method
= {
1027 .groups
= wmi_method_groups
,
1028 .release
= wmi_dev_release
,
1031 static const struct device_type wmi_type_data
= {
1033 .groups
= wmi_data_groups
,
1034 .release
= wmi_dev_release
,
1037 static int wmi_create_device(struct device
*wmi_bus_dev
,
1038 const struct guid_block
*gblock
,
1039 struct wmi_block
*wblock
,
1040 struct acpi_device
*device
)
1042 struct acpi_device_info
*info
;
1046 if (gblock
->flags
& ACPI_WMI_EVENT
) {
1047 wblock
->dev
.dev
.type
= &wmi_type_event
;
1051 if (gblock
->flags
& ACPI_WMI_METHOD
) {
1052 wblock
->dev
.dev
.type
= &wmi_type_method
;
1053 mutex_init(&wblock
->char_mutex
);
1058 * Data Block Query Control Method (WQxx by convention) is
1059 * required per the WMI documentation. If it is not present,
1060 * we ignore this data block.
1062 strcpy(method
, "WQ");
1063 strncat(method
, wblock
->gblock
.object_id
, 2);
1064 result
= get_subobj_info(device
->handle
, method
, &info
);
1067 dev_warn(wmi_bus_dev
,
1068 "%s data block query control method not found\n",
1073 wblock
->dev
.dev
.type
= &wmi_type_data
;
1076 * The Microsoft documentation specifically states:
1078 * Data blocks registered with only a single instance
1079 * can ignore the parameter.
1081 * ACPICA will get mad at us if we call the method with the wrong number
1082 * of arguments, so check what our method expects. (On some Dell
1083 * laptops, WQxx may not be a method at all.)
1085 if (info
->type
!= ACPI_TYPE_METHOD
|| info
->param_count
== 0)
1086 wblock
->read_takes_no_args
= true;
1090 strcpy(method
, "WS");
1091 strncat(method
, wblock
->gblock
.object_id
, 2);
1092 result
= get_subobj_info(device
->handle
, method
, NULL
);
1095 wblock
->dev
.setable
= true;
1098 wblock
->dev
.dev
.bus
= &wmi_bus_type
;
1099 wblock
->dev
.dev
.parent
= wmi_bus_dev
;
1101 dev_set_name(&wblock
->dev
.dev
, "%pUL", gblock
->guid
);
1103 device_initialize(&wblock
->dev
.dev
);
1108 static void wmi_free_devices(struct acpi_device
*device
)
1110 struct wmi_block
*wblock
, *next
;
1112 /* Delete devices for all the GUIDs */
1113 list_for_each_entry_safe(wblock
, next
, &wmi_block_list
, list
) {
1114 if (wblock
->acpi_device
== device
) {
1115 list_del(&wblock
->list
);
1116 device_unregister(&wblock
->dev
.dev
);
1121 static bool guid_already_parsed(struct acpi_device
*device
, const u8
*guid
)
1123 struct wmi_block
*wblock
;
1125 list_for_each_entry(wblock
, &wmi_block_list
, list
) {
1126 if (memcmp(wblock
->gblock
.guid
, guid
, 16) == 0) {
1128 * Because we historically didn't track the relationship
1129 * between GUIDs and ACPI nodes, we don't know whether
1130 * we need to suppress GUIDs that are unique on a
1131 * given node but duplicated across nodes.
1133 dev_warn(&device
->dev
, "duplicate WMI GUID %pUL (first instance was on %s)\n",
1134 guid
, dev_name(&wblock
->acpi_device
->dev
));
1143 * Parse the _WDG method for the GUID data blocks
1145 static int parse_wdg(struct device
*wmi_bus_dev
, struct acpi_device
*device
)
1147 struct acpi_buffer out
= {ACPI_ALLOCATE_BUFFER
, NULL
};
1148 const struct guid_block
*gblock
;
1149 struct wmi_block
*wblock
, *next
;
1150 union acpi_object
*obj
;
1155 status
= acpi_evaluate_object(device
->handle
, "_WDG", NULL
, &out
);
1156 if (ACPI_FAILURE(status
))
1159 obj
= (union acpi_object
*) out
.pointer
;
1163 if (obj
->type
!= ACPI_TYPE_BUFFER
) {
1165 goto out_free_pointer
;
1168 gblock
= (const struct guid_block
*)obj
->buffer
.pointer
;
1169 total
= obj
->buffer
.length
/ sizeof(struct guid_block
);
1171 for (i
= 0; i
< total
; i
++) {
1173 wmi_dump_wdg(&gblock
[i
]);
1176 * Some WMI devices, like those for nVidia hooks, have a
1177 * duplicate GUID. It's not clear what we should do in this
1178 * case yet, so for now, we'll just ignore the duplicate
1179 * for device creation.
1181 if (guid_already_parsed(device
, gblock
[i
].guid
))
1184 wblock
= kzalloc(sizeof(struct wmi_block
), GFP_KERNEL
);
1190 wblock
->acpi_device
= device
;
1191 wblock
->gblock
= gblock
[i
];
1193 retval
= wmi_create_device(wmi_bus_dev
, &gblock
[i
], wblock
, device
);
1199 list_add_tail(&wblock
->list
, &wmi_block_list
);
1202 wblock
->handler
= wmi_notify_debug
;
1203 wmi_method_enable(wblock
, 1);
1208 * Now that all of the devices are created, add them to the
1209 * device tree and probe subdrivers.
1211 list_for_each_entry_safe(wblock
, next
, &wmi_block_list
, list
) {
1212 if (wblock
->acpi_device
!= device
)
1215 retval
= device_add(&wblock
->dev
.dev
);
1217 dev_err(wmi_bus_dev
, "failed to register %pUL\n",
1218 wblock
->gblock
.guid
);
1220 wmi_method_enable(wblock
, 0);
1221 list_del(&wblock
->list
);
1222 put_device(&wblock
->dev
.dev
);
1232 * WMI can have EmbeddedControl access regions. In which case, we just want to
1233 * hand these off to the EC driver.
1236 acpi_wmi_ec_space_handler(u32 function
, acpi_physical_address address
,
1237 u32 bits
, u64
*value
,
1238 void *handler_context
, void *region_context
)
1240 int result
= 0, i
= 0;
1243 if ((address
> 0xFF) || !value
)
1244 return AE_BAD_PARAMETER
;
1246 if (function
!= ACPI_READ
&& function
!= ACPI_WRITE
)
1247 return AE_BAD_PARAMETER
;
1250 return AE_BAD_PARAMETER
;
1252 if (function
== ACPI_READ
) {
1253 result
= ec_read(address
, &temp
);
1254 (*value
) |= ((u64
)temp
) << i
;
1256 temp
= 0xff & ((*value
) >> i
);
1257 result
= ec_write(address
, temp
);
1262 return AE_BAD_PARAMETER
;
1264 return AE_NOT_FOUND
;
1272 static void acpi_wmi_notify_handler(acpi_handle handle
, u32 event
,
1275 struct guid_block
*block
;
1276 struct wmi_block
*wblock
;
1277 bool found_it
= false;
1279 list_for_each_entry(wblock
, &wmi_block_list
, list
) {
1280 block
= &wblock
->gblock
;
1282 if (wblock
->acpi_device
->handle
== handle
&&
1283 (block
->flags
& ACPI_WMI_EVENT
) &&
1284 (block
->notify_id
== event
))
1294 /* If a driver is bound, then notify the driver. */
1295 if (wblock
->dev
.dev
.driver
) {
1296 struct wmi_driver
*driver
;
1297 struct acpi_object_list input
;
1298 union acpi_object params
[1];
1299 struct acpi_buffer evdata
= { ACPI_ALLOCATE_BUFFER
, NULL
};
1302 driver
= container_of(wblock
->dev
.dev
.driver
,
1303 struct wmi_driver
, driver
);
1306 input
.pointer
= params
;
1307 params
[0].type
= ACPI_TYPE_INTEGER
;
1308 params
[0].integer
.value
= event
;
1310 status
= acpi_evaluate_object(wblock
->acpi_device
->handle
,
1311 "_WED", &input
, &evdata
);
1312 if (ACPI_FAILURE(status
)) {
1313 dev_warn(&wblock
->dev
.dev
,
1314 "failed to get event data\n");
1319 driver
->notify(&wblock
->dev
,
1320 (union acpi_object
*)evdata
.pointer
);
1322 kfree(evdata
.pointer
);
1323 } else if (wblock
->handler
) {
1324 /* Legacy handler */
1325 wblock
->handler(event
, wblock
->handler_data
);
1329 pr_info("DEBUG Event GUID: %pUL\n", wblock
->gblock
.guid
);
1331 acpi_bus_generate_netlink_event(
1332 wblock
->acpi_device
->pnp
.device_class
,
1333 dev_name(&wblock
->dev
.dev
),
1338 static int acpi_wmi_remove(struct platform_device
*device
)
1340 struct acpi_device
*acpi_device
= ACPI_COMPANION(&device
->dev
);
1342 acpi_remove_notify_handler(acpi_device
->handle
, ACPI_DEVICE_NOTIFY
,
1343 acpi_wmi_notify_handler
);
1344 acpi_remove_address_space_handler(acpi_device
->handle
,
1345 ACPI_ADR_SPACE_EC
, &acpi_wmi_ec_space_handler
);
1346 wmi_free_devices(acpi_device
);
1347 device_unregister((struct device
*)dev_get_drvdata(&device
->dev
));
1352 static int acpi_wmi_probe(struct platform_device
*device
)
1354 struct acpi_device
*acpi_device
;
1355 struct device
*wmi_bus_dev
;
1359 acpi_device
= ACPI_COMPANION(&device
->dev
);
1361 dev_err(&device
->dev
, "ACPI companion is missing\n");
1365 status
= acpi_install_address_space_handler(acpi_device
->handle
,
1367 &acpi_wmi_ec_space_handler
,
1369 if (ACPI_FAILURE(status
)) {
1370 dev_err(&device
->dev
, "Error installing EC region handler\n");
1374 status
= acpi_install_notify_handler(acpi_device
->handle
,
1376 acpi_wmi_notify_handler
,
1378 if (ACPI_FAILURE(status
)) {
1379 dev_err(&device
->dev
, "Error installing notify handler\n");
1381 goto err_remove_ec_handler
;
1384 wmi_bus_dev
= device_create(&wmi_bus_class
, &device
->dev
, MKDEV(0, 0),
1385 NULL
, "wmi_bus-%s", dev_name(&device
->dev
));
1386 if (IS_ERR(wmi_bus_dev
)) {
1387 error
= PTR_ERR(wmi_bus_dev
);
1388 goto err_remove_notify_handler
;
1390 dev_set_drvdata(&device
->dev
, wmi_bus_dev
);
1392 error
= parse_wdg(wmi_bus_dev
, acpi_device
);
1394 pr_err("Failed to parse WDG method\n");
1395 goto err_remove_busdev
;
1401 device_unregister(wmi_bus_dev
);
1403 err_remove_notify_handler
:
1404 acpi_remove_notify_handler(acpi_device
->handle
, ACPI_DEVICE_NOTIFY
,
1405 acpi_wmi_notify_handler
);
1407 err_remove_ec_handler
:
1408 acpi_remove_address_space_handler(acpi_device
->handle
,
1410 &acpi_wmi_ec_space_handler
);
1415 int __must_check
__wmi_driver_register(struct wmi_driver
*driver
,
1416 struct module
*owner
)
1418 driver
->driver
.owner
= owner
;
1419 driver
->driver
.bus
= &wmi_bus_type
;
1421 return driver_register(&driver
->driver
);
1423 EXPORT_SYMBOL(__wmi_driver_register
);
1425 void wmi_driver_unregister(struct wmi_driver
*driver
)
1427 driver_unregister(&driver
->driver
);
1429 EXPORT_SYMBOL(wmi_driver_unregister
);
1431 static int __init
acpi_wmi_init(void)
1438 error
= class_register(&wmi_bus_class
);
1442 error
= bus_register(&wmi_bus_type
);
1444 goto err_unreg_class
;
1446 error
= platform_driver_register(&acpi_wmi_driver
);
1448 pr_err("Error loading mapper\n");
1455 bus_unregister(&wmi_bus_type
);
1458 class_unregister(&wmi_bus_class
);
1463 static void __exit
acpi_wmi_exit(void)
1465 platform_driver_unregister(&acpi_wmi_driver
);
1466 bus_unregister(&wmi_bus_type
);
1467 class_unregister(&wmi_bus_class
);
1470 subsys_initcall_sync(acpi_wmi_init
);
1471 module_exit(acpi_wmi_exit
);