#include <acpi_bus.h>
#include <acpi_drivers.h>
-//#define NDEBUG
+#define NDEBUG
#include <debug.h>
#ifdef ALLOC_PRAGMA
break;
+ case IRP_MN_QUERY_INTERFACE:
+
+ status = Bus_PDO_QueryInterface(DeviceData, Irp);
+
+ break;
+
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
deviceCapabilities->UniqueID = device->flags.unique_id;
deviceCapabilities->NoDisplayInUI = !device->status.show_in_ui;
deviceCapabilities->Address = device->pnp.bus_address;
+ deviceCapabilities->RawDeviceOK = FALSE;
}
else
{
deviceCapabilities->UniqueID = FALSE;
deviceCapabilities->NoDisplayInUI = FALSE;
deviceCapabilities->Address = 0;
+
+ /* The ACPI driver will run fixed buttons */
+ 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)
PPDO_DEVICE_DATA DeviceData,
PIRP Irp )
{
- BOOLEAN Done;
ULONG NumberOfResources = 0;
PCM_RESOURCE_LIST ResourceList;
PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor;
ULONG ResourceListSize;
ULONG i;
-
/* Get current resources */
Buffer.Length = 0;
AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
resource= Buffer.Pointer;
/* Count number of resources */
- Done = FALSE;
- while (!Done)
+ 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;
+ NumberOfResources += irq_data->InterruptCount;
+ break;
+ }
case ACPI_RESOURCE_TYPE_IRQ:
{
ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
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++;
break;
}
- case ACPI_RESOURCE_TYPE_END_TAG:
- {
- Done = TRUE;
- break;
- }
default:
{
+ DPRINT1("Unknown resource type: %d\n", resource->Type);
break;
}
}
ResourceList = (PCM_RESOURCE_LIST)ExAllocatePool(PagedPool, ResourceListSize);
if (!ResourceList)
- return FALSE;
+ {
+ ExFreePool(Buffer.Pointer);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
ResourceList->Count = 1;
ResourceList->List[0].InterfaceType = Internal; /* FIXME */
ResourceList->List[0].BusNumber = 0; /* We're the only ACPI bus device in the system */
ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
/* Fill resources list structure */
- Done = FALSE;
- while (!Done)
+ 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->Type = CmResourceTypeDma;
ResourceDescriptor->Flags = 0;
- switch (dma_data->Type)
- {
- case ACPI_TYPE_A: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
- case ACPI_TYPE_B: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
- case ACPI_TYPE_F: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
- }
- if (dma_data->BusMaster == ACPI_BUS_MASTER)
- ResourceDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
- switch (dma_data->Transfer)
- {
- case ACPI_TRANSFER_8: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
- case ACPI_TRANSFER_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
- case ACPI_TRANSFER_8_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
- }
- ResourceDescriptor->u.Dma.Channel = dma_data->Channels[i];
+ switch (dma_data->Type)
+ {
+ case ACPI_TYPE_A: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
+ case ACPI_TYPE_B: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
+ case ACPI_TYPE_F: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
+ }
+ if (dma_data->BusMaster == ACPI_BUS_MASTER)
+ ResourceDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
+ switch (dma_data->Transfer)
+ {
+ case ACPI_TRANSFER_8: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
+ case ACPI_TRANSFER_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
+ case ACPI_TRANSFER_8_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
+ }
+ ResourceDescriptor->u.Dma.Channel = dma_data->Channels[i];
- ResourceDescriptor++;
- }
- break;
+ ResourceDescriptor++;
+ }
+ break;
}
case ACPI_RESOURCE_TYPE_IO:
{
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_END_TAG:
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
{
- Done = TRUE;
+ 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:
{
- DPRINT1("Unhandled resource type\n");
break;
}
}
PPDO_DEVICE_DATA DeviceData,
PIRP Irp )
{
- BOOLEAN Done;
ULONG NumberOfResources = 0;
ACPI_STATUS AcpiStatus;
ACPI_BUFFER Buffer;
ULONG i, RequirementsListSize;
PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
PIO_RESOURCE_DESCRIPTOR RequirementDescriptor;
+ BOOLEAN CurrentRes = FALSE;
PAGED_CODE ();
/* Get current resources */
- Buffer.Length = 0;
- AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
- if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) ||
- Buffer.Length == 0)
+ while (TRUE)
{
- return Irp->IoStatus.Status;
+ Buffer.Length = 0;
+ if (CurrentRes)
+ AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+ else
+ AcpiStatus = AcpiGetPossibleResources(DeviceData->AcpiHandle, &Buffer);
+ if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) ||
+ Buffer.Length == 0)
+ {
+ if (!CurrentRes)
+ CurrentRes = TRUE;
+ else
+ return Irp->IoStatus.Status;
+ }
+ else
+ break;
}
Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
if (!Buffer.Pointer)
return STATUS_INSUFFICIENT_RESOURCES;
- AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+ if (CurrentRes)
+ AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+ else
+ AcpiStatus = AcpiGetPossibleResources(DeviceData->AcpiHandle, &Buffer);
if (!ACPI_SUCCESS(AcpiStatus))
{
DPRINT1("AcpiGetCurrentResources #2 failed (0x%x)\n", AcpiStatus);
resource= Buffer.Pointer;
/* Count number of resources */
- Done = FALSE;
- while (!Done)
+ 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;
+ NumberOfResources += irq_data->InterruptCount;
+ break;
+ }
case ACPI_RESOURCE_TYPE_IRQ:
{
ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
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++;
break;
}
- case ACPI_RESOURCE_TYPE_END_TAG:
- {
- Done = TRUE;
- break;
- }
default:
{
break;
if (!RequirementsList)
{
ExFreePool(Buffer.Pointer);
- return STATUS_SUCCESS;
+ return STATUS_INSUFFICIENT_RESOURCES;
}
RequirementsList->ListSize = RequirementsListSize;
RequirementsList->InterfaceType = Internal;
RequirementDescriptor = RequirementsList->List[0].Descriptors;
/* Fill resources list structure */
- Done = FALSE;
- while (!Done)
+ 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;
for (i = 0; i < irq_data->InterruptCount; i++)
{
- RequirementDescriptor->Option = 0; /* Required */
+ 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 = irq_data->Interrupts[i];
+ RequirementDescriptor->u.Interrupt.MinimumVector =
+ RequirementDescriptor->u.Interrupt.MaximumVector = irq_data->Interrupts[i];
RequirementDescriptor++;
}
{
RequirementDescriptor->Type = CmResourceTypeDma;
RequirementDescriptor->Flags = 0;
- switch (dma_data->Type)
- {
- case ACPI_TYPE_A: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
- case ACPI_TYPE_B: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
- case ACPI_TYPE_F: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
- }
- if (dma_data->BusMaster == ACPI_BUS_MASTER)
- RequirementDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
- switch (dma_data->Transfer)
- {
- case ACPI_TRANSFER_8: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
- case ACPI_TRANSFER_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
- case ACPI_TRANSFER_8_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
+ switch (dma_data->Type)
+ {
+ case ACPI_TYPE_A: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
+ case ACPI_TYPE_B: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
+ case ACPI_TYPE_F: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
+ }
+ if (dma_data->BusMaster == ACPI_BUS_MASTER)
+ RequirementDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
+ switch (dma_data->Transfer)
+ {
+ case ACPI_TRANSFER_8: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
+ case ACPI_TRANSFER_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
+ case ACPI_TRANSFER_8_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
+ }
+
+ RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+ RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
+ RequirementDescriptor->u.Dma.MinimumChannel =
+ RequirementDescriptor->u.Dma.MaximumChannel = dma_data->Channels[i];
+ RequirementDescriptor++;
}
-
- RequirementDescriptor->Option = 0; /* Required */
- RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
- RequirementDescriptor->u.Dma.MinimumChannel = dma_data->Channels[i];
- RequirementDescriptor++;
- }
- break;
+ break;
}
case ACPI_RESOURCE_TYPE_IO:
{
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 = 0; /* Required */
+ RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
RequirementDescriptor->Type = CmResourceTypePort;
RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
- RequirementDescriptor->u.Port.Alignment = 1; /* Start address is specified, so it doesn't matter */
+ RequirementDescriptor->u.Port.Alignment = io_data->Alignment;
RequirementDescriptor->u.Port.MinimumAddress.QuadPart = io_data->Minimum;
RequirementDescriptor->u.Port.MaximumAddress.QuadPart = io_data->Maximum;
RequirementDescriptor++;
break;
}
- case ACPI_RESOURCE_TYPE_END_TAG:
+ 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:
{
- Done = TRUE;
+ 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:
{
- DPRINT1("Unhandled resource type\n");
break;
}
}