tech@ The diff here is the start of an ACPI WMI implementation to try and support the hotkeys on my newer asus laptop. I wanted to get some feedback on this before I went any further.
With this patch I get a line like this in dmesg: acpiwmi at acpi0 not configured so I think it is detecting correctly. Ignore the junk in acpiwmi.c. Index: arch/amd64/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v retrieving revision 1.352 diff -u -p -r1.352 GENERIC --- arch/amd64/conf/GENERIC 4 Nov 2013 14:07:15 -0000 1.352 +++ arch/amd64/conf/GENERIC 9 Nov 2013 05:18:31 -0000 @@ -58,6 +58,7 @@ acpitoshiba* at acpi? acpivideo* at acpi? acpivout* at acpivideo? acpipwrres* at acpi? +acpiwmi* at acpi? aibs* at acpi? mpbios0 at bios0 Index: dev/acpi/acpi.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpi.c,v retrieving revision 1.247 diff -u -p -r1.247 acpi.c --- dev/acpi/acpi.c 6 Nov 2013 10:40:36 -0000 1.247 +++ dev/acpi/acpi.c 9 Nov 2013 05:18:33 -0000 @@ -124,6 +124,7 @@ int acpi_foundtmp(struct aml_node *, voi int acpi_foundprw(struct aml_node *, void *); int acpi_foundvideo(struct aml_node *, void *); int acpi_foundsony(struct aml_node *node, void *arg); +int acpi_foundwmi(struct aml_node *, void *); int acpi_foundide(struct aml_node *node, void *arg); int acpiide_notify(struct aml_node *, int, void *); @@ -945,6 +946,9 @@ acpi_attach(struct device *parent, struc /* attach docks */ aml_find_node(&aml_root, "_DCK", acpi_founddock, sc); + /* check if WMI present */ + aml_find_node(&aml_root, "_WDG", acpi_foundwmi, sc); + /* check if we're running on a sony */ aml_find_node(&aml_root, "GBRT", acpi_foundsony, sc); @@ -2490,6 +2494,26 @@ acpi_foundsony(struct aml_node *node, vo aaa.aaa_memt = sc->sc_memt; aaa.aaa_node = node->parent; aaa.aaa_name = "acpisony"; + + config_found(self, &aaa, acpi_print); + + return 0; +} + +int +acpi_foundwmi(struct aml_node *node, void *arg) +{ + struct acpi_softc *sc = (struct acpi_softc *)arg; + struct device *self = (struct device *)arg; + struct acpi_attach_args aaa; + + dnprintf(10, "found wmi entry: %s\n", node->parent->name); + + memset(&aaa, 0, sizeof(aaa)); + aaa.aaa_iot = sc->sc_iot; + aaa.aaa_memt = sc->sc_memt; + aaa.aaa_node = node->parent; + aaa.aaa_name = "acpiwmi"; config_found(self, &aaa, acpi_print); Index: dev/acpi/acpireg.h =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpireg.h,v retrieving revision 1.29 diff -u -p -r1.29 acpireg.h --- dev/acpi/acpireg.h 6 Nov 2013 10:40:36 -0000 1.29 +++ dev/acpi/acpireg.h 9 Nov 2013 05:18:33 -0000 @@ -728,6 +728,7 @@ struct acpi_ivrs { #define ACPI_DEV_LD "PNP0C0D" /* Lid Device */ #define ACPI_DEV_SBD "PNP0C0E" /* Sleep Button Device */ #define ACPI_DEV_PILD "PNP0C0F" /* PCI Interrupt Link Device */ +#define ACPI_DEV_WMI "PNP0C14" /* Windows Management Instrumentation */ #define ACPI_DEV_MEMD "PNP0C80" /* Memory Device */ #define ACPI_DEV_SHC "ACPI0001" /* SMBus 1.0 Host Controller */ #define ACPI_DEV_SMS1 "ACPI0002" /* Smart Battery Subsystem */ Index: dev/acpi/acpiwmi.c =================================================================== RCS file: dev/acpi/acpiwmi.c diff -N dev/acpi/acpiwmi.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ dev/acpi/acpiwmi.c 9 Nov 2013 05:18:33 -0000 @@ -0,0 +1,63 @@ +/* $OpenBSD$ */ + +#include <sys/param.h> +#include <sys/device.h> +#include <sys/systm.h> +#include <sys/workq.h> + +#include <dev/acpi/acpireg.h> +#include <dev/acpi/acpivar.h> +#include <dev/acpi/acpidev.h> +#include <dev/acpi/amltypes.h> +#include <dev/acpi/dsdt.h> + +struct acpiwmi_softc { + struct device sc_dev; + + struct acpi_softc *sc_acpi; + struct aml_node *sc_devnode; +}; + +int acpiwmi_match(struct device *, void *, void *); +void acpiwmi_attach(struct device *, struct device *, void *); +int acpiwmi_activate(struct device *, int); + +struct cfattach acpiwmi_ca = { + sizeof(struct acpiwmi_softc), + acpiwmi_match, + acpiwmi_attach, + acpiwmi_activate +}; + +struct cfdriver acpiwmi_cd = { + NULL, "acpiwmi", DV_DULL +}; + +const char *acpiwmi_hids[] = { ACPI_DEV_WMI, 0 }; + +int +acpiwmi_match(struct device *parent, void *match, void *aux) +{ + struct acpi_attach_args *aa = aux; + struct cfdata *cf = match; + + return (acpi_matchhids(aa, acpiwmi_hids, cf->cf_driver->cd_name)); +} + +void +acpiwmi_attach(struct device *parent, struct device *self, void *aux) +{ + struct acpiwmi_softc *sc = (struct acpiwmi_softc *)self; + struct acpi_attach_args *aa = aux; + + sc->sc_acpi = (struct acpi_softc *)parent; + sc->sc_devnode = aa->aaa_node; + + printf("\n"); +} + +int +acpiwmi_activate(struct device *self, int act) +{ + return (0); +} Index: dev/acpi/files.acpi =================================================================== RCS file: /cvs/src/sys/dev/acpi/files.acpi,v retrieving revision 1.27 diff -u -p -r1.27 files.acpi --- dev/acpi/files.acpi 6 Nov 2013 10:40:36 -0000 1.27 +++ dev/acpi/files.acpi 9 Nov 2013 05:18:33 -0000 @@ -107,6 +107,11 @@ device acpipwrres attach acpipwrres at acpi file dev/acpi/acpipwrres.c acpipwrres needs-flag +# ACPI wmi +device acpiwmi +attach acpiwmi at acpi +file dev/acpi/acpiwmi.c acpiwmi + # ASUSTeK AI Booster ATK0110 device aibs attach aibs at acpi