/* 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 */