Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/acpi_support/acpi_wmi_bmof.c
- This file was added.
Property | Old Value | New Value |
---|---|---|
svn:eol-style | null | native \ No newline at end of property |
svn:keywords | null | FreeBSD=%H \ No newline at end of property |
svn:mime-type | null | text/plain \ No newline at end of property |
#include <sys/cdefs.h> | |||||
__FBSDID("$FreeBSD$"); | |||||
#include "opt_acpi.h" | |||||
#include <sys/param.h> | |||||
#include <sys/conf.h> | |||||
#include <sys/uio.h> | |||||
#include <sys/proc.h> | |||||
#include <sys/kernel.h> | |||||
#include <sys/bus.h> | |||||
#include <sys/sbuf.h> | |||||
#include <sys/module.h> | |||||
#include <sys/sysctl.h> | |||||
#include <contrib/dev/acpica/include/acpi.h> | |||||
#include <contrib/dev/acpica/include/accommon.h> | |||||
#include <dev/acpica/acpivar.h> | |||||
#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); | |||||