Add config interface start (PciReadWriteConfigSpace, PciReadSlotConfig)
[reactos.git] / reactos / drivers / bus / pcix / arb / arb_comn.c
index 3759169..8d955ed 100644 (file)
 
 /* GLOBALS ********************************************************************/
 
+PCHAR PciArbiterNames[] =
+{
+    "I/O Port",
+    "Memory",
+    "Interrupt",
+    "Bus Number"
+};
+
 /* FUNCTIONS ******************************************************************/
 
+VOID
+NTAPI
+PciArbiterDestructor(IN PPCI_ARBITER_INSTANCE Arbiter)
+{
+    /* This function is not yet implemented */
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+NTSTATUS
+NTAPI
+PciInitializeArbiters(IN PPCI_FDO_EXTENSION FdoExtension)
+{
+    PPCI_INTERFACE CurrentInterface, *Interfaces;
+    PPCI_PDO_EXTENSION PdoExtension;
+    PPCI_ARBITER_INSTANCE ArbiterInterface;
+    NTSTATUS Status;
+    PCI_SIGNATURE ArbiterType;
+    ASSERT_FDO(FdoExtension);
+
+    /* Loop all the arbiters */
+    for (ArbiterType = PciArb_Io; ArbiterType <= PciArb_BusNumber; ArbiterType++)
+    {
+        /* Check if this is the extension for the Root PCI Bus */
+        if (!PCI_IS_ROOT_FDO(FdoExtension))
+        {
+            /* Get the PDO extension */
+            PdoExtension = FdoExtension->PhysicalDeviceObject->DeviceExtension;
+            ASSERT_PDO(PdoExtension);
+
+            /* Skip this bus if it does subtractive decode */
+            if (PdoExtension->Dependent.type1.SubtractiveDecode)
+            {
+                DPRINT1("PCI Not creating arbiters for subtractive bus %d\n",
+                        PdoExtension->Dependent.type1.SubtractiveDecode);
+                continue;
+            }
+        }
+
+        /* Query all the registered arbiter interfaces */
+        Interfaces = PciInterfaces;
+        while (*Interfaces)
+        {
+            /* Find the one that matches the arbiter currently being setup */
+            CurrentInterface = *Interfaces;
+            if (CurrentInterface->Signature == ArbiterType) break;
+            Interfaces++;
+        }
+
+        /* Check if the required arbiter was not found in the list */
+        if (!*Interfaces)
+        {
+            /* Skip this arbiter and try the next one */
+            DPRINT1("PCI - FDO ext 0x%08x no %s arbiter.\n",
+                    FdoExtension,
+                    PciArbiterNames[ArbiterType - PciArb_Io]);
+            continue;
+        }
+
+        /* An arbiter was found, allocate an instance for it */
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        ArbiterInterface = ExAllocatePoolWithTag(PagedPool,
+                                                 sizeof(PCI_ARBITER_INSTANCE),
+                                                 PCI_POOL_TAG);
+        if (!ArbiterInterface) break;
+
+        /* Setup the instance */
+        ArbiterInterface->BusFdoExtension = FdoExtension;
+        ArbiterInterface->Interface = CurrentInterface;
+        swprintf(ArbiterInterface->InstanceName,
+                 L"PCI %S (b=%02x)",
+                 PciArbiterNames[ArbiterType - PciArb_Io],
+                 FdoExtension->BaseBus);
+
+        /* Call the interface initializer for it */
+        Status = CurrentInterface->Initializer(ArbiterInterface);
+        if (!NT_SUCCESS(Status)) break;
+
+        /* Link it with this FDO */
+        PcipLinkSecondaryExtension(&FdoExtension->SecondaryExtension,
+                                   &FdoExtension->SecondaryExtLock,
+                                   &ArbiterInterface->Header,
+                                   ArbiterType,
+                                   PciArbiterDestructor);
+
+        /* This arbiter is now initialized, move to the next one */
+        DPRINT1("PCI - FDO ext 0x%08x %S arbiter initialized (context 0x%08x).\n",
+                FdoExtension,
+                L"ARBITER HEADER MISSING", //ArbiterInterface->CommonInstance.Name,
+                ArbiterInterface);
+        Status = STATUS_SUCCESS;
+    }
+
+    /* Return to caller */
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+PciInitializeArbiterRanges(IN PPCI_FDO_EXTENSION DeviceExtension,
+                           IN PCM_RESOURCE_LIST Resources)
+{
+    PPCI_PDO_EXTENSION PdoExtension;
+    CM_RESOURCE_TYPE DesiredType;
+    PVOID Instance;
+    PCI_SIGNATURE ArbiterType;
+
+    /* Arbiters should not already be initialized */
+    if (DeviceExtension->ArbitersInitialized)
+    {
+        /* Duplicated start request, fail initialization */
+        DPRINT1("PCI Warning hot start FDOx %08x, resource ranges not checked.\n", DeviceExtension);
+        return STATUS_INVALID_DEVICE_REQUEST;
+    }
+    
+    /* Check for non-root FDO */
+    if (!PCI_IS_ROOT_FDO(DeviceExtension))
+    {
+        /* Grab the PDO */
+        PdoExtension = (PPCI_PDO_EXTENSION)DeviceExtension->PhysicalDeviceObject->DeviceExtension;
+        ASSERT(PdoExtension->ExtensionType == PciPdoExtensionType);
+
+        /* Multiple FDOs are not yet supported */
+        UNIMPLEMENTED;
+        while (TRUE);
+        return STATUS_SUCCESS;
+    }
+    
+    /* Loop all arbiters */
+    for (ArbiterType = PciArb_Io; ArbiterType <= PciArb_Memory; ArbiterType++)
+    {
+        /* Pick correct resource type for each arbiter */
+        if (ArbiterType == PciArb_Io)
+        {
+            /* I/O Port */
+            DesiredType = CmResourceTypePort;
+        }
+        else if (ArbiterType == PciArb_Memory)
+        {
+            /* Device RAM */
+            DesiredType = CmResourceTypeMemory;
+        }
+        else
+        {
+            /* Ignore anything else */
+            continue;
+        }
+        /* Find an arbiter of this type */
+        Instance = PciFindNextSecondaryExtension(&DeviceExtension->SecondaryExtension,
+                                                 ArbiterType);
+        if (Instance)
+        {
+            /*
+             * Now we should initialize it, not yet implemented because Arb
+             * library isn't yet implemented, not even the headers.
+             */
+            UNIMPLEMENTED;
+            //while (TRUE);
+        }
+        else
+        {
+            /* The arbiter was not found, this is an error! */
+            DPRINT1("PCI - FDO ext 0x%08x %s arbiter (REQUIRED) is missing.\n",
+                    DeviceExtension,
+                    PciArbiterNames[ArbiterType - PciArb_Io]);
+        }
+    }
+
+    /* Arbiters are now initialized */
+    DeviceExtension->ArbitersInitialized = TRUE;
+    return STATUS_SUCCESS;
+}
+
 /* EOF */