[STORPORT] Implement StorPortGetDeviceBase().
[reactos.git] / drivers / storage / port / storport / misc.c
index 5f42be2..56b7c6f 100644 (file)
@@ -167,4 +167,158 @@ CopyResourceList(
 }
 
 
+NTSTATUS
+QueryBusInterface(
+    PDEVICE_OBJECT DeviceObject,
+    PGUID Guid,
+    USHORT Size,
+    USHORT Version,
+    PBUS_INTERFACE_STANDARD Interface,
+    PVOID InterfaceSpecificData)
+{
+    KEVENT Event;
+    NTSTATUS Status;
+    PIRP Irp;
+    IO_STATUS_BLOCK IoStatus;
+    PIO_STACK_LOCATION Stack;
+
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
+                                       DeviceObject,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       &Event,
+                                       &IoStatus);
+    if (Irp == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    Stack = IoGetNextIrpStackLocation(Irp);
+
+    Stack->MajorFunction = IRP_MJ_PNP;
+    Stack->MinorFunction = IRP_MN_QUERY_INTERFACE;
+    Stack->Parameters.QueryInterface.InterfaceType = Guid;
+    Stack->Parameters.QueryInterface.Size = Size;
+    Stack->Parameters.QueryInterface.Version = Version;
+    Stack->Parameters.QueryInterface.Interface = (PINTERFACE)Interface;
+    Stack->Parameters.QueryInterface.InterfaceSpecificData = InterfaceSpecificData;
+
+    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+
+    Status = IoCallDriver(DeviceObject, Irp);
+    if (Status == STATUS_PENDING)
+    {
+        KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+
+        Status=IoStatus.Status;
+    }
+
+    return Status;
+}
+
+
+BOOLEAN
+TranslateResourceListAddress(
+    PFDO_DEVICE_EXTENSION DeviceExtension,
+    INTERFACE_TYPE BusType,
+    ULONG SystemIoBusNumber,
+    STOR_PHYSICAL_ADDRESS IoAddress,
+    ULONG NumberOfBytes,
+    BOOLEAN InIoSpace,
+    PPHYSICAL_ADDRESS TranslatedAddress)
+{
+    PCM_FULL_RESOURCE_DESCRIPTOR FullDescriptorA, FullDescriptorT;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptorA, PartialDescriptorT;
+    INT i, j;
+
+    DPRINT1("TranslateResourceListAddress(%p)\n", DeviceExtension);
+
+    FullDescriptorA = DeviceExtension->AllocatedResources->List;
+    FullDescriptorT = DeviceExtension->TranslatedResources->List;
+    for (i = 0; i < DeviceExtension->AllocatedResources->Count; i++)
+    {
+        for (j = 0; j < FullDescriptorA->PartialResourceList.Count; j++)
+        {
+            PartialDescriptorA = FullDescriptorA->PartialResourceList.PartialDescriptors + j;
+            PartialDescriptorT = FullDescriptorT->PartialResourceList.PartialDescriptors + j;
+
+            switch (PartialDescriptorA->Type)
+            {
+                case CmResourceTypePort:
+                    DPRINT1("Port: 0x%I64x (0x%lx)\n",
+                            PartialDescriptorA->u.Port.Start.QuadPart,
+                            PartialDescriptorA->u.Port.Length);
+                    if (InIoSpace &&
+                        IoAddress.QuadPart >= PartialDescriptorA->u.Port.Start.QuadPart &&
+                        IoAddress.QuadPart + NumberOfBytes <= PartialDescriptorA->u.Port.Start.QuadPart + PartialDescriptorA->u.Port.Length)
+                    {
+                        TranslatedAddress->QuadPart = PartialDescriptorT->u.Port.Start.QuadPart + 
+                                                      (IoAddress.QuadPart - PartialDescriptorA->u.Port.Start.QuadPart);
+                        return TRUE;
+                    }
+                    break;
+
+                case CmResourceTypeMemory:
+                    DPRINT1("Memory: 0x%I64x (0x%lx)\n",
+                            PartialDescriptorA->u.Memory.Start.QuadPart,
+                            PartialDescriptorA->u.Memory.Length);
+                    if (!InIoSpace &&
+                        IoAddress.QuadPart >= PartialDescriptorA->u.Memory.Start.QuadPart &&
+                        IoAddress.QuadPart + NumberOfBytes <= PartialDescriptorA->u.Memory.Start.QuadPart + PartialDescriptorA->u.Memory.Length)
+                    {
+                        TranslatedAddress->QuadPart = PartialDescriptorT->u.Memory.Start.QuadPart + 
+                                                      (IoAddress.QuadPart - PartialDescriptorA->u.Memory.Start.QuadPart);
+                        return TRUE;
+                    }
+                    break;
+            }
+        }
+
+        /* Advance to next CM_FULL_RESOURCE_DESCRIPTOR block in memory. */
+        FullDescriptorA = (PCM_FULL_RESOURCE_DESCRIPTOR)(FullDescriptorA->PartialResourceList.PartialDescriptors + 
+                                                         FullDescriptorA->PartialResourceList.Count);
+
+        FullDescriptorT = (PCM_FULL_RESOURCE_DESCRIPTOR)(FullDescriptorT->PartialResourceList.PartialDescriptors + 
+                                                         FullDescriptorT->PartialResourceList.Count);
+    }
+
+    return FALSE;
+}
+
+
+NTSTATUS
+AllocateAddressMapping(
+    PMAPPED_ADDRESS *MappedAddressList,
+    STOR_PHYSICAL_ADDRESS IoAddress,
+    PVOID MappedAddress,
+    ULONG NumberOfBytes,
+    ULONG BusNumber)
+{
+    PMAPPED_ADDRESS Mapping;
+
+    DPRINT1("AllocateAddressMapping()\n");
+
+    Mapping = ExAllocatePoolWithTag(NonPagedPool,
+                                    sizeof(MAPPED_ADDRESS),
+                                    TAG_ADDRESS_MAPPING);
+    if (Mapping == NULL)
+    {
+        DPRINT1("No memory!\n");
+        return STATUS_NO_MEMORY;
+    }
+
+    RtlZeroMemory(Mapping, sizeof(MAPPED_ADDRESS));
+
+    Mapping->NextMappedAddress = *MappedAddressList;
+    *MappedAddressList = Mapping;
+
+    Mapping->IoAddress = IoAddress;
+    Mapping->MappedAddress = MappedAddress;
+    Mapping->NumberOfBytes = NumberOfBytes;
+    Mapping->BusNumber = BusNumber;
+
+    return STATUS_SUCCESS;
+}
+
 /* EOF */