BOOLEAN NTAPI HaliTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress) { PBUS_HANDLER Handler; BOOLEAN Status; /* Find the handler */ Handler = HalReferenceHandlerForBus(InterfaceType, BusNumber); if (!(Handler) || !(Handler->TranslateBusAddress)) { DPRINT1("No translator Interface: %x, Bus: %x, Handler: %p, BusAddress: %x!\n", InterfaceType, BusNumber, Handler, BusAddress); return FALSE; } /* Do the assignment */ Status = Handler->TranslateBusAddress(Handler, Handler, BusAddress, AddressSpace, TranslatedAddress); /* Dereference the handler and return */ HalDereferenceBusHandler(Handler); return Status; }
NTSTATUS NTAPI HalpAssignSlotResources(IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources) { PBUS_HANDLER Handler; NTSTATUS Status; PAGED_CODE(); DPRINT1("Slot assignment for %d on bus %u\n", BusType, BusNumber); /* Find the handler */ Handler = HalReferenceHandlerForBus(BusType, BusNumber); if (!Handler) return STATUS_NOT_FOUND; /* Do the assignment */ Status = Handler->AssignSlotResources(Handler, Handler, RegistryPath, DriverClassName, DriverObject, DeviceObject, SlotNumber, AllocatedResources); /* Dereference the handler and return */ HalDereferenceBusHandler(Handler); return Status; }
NTSTATUS NTAPI PciGetConfigHandlers(IN PPCI_FDO_EXTENSION FdoExtension) { PBUS_HANDLER BusHandler; NTSTATUS Status; ASSERT(FdoExtension->BusHandler == NULL); /* Check if this is the FDO for the root bus */ if (PCI_IS_ROOT_FDO(FdoExtension)) { /* Query the PCI Bus Interface that ACPI exposes */ ASSERT(FdoExtension->PciBusInterface == NULL); Status = PciQueryForPciBusInterface(FdoExtension); if (!NT_SUCCESS(Status)) { /* No ACPI, so Bus Numbers should be maintained by BIOS */ ASSERT(!PciAssignBusNumbers); } else { /* ACPI detected, PCI Bus Driver will reconfigure bus numbers*/ PciAssignBusNumbers = TRUE; } } else { /* Check if the root bus already has the interface set up */ if (FdoExtension->BusRootFdoExtension->PciBusInterface) { /* Nothing for this FDO to do */ return STATUS_SUCCESS; } /* Fail into case below so we can query the HAL interface */ Status = STATUS_NOT_SUPPORTED; } /* If the ACPI PCI Bus Interface couldn't be obtained, try the HAL */ if (!NT_SUCCESS(Status)) { /* Bus number assignment should be static */ ASSERT(Status == STATUS_NOT_SUPPORTED); ASSERT(!PciAssignBusNumbers); /* Call the HAL to obtain the bus handler for PCI */ BusHandler = HalReferenceHandlerForBus(PCIBus, FdoExtension->BaseBus); FdoExtension->BusHandler = BusHandler; /* Fail if the HAL does not have a PCI Bus Handler for this bus */ if (!BusHandler) return STATUS_INVALID_DEVICE_REQUEST; } /* Appropriate interface was obtained */ return STATUS_SUCCESS; }
/* * @implemented */ ULONG NTAPI HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN ULONG BusInterruptLevel, IN ULONG BusInterruptVector, OUT PKIRQL Irql, OUT PKAFFINITY Affinity) { PBUS_HANDLER Handler; ULONG Vector; PAGED_CODE(); /* Defaults */ *Irql = 0; *Affinity = 0; /* Find the handler */ Handler = HalReferenceHandlerForBus(InterfaceType, BusNumber); if (!Handler) return 0; /* Do the assignment */ Vector = Handler->GetInterruptVector(Handler, Handler, BusInterruptLevel, BusInterruptVector, Irql, Affinity); if ((Vector != IRQ2VECTOR(BusInterruptLevel)) || (*Irql != VECTOR2IRQL(IRQ2VECTOR(BusInterruptLevel)))) { DPRINT1("Returning IRQL %lx, Vector %lx for Level/Vector: %lx/%lx\n", *Irql, Vector, BusInterruptLevel, BusInterruptVector); DPRINT1("Old HAL would've returned IRQL %lx and Vector %lx\n", VECTOR2IRQL(IRQ2VECTOR(BusInterruptLevel)), IRQ2VECTOR(BusInterruptLevel)); } /* Dereference the handler and return */ HalDereferenceBusHandler(Handler); return Vector; }
/* * @implemented */ NTSTATUS NTAPI HalAdjustResourceList(IN PIO_RESOURCE_REQUIREMENTS_LIST *ResourceList) { PBUS_HANDLER Handler; ULONG Status; PAGED_CODE(); /* Find the handler */ Handler = HalReferenceHandlerForBus((*ResourceList)->InterfaceType, (*ResourceList)->BusNumber); if (!Handler) return STATUS_SUCCESS; /* Do the assignment */ Status = Handler->AdjustResourceList(Handler, Handler, ResourceList); /* Dereference the handler and return */ HalDereferenceBusHandler(Handler); return Status; }