Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/acpi_support/acpi_wmi.c
Show First 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | |||||
#define _COMPONENT ACPI_OEM | #define _COMPONENT ACPI_OEM | ||||
ACPI_MODULE_NAME("ACPI_WMI"); | ACPI_MODULE_NAME("ACPI_WMI"); | ||||
#define ACPI_WMI_REGFLAG_EXPENSIVE 0x1 /* GUID flag: Expensive operation */ | #define ACPI_WMI_REGFLAG_EXPENSIVE 0x1 /* GUID flag: Expensive operation */ | ||||
#define ACPI_WMI_REGFLAG_METHOD 0x2 /* GUID flag: Method call */ | #define ACPI_WMI_REGFLAG_METHOD 0x2 /* GUID flag: Method call */ | ||||
#define ACPI_WMI_REGFLAG_STRING 0x4 /* GUID flag: String */ | #define ACPI_WMI_REGFLAG_STRING 0x4 /* GUID flag: String */ | ||||
#define ACPI_WMI_REGFLAG_EVENT 0x8 /* GUID flag: Event */ | #define ACPI_WMI_REGFLAG_EVENT 0x8 /* GUID flag: Event */ | ||||
#define ACPI_WMI_BMOF_UUID "05901221-D566-11D1-B2F0-00A0C9062910" | |||||
/* | /* | ||||
* acpi_wmi driver private structure | * acpi_wmi driver private structure | ||||
*/ | */ | ||||
struct acpi_wmi_softc { | struct acpi_wmi_softc { | ||||
device_t wmi_dev; /* wmi device id */ | device_t wmi_dev; /* wmi device id */ | ||||
ACPI_HANDLE wmi_handle; /* handle of the PNP0C14 node */ | ACPI_HANDLE wmi_handle; /* handle of the PNP0C14 node */ | ||||
device_t ec_dev; /* acpi_ec0 */ | device_t ec_dev; /* acpi_ec0 */ | ||||
struct cdev *wmistat_dev_t; /* wmistat device handle */ | struct cdev *wmistat_dev_t; /* wmistat device handle */ | ||||
struct sbuf wmistat_sbuf; /* sbuf for /dev/wmistat output */ | struct sbuf wmistat_sbuf; /* sbuf for /dev/wmistat output */ | ||||
pid_t wmistat_open_pid; /* pid operating on /dev/wmistat */ | pid_t wmistat_open_pid; /* pid operating on /dev/wmistat */ | ||||
int wmistat_bufptr; /* /dev/wmistat ptr to buffer position */ | int wmistat_bufptr; /* /dev/wmistat ptr to buffer position */ | ||||
char *mofbuf; | |||||
TAILQ_HEAD(wmi_info_list_head, wmi_info) wmi_info_list; | TAILQ_HEAD(wmi_info_list_head, wmi_info) wmi_info_list; | ||||
}; | }; | ||||
/* | /* | ||||
* Struct that holds information about | * Struct that holds information about | ||||
* about a single GUID entry in _WDG | * about a single GUID entry in _WDG | ||||
*/ | */ | ||||
struct guid_info { | struct guid_info { | ||||
▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | sc->wmistat_dev_t = make_dev(&wmistat_cdevsw, 0, UID_ROOT, | ||||
GID_WHEEL, 0644, "wmistat%d", device_get_unit(dev)); | GID_WHEEL, 0644, "wmistat%d", device_get_unit(dev)); | ||||
sc->wmistat_dev_t->si_drv1 = sc; | sc->wmistat_dev_t->si_drv1 = sc; | ||||
sc->wmistat_open_pid = 0; | sc->wmistat_open_pid = 0; | ||||
sc->wmistat_bufptr = -1; | sc->wmistat_bufptr = -1; | ||||
ret = 0; | ret = 0; | ||||
} | } | ||||
ACPI_SERIAL_END(acpi_wmi); | ACPI_SERIAL_END(acpi_wmi); | ||||
if (acpi_wmi_provides_guid_string_method(dev, ACPI_WMI_BMOF_UUID)) { | |||||
ACPI_BUFFER out = { ACPI_ALLOCATE_BUFFER, NULL }; | |||||
ACPI_OBJECT *obj; | |||||
device_printf(dev, "Embedded MOF found\n"); | |||||
status = acpi_wmi_get_block_method(dev, ACPI_WMI_BMOF_UUID, | |||||
0, &out); | |||||
if (ACPI_SUCCESS(status)) { | |||||
obj = out.Pointer; | |||||
if (obj && obj->Type == ACPI_TYPE_BUFFER) { | |||||
SYSCTL_ADD_OPAQUE(device_get_sysctl_ctx(dev), | |||||
SYSCTL_CHILDREN( | |||||
device_get_sysctl_tree(dev)), | |||||
OID_AUTO, "bmof", | |||||
CTLFLAG_RD | CTLFLAG_MPSAFE, | |||||
obj->Buffer.Pointer, | |||||
obj->Buffer.Length, | |||||
"A", "MOF Blob"); | |||||
} | |||||
} | |||||
sc->mofbuf = out.Pointer; | |||||
} | |||||
if (ret == 0) { | if (ret == 0) { | ||||
bus_generic_probe(dev); | bus_generic_probe(dev); | ||||
ret = bus_generic_attach(dev); | ret = bus_generic_attach(dev); | ||||
} | } | ||||
return (ret); | return (ret); | ||||
} | } | ||||
Show All 31 Lines | if (sc->wmistat_open_pid != 0) { | ||||
} | } | ||||
if (sc->wmistat_bufptr != -1) { | if (sc->wmistat_bufptr != -1) { | ||||
sbuf_delete(&sc->wmistat_sbuf); | sbuf_delete(&sc->wmistat_sbuf); | ||||
sc->wmistat_bufptr = -1; | sc->wmistat_bufptr = -1; | ||||
} | } | ||||
sc->wmistat_open_pid = 0; | sc->wmistat_open_pid = 0; | ||||
destroy_dev(sc->wmistat_dev_t); | destroy_dev(sc->wmistat_dev_t); | ||||
ret = 0; | ret = 0; | ||||
AcpiOsFree(sc->mofbuf); | |||||
} | } | ||||
ACPI_SERIAL_END(acpi_wmi); | ACPI_SERIAL_END(acpi_wmi); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 692 Lines • Show Last 20 Lines |