#include <acpi_bus.h>
#include <acpi_drivers.h>
-//#define NDEBUG
+#include <initguid.h>
+#include <poclass.h>
+
+#define NDEBUG
#include <debug.h>
#ifdef ALLOC_PRAGMA
{
NTSTATUS status;
POWER_STATE state;
+ struct acpi_device *device = NULL;
PAGED_CODE ();
+ if (DeviceData->AcpiHandle)
+ acpi_bus_get_device(DeviceData->AcpiHandle, &device);
+
//
// NB: Because we are a bus enumerator, we have no one to whom we could
// defer these irps. Therefore we do not pass them down but merely
switch (IrpStack->MinorFunction) {
case IRP_MN_START_DEVICE:
-
//
// Here we do what ever initialization and ``turning on'' that is
// required to allow others to access this device.
break;
}
+ DeviceData->InterfaceName.Length = 0;
+
+ if (!device)
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_SYS_BUTTON,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+ else if (device->flags.hardware_id &&
+ strstr(device->pnp.hardware_id, ACPI_THERMAL_HID))
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_THERMAL_ZONE,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+ else if (device->flags.hardware_id &&
+ strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID))
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_LID,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+ else if (device->flags.hardware_id &&
+ strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID))
+ {
+ IoRegisterDeviceInterface(DeviceData->Common.Self,
+ &GUID_DEVICE_PROCESSOR,
+ NULL,
+ &DeviceData->InterfaceName);
+ }
+
+ if (DeviceData->InterfaceName.Length != 0)
+ IoSetDeviceInterfaceState(&DeviceData->InterfaceName, TRUE);
+
state.DeviceState = PowerDeviceD0;
PoSetPowerState(DeviceData->Common.Self, DevicePowerState, state);
DeviceData->Common.DevicePowerState = PowerDeviceD0;
case IRP_MN_STOP_DEVICE:
+ if (DeviceData->InterfaceName.Length != 0)
+ IoSetDeviceInterfaceState(&DeviceData->InterfaceName, FALSE);
+
//
// Here we shut down the device and give up and unmap any resources
// we acquired for the device.
break;
+ case IRP_MN_QUERY_INTERFACE:
+
+ status = Bus_PDO_QueryInterface(DeviceData, Irp);
+
+ break;
+
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
deviceCapabilities->NoDisplayInUI = !device->status.show_in_ui;
deviceCapabilities->Address = device->pnp.bus_address;
}
- else
+
+ if (!device ||
+ (device->flags.hardware_id &&
+ (strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID) ||
+ strstr(device->pnp.hardware_id, ACPI_THERMAL_HID) ||
+ strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID))))
{
- deviceCapabilities->EjectSupported = FALSE;
- deviceCapabilities->HardwareDisabled = FALSE;
- deviceCapabilities->Removable = FALSE;
- deviceCapabilities->SurpriseRemovalOK = FALSE;
- deviceCapabilities->UniqueID = FALSE;
- deviceCapabilities->NoDisplayInUI = FALSE;
- deviceCapabilities->Address = 0;
+ /* Allow ACPI to control the device if it is a lid button,
+ * a thermal zone, a processor, or a fixed feature button */
+ deviceCapabilities->RawDeviceOK = TRUE;
}
deviceCapabilities->SilentInstall = FALSE;
Buffer = L"ACPI Power Resource";
else if (wcsstr(DeviceData->HardwareIDs, L"Processor") != 0)
Buffer = L"Processor";
- else if (wcsstr(DeviceData->HardwareIDs, L"ACPI_SYS") != 0)
- Buffer = L"ACPI System";
else if (wcsstr(DeviceData->HardwareIDs, L"ThermalZone") != 0)
Buffer = L"ACPI Thermal Zone";
else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0002") != 0)
{
switch (resource->Type)
{
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ {
+ ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+ NumberOfResources += irq_data->InterruptCount;
+ break;
+ }
case ACPI_RESOURCE_TYPE_IRQ:
{
ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
case ACPI_RESOURCE_TYPE_ADDRESS16:
case ACPI_RESOURCE_TYPE_ADDRESS32:
case ACPI_RESOURCE_TYPE_ADDRESS64:
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
case ACPI_RESOURCE_TYPE_MEMORY24:
case ACPI_RESOURCE_TYPE_MEMORY32:
case ACPI_RESOURCE_TYPE_IO:
ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
/* Fill resources list structure */
+ resource = Buffer.Pointer;
while (resource->Type != ACPI_RESOURCE_TYPE_END_TAG)
{
switch (resource->Type)
{
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ {
+ ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+ for (i = 0; i < irq_data->InterruptCount; i++)
+ {
+ ResourceDescriptor->Type = CmResourceTypeInterrupt;
+
+ ResourceDescriptor->ShareDisposition =
+ (irq_data->Sharable == ACPI_SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
+ ResourceDescriptor->Flags =
+ (irq_data->Triggering == ACPI_LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
+ ResourceDescriptor->u.Interrupt.Level = irq_data->Interrupts[i];
+ ResourceDescriptor->u.Interrupt.Vector = 0;
+ ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
+
+ ResourceDescriptor++;
+ }
+ break;
+ }
case ACPI_RESOURCE_TYPE_IRQ:
{
ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
ResourceDescriptor++;
break;
}
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+ {
+ ACPI_RESOURCE_EXTENDED_ADDRESS64 *addr64_data = (ACPI_RESOURCE_EXTENDED_ADDRESS64*) &resource->Data;
+ if (addr64_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+ {
+ DPRINT1("64-bit bus address is not supported!\n");
+ ResourceDescriptor->Type = CmResourceTypeBusNumber;
+ ResourceDescriptor->ShareDisposition = CmResourceShareShared;
+ ResourceDescriptor->Flags = 0;
+ ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Minimum;
+ ResourceDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+ }
+ else if (addr64_data->ResourceType == ACPI_IO_RANGE)
+ {
+ ResourceDescriptor->Type = CmResourceTypePort;
+ ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+ ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
+ if (addr64_data->Decode == ACPI_POS_DECODE)
+ ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
+ ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Minimum;
+ ResourceDescriptor->u.Port.Length = addr64_data->AddressLength;
+ }
+ else
+ {
+ ResourceDescriptor->Type = CmResourceTypeMemory;
+ ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+ ResourceDescriptor->Flags = 0;
+ if (addr64_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+ ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+ else
+ ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+ switch (addr64_data->Info.Mem.Caching)
+ {
+ case ACPI_CACHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
+ case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
+ case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
+ }
+ ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Minimum;
+ ResourceDescriptor->u.Memory.Length = addr64_data->AddressLength;
+ }
+ ResourceDescriptor++;
+ break;
+ }
case ACPI_RESOURCE_TYPE_MEMORY24:
{
ACPI_RESOURCE_MEMORY24 *mem24_data = (ACPI_RESOURCE_MEMORY24*) &resource->Data;
{
switch (resource->Type)
{
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ {
+ ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+ NumberOfResources += irq_data->InterruptCount;
+ break;
+ }
case ACPI_RESOURCE_TYPE_IRQ:
{
ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
case ACPI_RESOURCE_TYPE_ADDRESS16:
case ACPI_RESOURCE_TYPE_ADDRESS32:
case ACPI_RESOURCE_TYPE_ADDRESS64:
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
case ACPI_RESOURCE_TYPE_MEMORY24:
case ACPI_RESOURCE_TYPE_MEMORY32:
case ACPI_RESOURCE_TYPE_IO:
RequirementDescriptor = RequirementsList->List[0].Descriptors;
/* Fill resources list structure */
+ resource = Buffer.Pointer;
while (resource->Type != ACPI_RESOURCE_TYPE_END_TAG)
{
switch (resource->Type)
{
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ {
+ ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+ for (i = 0; i < irq_data->InterruptCount; i++)
+ {
+ RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+ RequirementDescriptor->Type = CmResourceTypeInterrupt;
+ RequirementDescriptor->ShareDisposition = (irq_data->Sharable == ACPI_SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
+ RequirementDescriptor->Flags =(irq_data->Triggering == ACPI_LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
+ RequirementDescriptor->u.Interrupt.MinimumVector =
+ RequirementDescriptor->u.Interrupt.MaximumVector = irq_data->Interrupts[i];
+
+ RequirementDescriptor++;
+ }
+ break;
+ }
case ACPI_RESOURCE_TYPE_IRQ:
{
ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
RequirementDescriptor++;
break;
}
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+ {
+ ACPI_RESOURCE_EXTENDED_ADDRESS64 *addr64_data = (ACPI_RESOURCE_EXTENDED_ADDRESS64*) &resource->Data;
+ RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+ if (addr64_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+ {
+ DPRINT1("64-bit bus address is not supported!\n");
+ RequirementDescriptor->Type = CmResourceTypeBusNumber;
+ RequirementDescriptor->ShareDisposition = CmResourceShareShared;
+ RequirementDescriptor->Flags = 0;
+ RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Minimum;
+ RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Maximum;
+ RequirementDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+ }
+ else if (addr64_data->ResourceType == ACPI_IO_RANGE)
+ {
+ RequirementDescriptor->Type = CmResourceTypePort;
+ RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+ RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
+ if (addr64_data->Decode == ACPI_POS_DECODE)
+ RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
+ RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Minimum;
+ RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Maximum;
+ RequirementDescriptor->u.Port.Length = addr64_data->AddressLength;
+ }
+ else
+ {
+ RequirementDescriptor->Type = CmResourceTypeMemory;
+ RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+ RequirementDescriptor->Flags = 0;
+ if (addr64_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+ RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+ else
+ RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+ switch (addr64_data->Info.Mem.Caching)
+ {
+ case ACPI_CACHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
+ case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
+ case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
+ }
+ RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Minimum;
+ RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Maximum;
+ RequirementDescriptor->u.Memory.Length = addr64_data->AddressLength;
+ }
+ RequirementDescriptor++;
+ break;
+ }
case ACPI_RESOURCE_TYPE_MEMORY24:
{
ACPI_RESOURCE_MEMORY24 *mem24_data = (ACPI_RESOURCE_MEMORY24*) &resource->Data;