Index: share/man/man4/acpi_wmi_bmof.4 =================================================================== --- /dev/null +++ share/man/man4/acpi_wmi_bmof.4 @@ -0,0 +1,99 @@ +\" Copyright (c) 2019 Takanori Watanabe +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd September 5, 2019 +.Dt ACPI_WMI_BMOF 4 +.Os +.Sh NAME +.Nm acpi_wmi_bmof +.Nd "extracting ACPI WMI embedded binary form of Managed Object Format file" +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device acpi_wmi" +.Cd "device acpi_wmi_bmof" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +acpi_wmi_bmof_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides an interface for embedded Managed Object Format file in WMI. +(e.g. Lenovo Laptops). +It creates sysctl 'data' node under device sysctl node. + +.\".Sh FILES +.\".Bl -tag -width /dev/wmistat%d -compact +.\".It Pa /dev/wmistat%d +.\"WMI status device. +.\".El +.Sh EXAMPLES +.Bd -literal +# sysctl -b dev.acpi_wmi_bmof.0.data | bmf2mof +[abstract] +class Lenovo_BIOSElement { +}; + +[WMI, Dynamic, Provider("WMIProv"), WmiExpense(1), Description("Bios Setting"), +GUID("{51F5230E-9677-46cd-A1CF-C0B23EE34DB7}"), Locale("MS\\0x409")] +class Lenovo_BiosSetting : Lenovo_BiosElement { + [key, read] String InstanceName; + [read] Boolean Active; + [WmiDataId(1), Description("BIOS setting")] String CurrentSetting; + }; + bra. bra. + +Here, bmf2mof is part of https://github.com/pali/bmfdec . +.Ed +.Sh SEE ALSO +.Xr acpi 4 +.Xr sysctl 4 +.Sh HISTORY +The +.Nm +device driver first appeared in +.Fx 13.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Takanori Watanabe Aq Mt takawata@freebsd.org . +.Pp +Work has been inspired by the Linux wmi-bmof driver written by Andy Lutomirski . +.Pp +See http://www.microsoft.com/whdc/system/pnppwr/wmi/wmi-acpi.mspx for +the specification of ACPI-WMI. +.Pp +This manual page was written by +.An Takanori Watanabe Aq Mt takawata@freebsd.org . Index: sys/conf/files =================================================================== --- sys/conf/files +++ sys/conf/files @@ -731,6 +731,7 @@ dev/aacraid/aacraid_linux.c optional aacraid compat_linux dev/aacraid/aacraid_pci.c optional aacraid pci dev/acpi_support/acpi_wmi.c optional acpi_wmi acpi +dev/acpi_support/acpi_wmi_bmof.c optional acpi_wmi_bmof acpi dev/acpi_support/acpi_asus.c optional acpi_asus acpi dev/acpi_support/acpi_asus_wmi.c optional acpi_asus_wmi acpi dev/acpi_support/acpi_fujitsu.c optional acpi_fujitsu acpi Index: sys/dev/acpi_support/acpi_wmi_bmof.c =================================================================== --- /dev/null +++ sys/dev/acpi_support/acpi_wmi_bmof.c @@ -0,0 +1,123 @@ +#include +__FBSDID("$FreeBSD$"); + +#include "opt_acpi.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "acpi_wmi_if.h" +#define BMOF_WMI_UUID "05901221-D566-11D1-B2F0-00A0C9062910" + +struct acpi_wmi_bmof_softc{ + char *mofbuf; +}; + + +static void +acpi_wmi_bmof_identify(driver_t *driver, device_t parent) +{ + + /* Don't do anything if driver is disabled. */ + if (acpi_disabled("bmof")) + return; + /* Add only a single device instance. */ + if (device_find_child(parent, "acpi_wmi_bmof", -1) != NULL) + return; + + /* Check management GUID to see whether system is compatible. */ + if (!ACPI_WMI_PROVIDES_GUID_STRING(parent, + BMOF_WMI_UUID)) + return; + + if (BUS_ADD_CHILD(parent, 0, "acpi_wmi_bmof", -1) == NULL) + device_printf(parent, "add acpi_wmi_bmof\n"); +} + +static int +acpi_wmi_bmof_probe(device_t dev) +{ + + if (!ACPI_WMI_PROVIDES_GUID_STRING(device_get_parent(dev), + BMOF_WMI_UUID)) + return (EINVAL); + device_set_desc(dev, "BMOF Sysctl"); + return (0); + +} + +static int +acpi_wmi_bmof_attach(device_t dev) +{ + struct acpi_wmi_bmof_softc *sc = device_get_softc(dev); + struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);; + struct sysctl_oid *oid = device_get_sysctl_tree(dev); + ACPI_BUFFER out = { ACPI_ALLOCATE_BUFFER, NULL}; + ACPI_STATUS status; + ACPI_OBJECT *obj; + + status = ACPI_WMI_GET_BLOCK(device_get_parent(dev), + BMOF_WMI_UUID, 0, &out); + if(ACPI_FAILURE(status)){ + device_printf(dev, "Error %s\n", AcpiFormatException(status)); + AcpiOsFree(out.Pointer); + return EINVAL; + } + obj = out.Pointer; + + if (!obj || obj->Type != ACPI_TYPE_BUFFER) { + AcpiOsFree(out.Pointer); + return EINVAL; + } + + sc->mofbuf = out.Pointer; + device_printf(dev, "Length %lu Buflen %u\n", out.Length, + obj->Buffer.Length); + SYSCTL_ADD_OPAQUE(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "data", + CTLFLAG_RD | CTLFLAG_MPSAFE, + obj->Buffer.Pointer, + obj->Buffer.Length, "A", "MOF Blob"); + + return 0; +} + +static int +acpi_wmi_bmof_detach(device_t dev) +{ + struct acpi_wmi_bmof_softc *sc = device_get_softc(dev); + AcpiOsFree(sc->mofbuf); + return 0; + +} + +static device_method_t acpi_wmi_bmof_methods[] = { + DEVMETHOD(device_identify, acpi_wmi_bmof_identify), + DEVMETHOD(device_probe, acpi_wmi_bmof_probe), + DEVMETHOD(device_attach, acpi_wmi_bmof_attach), + DEVMETHOD(device_detach, acpi_wmi_bmof_detach), + + DEVMETHOD_END +}; + +static driver_t acpi_wmi_bmof_driver = { + "acpi_wmi_bmof", + acpi_wmi_bmof_methods, + sizeof(struct acpi_wmi_bmof_softc), +}; + +static devclass_t acpi_wmi_bmof_devclass; + +DRIVER_MODULE(acpi_wmi_bmof, acpi_wmi, acpi_wmi_bmof_driver, + acpi_wmi_bmof_devclass, 0, 0); +MODULE_DEPEND(acpi_wmi_bmof, acpi_wmi, 1, 1, 1); +MODULE_DEPEND(acpi_wmi_bmof, acpi, 1, 1, 1); + Index: sys/modules/acpi/Makefile =================================================================== --- sys/modules/acpi/Makefile +++ sys/modules/acpi/Makefile @@ -2,6 +2,6 @@ SUBDIR= acpi_asus acpi_asus_wmi acpi_dock acpi_fujitsu acpi_hp \ acpi_ibm acpi_panasonic acpi_sony acpi_toshiba \ - acpi_video acpi_wmi aibs + acpi_video acpi_wmi acpi_wmi_bmof aibs .include