[ACPI]
[reactos.git] / reactos / drivers / bus / acpi / buspdo.c
index eb8f668..84bd1d8 100644 (file)
@@ -8,7 +8,10 @@
 #include <acpi_bus.h>
 #include <acpi_drivers.h>
 
-//#define NDEBUG
+#include <initguid.h>
+#include <poclass.h>
+
+#define NDEBUG
 #include <debug.h>
 
 #ifdef ALLOC_PRAGMA
@@ -33,9 +36,13 @@ Bus_PDO_PnP (
 {
     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
@@ -45,7 +52,6 @@ Bus_PDO_PnP (
     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.
@@ -59,6 +65,43 @@ Bus_PDO_PnP (
             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;
@@ -68,6 +111,9 @@ Bus_PDO_PnP (
 
     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.
@@ -176,6 +222,12 @@ Bus_PDO_PnP (
 
         break;
 
+    case IRP_MN_QUERY_INTERFACE:
+
+        status = Bus_PDO_QueryInterface(DeviceData, Irp);
+
+        break;
+
 
     case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
 
@@ -326,15 +378,16 @@ Bus_PDO_QueryDeviceCaps(
        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;
@@ -548,8 +601,6 @@ Bus_PDO_QueryDeviceText(
                        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)
@@ -621,6 +672,12 @@ Bus_PDO_QueryResources(
        {
                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;
@@ -633,6 +690,12 @@ Bus_PDO_QueryResources(
                                NumberOfResources += dma_data->ChannelCount;
                                break;
                        }
+                       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:
                        {
                                NumberOfResources++;
@@ -665,10 +728,30 @@ Bus_PDO_QueryResources(
        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;
@@ -725,13 +808,214 @@ Bus_PDO_QueryResources(
                                        ResourceDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE;
                                else
                                        ResourceDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-                               ResourceDescriptor->u.Port.Start.u.HighPart = 0;
-                               ResourceDescriptor->u.Port.Start.u.LowPart = io_data->Minimum;
+                               ResourceDescriptor->u.Port.Start.QuadPart = io_data->Minimum;
                                ResourceDescriptor->u.Port.Length = io_data->AddressLength;
 
                                ResourceDescriptor++;
                                break;
                        }
+                       case ACPI_RESOURCE_TYPE_ADDRESS16:
+                       {
+                               ACPI_RESOURCE_ADDRESS16 *addr16_data = (ACPI_RESOURCE_ADDRESS16*) &resource->Data;
+                               if (addr16_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeBusNumber;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareShared;
+                                       ResourceDescriptor->Flags = 0;
+                                       ResourceDescriptor->u.BusNumber.Start = addr16_data->Minimum;
+                                       ResourceDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+                               }
+                               else if (addr16_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypePort;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
+                                       if (addr16_data->Decode == ACPI_POS_DECODE)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
+                                       ResourceDescriptor->u.Port.Start.QuadPart = addr16_data->Minimum;
+                                       ResourceDescriptor->u.Port.Length = addr16_data->AddressLength;
+                               }
+                               else
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeMemory;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = 0;
+                                       if (addr16_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr16_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 = addr16_data->Minimum;
+                                       ResourceDescriptor->u.Memory.Length = addr16_data->AddressLength;
+                               }
+                               ResourceDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS32:
+                       {
+                               ACPI_RESOURCE_ADDRESS32 *addr32_data = (ACPI_RESOURCE_ADDRESS32*) &resource->Data;
+                               if (addr32_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeBusNumber;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareShared;
+                                       ResourceDescriptor->Flags = 0;
+                                       ResourceDescriptor->u.BusNumber.Start = addr32_data->Minimum;
+                                       ResourceDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+                               }
+                               else if (addr32_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypePort;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
+                                       if (addr32_data->Decode == ACPI_POS_DECODE)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
+                                       ResourceDescriptor->u.Port.Start.QuadPart = addr32_data->Minimum;
+                                       ResourceDescriptor->u.Port.Length = addr32_data->AddressLength;
+                               }
+                               else
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeMemory;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = 0;
+                                       if (addr32_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr32_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 = addr32_data->Minimum;
+                                       ResourceDescriptor->u.Memory.Length = addr32_data->AddressLength;
+                               }
+                               ResourceDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS64:
+                       {
+                               ACPI_RESOURCE_ADDRESS64 *addr64_data = (ACPI_RESOURCE_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_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;
+                               ResourceDescriptor->Type = CmResourceTypeMemory;
+                               ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               ResourceDescriptor->Flags = CM_RESOURCE_MEMORY_24;
+                               if (mem24_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               ResourceDescriptor->u.Memory.Start.QuadPart = mem24_data->Minimum;
+                               ResourceDescriptor->u.Memory.Length = mem24_data->AddressLength;
+
+                               ResourceDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_MEMORY32:
+                       {
+                               ACPI_RESOURCE_MEMORY32 *mem32_data = (ACPI_RESOURCE_MEMORY32*) &resource->Data;
+                               ResourceDescriptor->Type = CmResourceTypeMemory;
+                               ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               ResourceDescriptor->Flags = 0;
+                               if (mem32_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               ResourceDescriptor->u.Memory.Start.QuadPart = mem32_data->Minimum;
+                               ResourceDescriptor->u.Memory.Length = mem32_data->AddressLength;
+
+                               ResourceDescriptor++;
+                               break;
+                       }
                        default:
                        {
                                break;
@@ -803,6 +1087,12 @@ Bus_PDO_QueryResourceRequirements(
        {
                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;
@@ -815,6 +1105,12 @@ Bus_PDO_QueryResourceRequirements(
                                NumberOfResources += dma_data->ChannelCount;
                                break;
                        }
+                       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:
                        {
                                NumberOfResources++;
@@ -847,10 +1143,27 @@ Bus_PDO_QueryResourceRequirements(
        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;
@@ -905,9 +1218,7 @@ Bus_PDO_QueryResourceRequirements(
                                        RequirementDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE;
                                else
                                        RequirementDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-
                                RequirementDescriptor->u.Port.Length = io_data->AddressLength;
-
                                RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
                                RequirementDescriptor->Type = CmResourceTypePort;
                                RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
@@ -918,6 +1229,228 @@ Bus_PDO_QueryResourceRequirements(
                                RequirementDescriptor++;
                                break;
                        }
+                       case ACPI_RESOURCE_TYPE_ADDRESS16:
+                       {
+                               ACPI_RESOURCE_ADDRESS16 *addr16_data = (ACPI_RESOURCE_ADDRESS16*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               if (addr16_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeBusNumber;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareShared;
+                                       RequirementDescriptor->Flags = 0;
+                                       RequirementDescriptor->u.BusNumber.MinBusNumber = addr16_data->Minimum;
+                                       RequirementDescriptor->u.BusNumber.MaxBusNumber = addr16_data->Maximum;
+                                       RequirementDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+                               }
+                               else if (addr16_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypePort;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
+                                       if (addr16_data->Decode == ACPI_POS_DECODE)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
+                                       RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr16_data->Minimum;
+                                       RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr16_data->Maximum;
+                                       RequirementDescriptor->u.Port.Length = addr16_data->AddressLength;
+                               }
+                               else
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeMemory;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = 0;
+                                       if (addr16_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr16_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 = addr16_data->Minimum;
+                                       RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr16_data->Maximum;
+                                       RequirementDescriptor->u.Memory.Length = addr16_data->AddressLength;
+                               }
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS32:
+                       {
+                               ACPI_RESOURCE_ADDRESS32 *addr32_data = (ACPI_RESOURCE_ADDRESS32*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               if (addr32_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeBusNumber;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareShared;
+                                       RequirementDescriptor->Flags = 0;
+                                       RequirementDescriptor->u.BusNumber.MinBusNumber = addr32_data->Minimum;
+                                       RequirementDescriptor->u.BusNumber.MaxBusNumber = addr32_data->Maximum;
+                                       RequirementDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+                               }
+                               else if (addr32_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypePort;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
+                                       if (addr32_data->Decode == ACPI_POS_DECODE)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
+                                       RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr32_data->Minimum;
+                                       RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr32_data->Maximum;
+                                       RequirementDescriptor->u.Port.Length = addr32_data->AddressLength;
+                               }
+                               else
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeMemory;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = 0;
+                                       if (addr32_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr32_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 = addr32_data->Minimum;
+                                       RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr32_data->Maximum;
+                                       RequirementDescriptor->u.Memory.Length = addr32_data->AddressLength;
+                               }
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS64:
+                       {
+                               ACPI_RESOURCE_ADDRESS64 *addr64_data = (ACPI_RESOURCE_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_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;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               RequirementDescriptor->Type = CmResourceTypeMemory;
+                               RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               RequirementDescriptor->Flags = CM_RESOURCE_MEMORY_24;
+                               if (mem24_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = mem24_data->Minimum;
+                               RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = mem24_data->Maximum;
+                               RequirementDescriptor->u.Memory.Length = mem24_data->AddressLength;
+
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_MEMORY32:
+                       {
+                               ACPI_RESOURCE_MEMORY32 *mem32_data = (ACPI_RESOURCE_MEMORY32*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               RequirementDescriptor->Type = CmResourceTypeMemory;
+                               RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               RequirementDescriptor->Flags = 0;
+                               if (mem32_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = mem32_data->Minimum;
+                               RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = mem32_data->Maximum;
+                               RequirementDescriptor->u.Memory.Length = mem32_data->AddressLength;
+
+                               RequirementDescriptor++;
+                               break;
+                       }
                        default:
                        {
                                break;