1 /* $NetBSD: wmi_acpivar.h,v 1.7 2020/04/16 23:29:52 rin Exp $ */ 2 3 /*- 4 * Copyright (c) 2009, 2010 Jukka Ruohonen <jruohonen@iki.fi> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #ifndef _SYS_DEV_ACPI_WMI_WMI_ACPIVAR_H 31 #define _SYS_DEV_ACPI_WMI_WMI_ACPIVAR_H 32 33 #include <sys/cdefs.h> 34 __KERNEL_RCSID(0, "$NetBSD: wmi_acpivar.h,v 1.7 2020/04/16 23:29:52 rin Exp $"); 35 36 ACPI_STATUS acpi_wmi_event_register(device_t, ACPI_NOTIFY_HANDLER); 37 ACPI_STATUS acpi_wmi_event_deregister(device_t); 38 ACPI_STATUS acpi_wmi_event_get(device_t, uint32_t, ACPI_BUFFER *); 39 40 int acpi_wmi_guid_match(device_t, const char *); 41 42 ACPI_STATUS acpi_wmi_data_query(device_t, const char *, 43 uint8_t, ACPI_BUFFER *); 44 ACPI_STATUS acpi_wmi_data_write(device_t, const char *, 45 uint8_t, ACPI_BUFFER *); 46 47 ACPI_STATUS acpi_wmi_method(device_t, const char *, uint8_t, 48 uint32_t, ACPI_BUFFER *, ACPI_BUFFER *); 49 50 struct guid_t { 51 52 /* 53 * The GUID itself. The used format is the usual 32-16-16-64-bit 54 * representation. All except the fourth field are in native byte 55 * order. A 32-16-16-16-48-bit hexadecimal notation with hyphens 56 * is used for human-readable GUIDs. 57 */ 58 struct { 59 uint32_t data1; 60 uint16_t data2; 61 uint16_t data3; 62 uint8_t data4[8]; 63 } __packed; 64 65 union { 66 char oid[2]; /* ACPI object ID. */ 67 68 struct { 69 uint8_t nid; /* Notification value. */ 70 uint8_t res; /* Reserved. */ 71 } __packed; 72 } __packed; 73 74 uint8_t count; /* Number of instances. */ 75 uint8_t flags; /* Additional flags. */ 76 77 } __packed; 78 79 #define ACPI_WMI_FLAG_EXPENSIVE 0x01 80 #define ACPI_WMI_FLAG_METHOD 0x02 81 #define ACPI_WMI_FLAG_STRING 0x04 82 #define ACPI_WMI_FLAG_EVENT 0x08 83 #define ACPI_WMI_FLAG_DATA (ACPI_WMI_FLAG_EXPENSIVE | \ 84 ACPI_WMI_FLAG_STRING) 85 86 struct wmi_t { 87 struct guid_t guid; 88 bool eevent; 89 90 SIMPLEQ_ENTRY(wmi_t) wmi_link; 91 }; 92 93 struct acpi_wmi_softc { 94 device_t sc_dev; 95 device_t sc_child; 96 device_t sc_ecdev; 97 struct acpi_devnode *sc_node; 98 ACPI_NOTIFY_HANDLER sc_handler; 99 100 SIMPLEQ_HEAD(, wmi_t) wmi_head; 101 }; 102 103 #define UGET16(x) (*(uint16_t *)(x)) 104 #define UGET64(x) (*(uint64_t *)(x)) 105 106 #define HEXCHAR(x) (((x) >= '0' && (x) <= '9') || \ 107 ((x) >= 'a' && (x) <= 'f') || \ 108 ((x) >= 'A' && (x) <= 'F')) 109 110 #define GUIDCMP(a, b) \ 111 ((a)->data1 == (b)->data1 && \ 112 (a)->data2 == (b)->data2 && \ 113 (a)->data3 == (b)->data3 && \ 114 UGET64((a)->data4) == UGET64((b)->data4)) 115 116 #endif /* !_SYS_DEV_ACPI_WMI_WMI_ACPIVAR_H */ 117