+++ /dev/null
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: BSD - See COPYING.ARM in the top level directory
- * FILE: hal/halx86/generic/legacy/bussupp.c
- * PURPOSE: HAL Legacy Bus Support Code
- * PROGRAMMERS: ReactOS Portable Systems Group
- */
-
-/* INCLUDES *******************************************************************/
-
-#include <hal.h>
-#define NDEBUG
-#include <debug.h>
-
-/* GLOBALS ********************************************************************/
-
-extern KSPIN_LOCK HalpPCIConfigLock;
-ULONG HalpPciIrqMask;
-
-/* PRIVATE FUNCTIONS **********************************************************/
-
-PBUS_HANDLER
-NTAPI
-HalpAllocateBusHandler(IN INTERFACE_TYPE InterfaceType,
- IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN INTERFACE_TYPE ParentBusInterfaceType,
- IN ULONG ParentBusNumber,
- IN ULONG BusSpecificData)
-{
- PBUS_HANDLER Bus;
-
- /* Register the bus handler */
- HalRegisterBusHandler(InterfaceType,
- BusDataType,
- BusNumber,
- ParentBusInterfaceType,
- ParentBusNumber,
- BusSpecificData,
- NULL,
- &Bus);
- if (!Bus) return NULL;
-
- /* Check for a valid interface */
- if (InterfaceType != InterfaceTypeUndefined)
- {
- /* Allocate address ranges and zero them out */
- Bus->BusAddresses = ExAllocatePoolWithTag(NonPagedPool,
- sizeof(SUPPORTED_RANGES),
- ' laH');
- RtlZeroMemory(Bus->BusAddresses, sizeof(SUPPORTED_RANGES));
-
- /* Build the data structure */
- Bus->BusAddresses->Version = HAL_SUPPORTED_RANGE_VERSION;
- Bus->BusAddresses->Dma.Limit = 7;
- Bus->BusAddresses->Memory.Limit = 0xFFFFFFFF;
- Bus->BusAddresses->IO.Limit = 0xFFFF;
- Bus->BusAddresses->IO.SystemAddressSpace = 1;
- Bus->BusAddresses->PrefetchMemory.Base = 1;
- }
-
- /* Return the bus address */
- return Bus;
-}
-
-VOID
-NTAPI
-INIT_FUNCTION
-HalpRegisterInternalBusHandlers(VOID)
-{
- PBUS_HANDLER Bus;
-
- /* Only do processor 1 */
- if (KeGetCurrentPrcb()->Number) return;
-
- /* Register root support */
- HalpInitBusHandler();
-
- /* Allocate the system bus */
- Bus = HalpAllocateBusHandler(Internal,
- ConfigurationSpaceUndefined,
- 0,
- InterfaceTypeUndefined,
- 0,
- 0);
- if (Bus)
- {
- /* Set it up */
- Bus->GetInterruptVector = HalpGetSystemInterruptVector;
- Bus->TranslateBusAddress = HalpTranslateSystemBusAddress;
- }
-
- /* Allocate the CMOS bus */
- Bus = HalpAllocateBusHandler(InterfaceTypeUndefined,
- Cmos,
- 0,
- InterfaceTypeUndefined,
- 0,
- 0);
- if (Bus)
- {
- /* Set it up */
- Bus->GetBusData = HalpcGetCmosData;
- Bus->SetBusData = HalpcSetCmosData;
- }
-
- /* Allocate the CMOS bus */
- Bus = HalpAllocateBusHandler(InterfaceTypeUndefined,
- Cmos,
- 1,
- InterfaceTypeUndefined,
- 0,
- 0);
- if (Bus)
- {
- /* Set it up */
- Bus->GetBusData = HalpcGetCmosData;
- Bus->SetBusData = HalpcSetCmosData;
- }
-
- /* Allocate ISA bus */
- Bus = HalpAllocateBusHandler(Isa,
- ConfigurationSpaceUndefined,
- 0,
- Internal,
- 0,
- 0);
- if (Bus)
- {
- /* Set it up */
- Bus->GetBusData = HalpNoBusData;
- Bus->BusAddresses->Memory.Limit = 0xFFFFFF;
- Bus->TranslateBusAddress = HalpTranslateIsaBusAddress;
- }
-
- /* No support for EISA or MCA */
- ASSERT(HalpBusType == MACHINE_TYPE_ISA);
-}
-
-#ifndef _MINIHAL_
-NTSTATUS
-NTAPI
-INIT_FUNCTION
-HalpMarkChipsetDecode(BOOLEAN OverrideEnable)
-{
- NTSTATUS Status;
- UNICODE_STRING KeyString;
- ULONG Data = OverrideEnable;
- HANDLE KeyHandle, Handle;
-
- /* Open CCS key */
- RtlInitUnicodeString(&KeyString,
- L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET");
- Status = HalpOpenRegistryKey(&Handle, 0, &KeyString, KEY_ALL_ACCESS, FALSE);
- if (NT_SUCCESS(Status))
- {
- /* Open PNP Bios key */
- RtlInitUnicodeString(&KeyString, L"Control\\Biosinfo\\PNPBios");
- Status = HalpOpenRegistryKey(&KeyHandle,
- Handle,
- &KeyString,
- KEY_ALL_ACCESS,
- TRUE);
-
- /* Close root key */
- ZwClose(Handle);
-
- /* Check if PNP BIOS key exists */
- if (NT_SUCCESS(Status))
- {
- /* Set the override value */
- RtlInitUnicodeString(&KeyString, L"FullDecodeChipsetOverride");
- Status = ZwSetValueKey(KeyHandle,
- &KeyString,
- 0,
- REG_DWORD,
- &Data,
- sizeof(Data));
-
- /* Close subkey */
- ZwClose(KeyHandle);
- }
- }
-
- /* Return status */
- return Status;
-}
-
-PBUS_HANDLER
-NTAPI
-INIT_FUNCTION
-HalpAllocateAndInitPciBusHandler(IN ULONG PciType,
- IN ULONG BusNo,
- IN BOOLEAN TestAllocation)
-{
- PBUS_HANDLER Bus;
- PPCIPBUSDATA BusData;
-
- /* Allocate the bus handler */
- Bus = HalpAllocateBusHandler(PCIBus,
- PCIConfiguration,
- BusNo,
- Internal,
- 0,
- sizeof(PCIPBUSDATA));
-
- /* Set it up */
- Bus->GetBusData = (PGETSETBUSDATA)HalpGetPCIData;
- Bus->SetBusData = (PGETSETBUSDATA)HalpSetPCIData;
- Bus->GetInterruptVector = (PGETINTERRUPTVECTOR)HalpGetPCIIntOnISABus;
- Bus->AdjustResourceList = (PADJUSTRESOURCELIST)HalpAdjustPCIResourceList;
- Bus->AssignSlotResources = (PASSIGNSLOTRESOURCES)HalpAssignPCISlotResources;
- Bus->BusAddresses->Dma.Limit = 0;
-
- /* Get our custom bus data */
- BusData = (PPCIPBUSDATA)Bus->BusData;
-
- /* Setup custom bus data */
- BusData->CommonData.Tag = PCI_DATA_TAG;
- BusData->CommonData.Version = PCI_DATA_VERSION;
- BusData->CommonData.ReadConfig = (PciReadWriteConfig)HalpReadPCIConfig;
- BusData->CommonData.WriteConfig = (PciReadWriteConfig)HalpWritePCIConfig;
- BusData->CommonData.Pin2Line = (PciPin2Line)HalpPCIPin2ISALine;
- BusData->CommonData.Line2Pin = (PciLine2Pin)HalpPCIISALine2Pin;
- BusData->MaxDevice = PCI_MAX_DEVICES;
- BusData->GetIrqRange = (PciIrqRange)HalpGetISAFixedPCIIrq;
-
- /* Initialize the bitmap */
- RtlInitializeBitMap(&BusData->DeviceConfigured, BusData->ConfiguredBits, 256);
-
- /* Check the type of PCI bus */
- switch (PciType)
- {
- /* Type 1 PCI Bus */
- case 1:
-
- /* Copy the Type 1 handler data */
- RtlCopyMemory(&PCIConfigHandler,
- &PCIConfigHandlerType1,
- sizeof(PCIConfigHandler));
-
- /* Set correct I/O Ports */
- BusData->Config.Type1.Address = PCI_TYPE1_ADDRESS_PORT;
- BusData->Config.Type1.Data = PCI_TYPE1_DATA_PORT;
- break;
-
- /* Type 2 PCI Bus */
- case 2:
-
- /* Copy the Type 1 handler data */
- RtlCopyMemory(&PCIConfigHandler,
- &PCIConfigHandlerType2,
- sizeof (PCIConfigHandler));
-
- /* Set correct I/O Ports */
- BusData->Config.Type2.CSE = PCI_TYPE2_CSE_PORT;
- BusData->Config.Type2.Forward = PCI_TYPE2_FORWARD_PORT;
- BusData->Config.Type2.Base = PCI_TYPE2_ADDRESS_BASE;
-
- /* Only 16 devices supported, not 32 */
- BusData->MaxDevice = 16;
- break;
-
- default:
-
- /* Invalid type */
- DbgPrint("HAL: Unnkown PCI type\n");
- }
-
- /* Return the bus handler */
- return Bus;
-}
-
-BOOLEAN
-NTAPI
-INIT_FUNCTION
-HalpIsValidPCIDevice(IN PBUS_HANDLER BusHandler,
- IN PCI_SLOT_NUMBER Slot)
-{
- UCHAR DataBuffer[PCI_COMMON_HDR_LENGTH];
- PPCI_COMMON_CONFIG PciHeader = (PVOID)DataBuffer;
- ULONG i;
- ULONG_PTR Address;
-
- /* Read the PCI header */
- HalpReadPCIConfig(BusHandler, Slot, PciHeader, 0, PCI_COMMON_HDR_LENGTH);
-
- /* Make sure it's a valid device */
- if ((PciHeader->VendorID == PCI_INVALID_VENDORID) ||
- (PCI_CONFIGURATION_TYPE(PciHeader) != PCI_DEVICE_TYPE))
- {
- /* Bail out */
- return FALSE;
- }
-
- /* Make sure interrupt numbers make sense */
- if (((PciHeader->u.type0.InterruptPin) &&
- (PciHeader->u.type0.InterruptPin > 4)) ||
- (PciHeader->u.type0.InterruptLine & 0x70))
- {
- /* Bail out */
- return FALSE;
- }
-
- /* Now scan PCI BARs */
- for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
- {
- /* Check what kind of address it is */
- Address = PciHeader->u.type0.BaseAddresses[i];
- if (Address & PCI_ADDRESS_IO_SPACE)
- {
- /* Highest I/O port is 65535 */
- if (Address > 0xFFFF) return FALSE;
- }
- else
- {
- /* MMIO should be higher than 0x80000 */
- if ((Address > 0xF) && (Address < 0x80000)) return FALSE;
- }
-
- /* Is this a 64-bit address? */
- if (!(Address & PCI_ADDRESS_IO_SPACE) &&
- ((Address & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT))
- {
- /* Check the next-next entry, since this one 64-bits wide */
- i++;
- }
- }
-
- /* Header, interrupt and address data all make sense */
- return TRUE;
-}
-
-static BOOLEAN WarningsGiven[5];
-
-NTSTATUS
-NTAPI
-INIT_FUNCTION
-HalpGetChipHacks(IN USHORT VendorId,
- IN USHORT DeviceId,
- IN UCHAR RevisionId,
- IN PULONG HackFlags)
-{
- UNICODE_STRING KeyName, ValueName;
- NTSTATUS Status;
- OBJECT_ATTRIBUTES ObjectAttributes;
- HANDLE KeyHandle;
- WCHAR Buffer[32];
- KEY_VALUE_PARTIAL_INFORMATION PartialInfo;
- ULONG ResultLength;
-
- /* Setup the object attributes for the key */
- RtlInitUnicodeString(&KeyName,
- L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET\\"
- L"Control\\HAL");
- InitializeObjectAttributes(&ObjectAttributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
-
- /* Open the key */
- Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
- if (!NT_SUCCESS(Status)) return Status;
-
- /* Query value */
- swprintf(Buffer, L"%04X%04X", VendorId, DeviceId);
- RtlInitUnicodeString(&ValueName, Buffer);
- Status = ZwQueryValueKey(KeyHandle,
- &ValueName,
- KeyValuePartialInformation,
- &PartialInfo,
- sizeof(PartialInfo),
- &ResultLength);
- if (NT_SUCCESS(Status))
- {
- /* Return the flags */
- DbgPrint("\tFound HackFlags for your chipset\n");
- *HackFlags = *(PULONG)PartialInfo.Data;
- DbgPrint("\t\tHack Flags: %lx (Hack Revision: %lx-Your Revision: %lx)\n",
- *HackFlags, HALP_REVISION_FROM_HACK_FLAGS(*HackFlags), RevisionId);
-
- /* Does it apply to this revision? */
- if ((RevisionId) && (RevisionId >= (HALP_REVISION_FROM_HACK_FLAGS(*HackFlags))))
- {
- /* Read the revision flags */
- *HackFlags = HALP_REVISION_HACK_FLAGS(*HackFlags);
- }
-
- /* Throw out revision data */
- *HackFlags = HALP_HACK_FLAGS(*HackFlags);
- if (!*HackFlags) DbgPrint("\tNo HackFlags for your chipset's revision!\n");
- }
-
- /* Close the handle and return */
- ZwClose(KeyHandle);
- return Status;
-}
-
-BOOLEAN
-NTAPI
-INIT_FUNCTION
-HalpIsRecognizedCard(IN PPCI_REGISTRY_INFO_INTERNAL PciRegistryInfo,
- IN PPCI_COMMON_CONFIG PciData,
- IN ULONG Flags)
-{
- ULONG ElementCount, i;
- PPCI_CARD_DESCRIPTOR CardDescriptor;
-
- /* How many PCI Cards that we know about? */
- ElementCount = PciRegistryInfo->ElementCount;
- if (!ElementCount) return FALSE;
-
- /* Loop all descriptors */
- CardDescriptor = &PciRegistryInfo->CardList[0];
- for (i = 0; i < ElementCount; i++, CardDescriptor++)
- {
- /* Check for flag match */
- if (CardDescriptor->Flags != Flags) continue;
-
- /* Check for VID-PID match */
- if ((CardDescriptor->VendorID != PciData->VendorID) ||
- (CardDescriptor->DeviceID != PciData->DeviceID))
- {
- /* Skip */
- continue;
- }
-
- /* Check for revision match, if requested */
- if ((CardDescriptor->Flags & HALP_CHECK_CARD_REVISION_ID) &&
- (CardDescriptor->RevisionID != PciData->RevisionID))
- {
- /* Skip */
- continue;
- }
-
- /* Check what kind of device this is */
- switch (PCI_CONFIGURATION_TYPE(PciData))
- {
- /* CardBUS Bridge */
- case PCI_CARDBUS_BRIDGE_TYPE:
-
- /* This means the real device header is in the device-specific data */
- PciData = (PPCI_COMMON_CONFIG)PciData->DeviceSpecific;
-
- /* Normal PCI device */
- case PCI_DEVICE_TYPE:
-
- /* Check for subvendor match, if requested */
- if ((CardDescriptor->Flags & HALP_CHECK_CARD_SUBVENDOR_ID) &&
- (CardDescriptor->SubsystemVendorID != PciData->u.type0.SubVendorID))
- {
- /* Skip */
- continue;
- }
-
- /* Check for subsystem match, if requested */
- if ((CardDescriptor->Flags & HALP_CHECK_CARD_SUBSYSTEM_ID) &&
- (CardDescriptor->SubsystemID != PciData->u.type0.SubSystemID))
- {
- /* Skip */
- continue;
- }
-
- /* You made it! */
- return TRUE;
-
- /* PCI Bridge -- don't bother */
- case PCI_BRIDGE_TYPE:
- default:
-
- /* Recognize it */
- return TRUE;
- }
- }
-
- /* This means the card isn't recognized */
- return FALSE;
-}
-
-BOOLEAN
-NTAPI
-INIT_FUNCTION
-HalpIsIdeDevice(IN PPCI_COMMON_CONFIG PciData)
-{
- /* Simple test first */
- if ((PciData->BaseClass == PCI_CLASS_MASS_STORAGE_CTLR) &&
- (PciData->SubClass == PCI_SUBCLASS_MSC_IDE_CTLR))
- {
- /* The device is nice enough to admit it */
- return TRUE;
- }
-
- /* Symphony 82C101 */
- if (PciData->VendorID == 0x1C1C) return TRUE;
-
- /* ALi MS4803 or M5219 */
- if ((PciData->VendorID == 0x10B9) &&
- ((PciData->DeviceID == 0x5215) || (PciData->DeviceID == 0x5219)))
- {
- return TRUE;
- }
-
- /* Appian Technology */
- if ((PciData->VendorID == 0x1097) && (PciData->DeviceID == 0x38)) return TRUE;
-
- /* Compaq Triflex Dual EIDE Controller */
- if ((PciData->VendorID == 0xE11) && (PciData->DeviceID == 0xAE33)) return TRUE;
-
- /* Micron PC Tech RZ1000 */
- if ((PciData->VendorID == 0x1042) && (PciData->DeviceID == 0x1000)) return TRUE;
-
- /* SiS 85C601 or 5513 [IDE] */
- if ((PciData->VendorID == 0x1039) &&
- ((PciData->DeviceID == 0x601) || (PciData->DeviceID == 0x5513)))
- {
- return TRUE;
- }
-
- /* Symphony Labs W83769F */
- if ((PciData->VendorID == 0x10AD) &&
- ((PciData->DeviceID == 0x1) || (PciData->DeviceID == 0x150)))
- {
- return TRUE;
- }
-
- /* UMC UM8673F */
- if ((PciData->VendorID == 0x1060) && (PciData->DeviceID == 0x101)) return TRUE;
-
- /* You've survived */
- return FALSE;
-}
-
-BOOLEAN
-NTAPI
-INIT_FUNCTION
-HalpIsBridgeDevice(IN PPCI_COMMON_CONFIG PciData)
-{
- /* Either this is a PCI-to-PCI Bridge, or a CardBUS Bridge */
- return (((PCI_CONFIGURATION_TYPE(PciData) == PCI_BRIDGE_TYPE) &&
- (PciData->BaseClass == PCI_CLASS_BRIDGE_DEV) &&
- (PciData->SubClass == PCI_SUBCLASS_BR_PCI_TO_PCI)) ||
- ((PCI_CONFIGURATION_TYPE(PciData) == PCI_CARDBUS_BRIDGE_TYPE) &&
- (PciData->BaseClass == PCI_CLASS_BRIDGE_DEV) &&
- (PciData->SubClass == PCI_SUBCLASS_BR_CARDBUS)));
-}
-
-BOOLEAN
-NTAPI
-INIT_FUNCTION
-HalpGetPciBridgeConfig(IN ULONG PciType,
- IN PUCHAR BusCount)
-{
- PCI_SLOT_NUMBER PciSlot;
- ULONG i, j, k;
- UCHAR DataBuffer[PCI_COMMON_HDR_LENGTH];
- PPCI_COMMON_CONFIG PciData = (PPCI_COMMON_CONFIG)DataBuffer;
- PBUS_HANDLER BusHandler;
-
- /* Loop PCI buses */
- PciSlot.u.bits.Reserved = 0;
- for (i = 0; i < *BusCount; i++)
- {
- /* Get the bus handler */
- BusHandler = HalHandlerForBus(PCIBus, i);
-
- /* Loop every device */
- for (j = 0; j < PCI_MAX_DEVICES; j++)
- {
- /* Loop every function */
- PciSlot.u.bits.DeviceNumber = j;
- for (k = 0; k < PCI_MAX_FUNCTION; k++)
- {
- /* Build the final slot structure */
- PciSlot.u.bits.FunctionNumber = k;
-
- /* Read the configuration information */
- HalpReadPCIConfig(BusHandler,
- PciSlot,
- PciData,
- 0,
- PCI_COMMON_HDR_LENGTH);
-
- /* Skip if this is an invalid function */
- if (PciData->VendorID == PCI_INVALID_VENDORID) continue;
-
- /* Make sure that this is a PCI bridge or a cardbus bridge */
- if (!HalpIsBridgeDevice(PciData)) continue;
-
- /* Not supported */
- if (!WarningsGiven[2]++) DPRINT1("Your machine has a PCI-to-PCI or CardBUS Bridge. PCI devices may fail!\n");
- continue;
- }
- }
- }
-
- /* If we exited the loop, then there's no bridge to worry about */
- return FALSE;
-}
-
-VOID
-NTAPI
-INIT_FUNCTION
-HalpFixupPciSupportedRanges(IN ULONG BusCount)
-{
- ULONG i;
- PBUS_HANDLER Bus, ParentBus;
-
- /* Loop all buses */
- for (i = 0; i < BusCount; i++)
- {
- /* Get PCI bus handler */
- Bus = HalHandlerForBus(PCIBus, i);
-
- /* Loop all parent buses */
- ParentBus = Bus->ParentHandler;
- while (ParentBus)
- {
- /* Should merge addresses */
- if (!WarningsGiven[0]++) DPRINT1("Found parent bus (indicating PCI Bridge). PCI devices may fail!\n");
-
- /* Check the next parent */
- ParentBus = ParentBus->ParentHandler;
- }
- }
-
- /* Loop all buses again */
- for (i = 0; i < BusCount; i++)
- {
- /* Get PCI bus handler */
- Bus = HalHandlerForBus(PCIBus, i);
-
- /* Check if this is a PCI 2.2 Bus with Subtractive Decode */
- if (!((PPCIPBUSDATA)Bus->BusData)->Subtractive)
- {
- /* Loop all parent buses */
- ParentBus = Bus->ParentHandler;
- while (ParentBus)
- {
- /* But check only PCI parent buses specifically */
- if (ParentBus->InterfaceType == PCIBus)
- {
- /* Should trim addresses */
- if (!WarningsGiven[1]++) DPRINT1("Found parent PCI Bus (indicating PCI-to-PCI Bridge). PCI devices may fail!\n");
- }
-
- /* Check the next parent */
- ParentBus = ParentBus->ParentHandler;
- }
- }
- }
-
- /* Loop buses one last time */
- for (i = 0; i < BusCount; i++)
- {
- /* Get the PCI bus handler */
- Bus = HalHandlerForBus(PCIBus, i);
-
- /* Sort and combine (trim) bus address range information */
- DPRINT("Warning: Bus addresses not being optimized!\n");
- }
-}
-
-VOID
-NTAPI
-INIT_FUNCTION
-ShowSize(ULONG x)
-{
- if (!x) return;
- DbgPrint(" [size=");
- if (x < 1024)
- {
- DbgPrint("%d", (int) x);
- }
- else if (x < 1048576)
- {
- DbgPrint("%dK", (int)(x / 1024));
- }
- else if (x < 0x80000000)
- {
- DbgPrint("%dM", (int)(x / 1048576));
- }
- else
- {
- DbgPrint("%d", x);
- }
- DbgPrint("]\n");
-}
-
-VOID
-NTAPI
-INIT_FUNCTION
-HalpDebugPciDumpBus(IN ULONG i,
- IN ULONG j,
- IN ULONG k,
- IN PPCI_COMMON_CONFIG PciData)
-{
- extern CHAR ClassTable[3922];
- extern CHAR VendorTable[642355];
- PCHAR p, ClassName, SubClassName, VendorName, ProductName, SubVendorName;
- ULONG Length;
- CHAR LookupString[16] = "";
- CHAR bSubClassName[64] = "";
- CHAR bVendorName[64] = "";
- CHAR bProductName[128] = "Unknown device";
- CHAR bSubVendorName[128] = "Unknown";
- ULONG Size, Mem, b;
-
- /* Isolate the class name */
- sprintf(LookupString, "C %02x", PciData->BaseClass);
- ClassName = strstr(ClassTable, LookupString);
- if (ClassName)
- {
- /* Isolate the subclass name */
- ClassName += 6;
- sprintf(LookupString, "\t%02x", PciData->SubClass);
- SubClassName = strstr(ClassName, LookupString);
- if (SubClassName)
- {
- /* Copy the subclass into our buffer */
- SubClassName += 5;
- p = strchr(SubClassName, '\r');
- Length = p - SubClassName;
- if (Length >= sizeof(bSubClassName)) Length = sizeof(bSubClassName) - 1;
- strncpy(bSubClassName, SubClassName, Length);
- bSubClassName[Length] = '\0';
- }
- }
-
- /* Isolate the vendor name */
- sprintf(LookupString, "\n%04x ", PciData->VendorID);
- VendorName = strstr(VendorTable, LookupString);
- if (VendorName)
- {
- /* Copy the vendor name into our buffer */
- VendorName += 7;
- p = strchr(VendorName, '\r');
- Length = p - VendorName;
- if (Length >= sizeof(bVendorName)) Length = sizeof(bVendorName) - 1;
- strncpy(bVendorName, VendorName, Length);
- bVendorName[Length] = '\0';
-
- /* Isolate the product name */
- sprintf(LookupString, "\t%04x", PciData->DeviceID);
- ProductName = strstr(VendorName, LookupString);
- if (ProductName)
- {
- /* Copy the product name into our buffer */
- ProductName += 7;
- p = strchr(ProductName, '\r');
- Length = p - ProductName;
- if (Length >= sizeof(bProductName)) Length = sizeof(bProductName) - 1;
- strncpy(bProductName, ProductName, Length);
- bProductName[Length] = '\0';
-
- /* Isolate the subvendor and subsystem name */
- sprintf(LookupString,
- "\t\t%04x %04x ",
- PciData->u.type0.SubVendorID,
- PciData->u.type0.SubSystemID);
- SubVendorName = strstr(ProductName, LookupString);
- if (SubVendorName)
- {
- /* Copy the subvendor name into our buffer */
- SubVendorName += 13;
- p = strchr(SubVendorName, '\r');
- Length = p - SubVendorName;
- if (Length >= sizeof(bSubVendorName)) Length = sizeof(bSubVendorName) - 1;
- strncpy(bSubVendorName, SubVendorName, Length);
- bSubVendorName[Length] = '\0';
- }
- }
- }
-
- /* Print out the data */
- DbgPrint("%02x:%02x.%x %s [%02x%02x]: %s %s [%04x:%04x] (rev %02x)\n"
- "\tSubsystem: %s [%04x:%04x]\n",
- i,
- j,
- k,
- bSubClassName,
- PciData->BaseClass,
- PciData->SubClass,
- bVendorName,
- bProductName,
- PciData->VendorID,
- PciData->DeviceID,
- PciData->RevisionID,
- bSubVendorName,
- PciData->u.type0.SubVendorID,
- PciData->u.type0.SubSystemID);
-
- /* Print out and decode flags */
- DbgPrint("\tFlags:");
- if (PciData->Command & PCI_ENABLE_BUS_MASTER) DbgPrint(" bus master,");
- if (PciData->Status & PCI_STATUS_66MHZ_CAPABLE) DbgPrint(" 66MHz,");
- if ((PciData->Status & PCI_STATUS_DEVSEL) == 0x000) DbgPrint(" fast devsel,");
- if ((PciData->Status & PCI_STATUS_DEVSEL) == 0x200) DbgPrint(" medium devsel,");
- if ((PciData->Status & PCI_STATUS_DEVSEL) == 0x400) DbgPrint(" slow devsel,");
- if ((PciData->Status & PCI_STATUS_DEVSEL) == 0x600) DbgPrint(" unknown devsel,");
- DbgPrint(" latency %d", PciData->LatencyTimer);
- if (PciData->u.type0.InterruptPin != 0 &&
- PciData->u.type0.InterruptLine != 0 &&
- PciData->u.type0.InterruptLine != 0xFF) DbgPrint(", IRQ %02d", PciData->u.type0.InterruptLine);
- DbgPrint("\n");
-
- /* Scan addresses */
- Size = 0;
- for (b = 0; b < PCI_TYPE0_ADDRESSES; b++)
- {
- /* Check for a BAR */
- Mem = PciData->u.type0.BaseAddresses[b];
- if (Mem)
- {
- /* Decode the address type */
- if (Mem & PCI_ADDRESS_IO_SPACE)
- {
- /* Guess the size */
- Size = 1 << 2;
- while (!(Mem & Size) && (Size)) Size <<= 1;
-
- /* Print it out */
- DbgPrint("\tI/O ports at %04lx", Mem & PCI_ADDRESS_IO_ADDRESS_MASK);
- ShowSize(Size);
- }
- else
- {
- /* Guess the size */
- Size = 1 << 8;
- while (!(Mem & Size) && (Size)) Size <<= 1;
-
- /* Print it out */
- DbgPrint("\tMemory at %08lx (%d-bit, %sprefetchable)",
- Mem & PCI_ADDRESS_MEMORY_ADDRESS_MASK,
- (Mem & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_32BIT ? 32 : 64,
- (Mem & PCI_ADDRESS_MEMORY_PREFETCHABLE) ? "" : "non-");
- ShowSize(Size);
- }
- }
- }
-}
-#endif
-
-VOID
-NTAPI
-INIT_FUNCTION
-HalpInitializePciBus(VOID)
-{
-#ifndef _MINIHAL_
- PPCI_REGISTRY_INFO_INTERNAL PciRegistryInfo;
- UCHAR PciType;
- PCI_SLOT_NUMBER PciSlot;
- ULONG i, j, k;
- UCHAR DataBuffer[PCI_COMMON_HDR_LENGTH];
- PPCI_COMMON_CONFIG PciData = (PPCI_COMMON_CONFIG)DataBuffer;
- PBUS_HANDLER BusHandler;
- ULONG HackFlags;
- BOOLEAN ExtendedAddressDecoding = FALSE;
- NTSTATUS Status;
-
- /* Query registry information */
- PciRegistryInfo = HalpQueryPciRegistryInfo();
- if (!PciRegistryInfo) return;
-
- /* Initialize the PCI configuration lock */
- KeInitializeSpinLock(&HalpPCIConfigLock);
-
- /* Get the type and free the info structure */
- PciType = PciRegistryInfo->HardwareMechanism & 0xF;
-
- /* Check if this is a type 2 PCI bus with at least one bus */
- if ((PciRegistryInfo->NoBuses) && (PciType == 2))
- {
- /* Setup the PCI slot */
- PciSlot.u.bits.Reserved = 0;
- PciSlot.u.bits.FunctionNumber = 0;
-
- /* Loop all slots */
- for (i = 0; i < 32; i++)
- {
- /* Try to setup a Type 2 PCI slot */
- PciType = 2;
- BusHandler = HalpAllocateAndInitPciBusHandler(2, 0, TRUE);
- if (!BusHandler) break;
-
- /* Now check if it's valid */
- if (HalpIsValidPCIDevice(BusHandler, PciSlot)) break;
-
- /* Heh, the BIOS lied... try Type 1 */
- PciType = 1;
- BusHandler = HalpAllocateAndInitPciBusHandler(1, 0, TRUE);
- if (!BusHandler) break;
-
- /* Now check if it's valid */
- if (HalpIsValidPCIDevice(BusHandler, PciSlot)) break;
-
- /* Keep trying */
- PciType = 2;
- }
-
- /* Now allocate the correct kind of handler */
- HalpAllocateAndInitPciBusHandler(PciType, 0, FALSE);
- }
-
- /* Okay, now loop all PCI bridges */
- do
- {
- /* Loop all PCI buses */
- for (i = 0; i < PciRegistryInfo->NoBuses; i++)
- {
- /* Check if we have a handler for it */
- if (!HalHandlerForBus(PCIBus, i))
- {
- /* Allocate it */
- HalpAllocateAndInitPciBusHandler(PciType, i, FALSE);
- }
- }
- /* Go to the next bridge */
- } while (HalpGetPciBridgeConfig(PciType, &PciRegistryInfo->NoBuses));
-
- /* Now build correct address range informaiton */
- HalpFixupPciSupportedRanges(PciRegistryInfo->NoBuses);
-
- /* Loop every bus */
- DbgPrint("\n====== PCI BUS HARDWARE DETECTION =======\n\n");
- PciSlot.u.bits.Reserved = 0;
- for (i = 0; i < PciRegistryInfo->NoBuses; i++)
- {
- /* Get the bus handler */
- BusHandler = HalHandlerForBus(PCIBus, i);
-
- /* Loop every device */
- for (j = 0; j < 32; j++)
- {
- /* Loop every function */
- PciSlot.u.bits.DeviceNumber = j;
- for (k = 0; k < 8; k++)
- {
- /* Build the final slot structure */
- PciSlot.u.bits.FunctionNumber = k;
-
- /* Read the configuration information */
- HalpReadPCIConfig(BusHandler,
- PciSlot,
- PciData,
- 0,
- PCI_COMMON_HDR_LENGTH);
-
- /* Skip if this is an invalid function */
- if (PciData->VendorID == PCI_INVALID_VENDORID) continue;
-
- /* Print out the entry */
- HalpDebugPciDumpBus(i, j, k, PciData);
-
- /* Check if this is a Cardbus bridge */
- if (PCI_CONFIGURATION_TYPE(PciData) == PCI_CARDBUS_BRIDGE_TYPE)
- {
- /* Not supported */
- DbgPrint("\tDevice is a PCI Cardbus Bridge. It will not work!\n");
- continue;
- }
-
- /* Check if this is a PCI device */
- if (PCI_CONFIGURATION_TYPE(PciData) != PCI_BRIDGE_TYPE)
- {
- /* Check if it has an interrupt pin and line registered */
- if ((PciData->u.type1.InterruptPin) &&
- (PciData->u.type1.InterruptLine))
- {
- /* Check if this interrupt line is connected to the bus */
- if (PciData->u.type1.InterruptLine < 16)
- {
- /* Is this an IDE device? */
- if (!HalpIsIdeDevice(PciData))
- {
- /* We'll mask out this interrupt then */
- DbgPrint("\tDevice is using IRQ %d! ISA Cards using that IRQ may fail!\n",
- PciData->u.type1.InterruptLine);
- HalpPciIrqMask |= (1 << PciData->u.type1.InterruptLine);
- }
- }
- }
- }
-
- /* Check for broken Intel chips */
- if (PciData->VendorID == 0x8086)
- {
- /* Check for broken 82830 PCI controller */
- if ((PciData->DeviceID == 0x04A3) &&
- (PciData->RevisionID < 0x11))
- {
- /* Skip */
- DbgPrint("\tDevice is a broken Intel 82430 PCI Controller. It will not work!\n\n");
- continue;
- }
-
- /* Check for broken 82378 PCI-to-ISA Bridge */
- if ((PciData->DeviceID == 0x0484) &&
- (PciData->RevisionID <= 3))
- {
- /* Skip */
- DbgPrint("\tDevice is a broken Intel 82378 PCI-to-ISA Bridge. It will not work!\n\n");
- continue;
- }
-
- /* Check for broken 82450 PCI Bridge */
- if ((PciData->DeviceID == 0x84C4) &&
- (PciData->RevisionID <= 4))
- {
- DbgPrint("\tDevice is a Intel Orion 82450 PCI Bridge. It will not work!\n\n");
- continue;
- }
- }
-
- /* Do we know this card? */
- if (!ExtendedAddressDecoding)
- {
- /* Check for it */
- if (HalpIsRecognizedCard(PciRegistryInfo,
- PciData,
- HALP_CARD_FEATURE_FULL_DECODE))
- {
- /* We'll do chipset checks later */
- DbgPrint("\tDevice has Extended Address Decoding. It may fail to work on older BIOSes!\n");
- ExtendedAddressDecoding = TRUE;
- }
- }
-
- /* Check if this is a USB controller */
- if ((PciData->BaseClass == PCI_CLASS_SERIAL_BUS_CTLR) &&
- (PciData->SubClass == PCI_SUBCLASS_SB_USB))
- {
- /* Check if this is an OHCI controller */
- if (PciData->ProgIf == 0x10)
- {
- DbgPrint("\tDevice is an OHCI (USB) PCI Expansion Card. Turn off Legacy USB in your BIOS!\n\n");
- continue;
- }
-
- /* Check for Intel UHCI controller */
- if (PciData->VendorID == 0x8086)
- {
- DbgPrint("\tDevice is an Intel UHCI (USB) Controller. Turn off Legacy USB in your BIOS!\n\n");
- continue;
- }
-
- /* Check for VIA UHCI controller */
- if (PciData->VendorID == 0x1106)
- {
- DbgPrint("\tDevice is a VIA UHCI (USB) Controller. Turn off Legacy USB in your BIOS!\n\n");
- continue;
- }
- }
-
- /* Now check the registry for chipset hacks */
- Status = HalpGetChipHacks(PciData->VendorID,
- PciData->DeviceID,
- PciData->RevisionID,
- &HackFlags);
- if (NT_SUCCESS(Status))
- {
- /* Check for broken ACPI routing */
- if (HackFlags & HAL_PCI_CHIP_HACK_DISABLE_ACPI_IRQ_ROUTING)
- {
- DbgPrint("This chipset has broken ACPI IRQ Routing! Be aware!\n\n");
- continue;
- }
-
- /* Check for broken ACPI timer */
- if (HackFlags & HAL_PCI_CHIP_HACK_BROKEN_ACPI_TIMER)
- {
- DbgPrint("This chipset has a broken ACPI timer! Be aware!\n\n");
- continue;
- }
-
- /* Check for hibernate-disable */
- if (HackFlags & HAL_PCI_CHIP_HACK_DISABLE_HIBERNATE)
- {
- DbgPrint("This chipset has a broken PCI device which is incompatible with hibernation. Be aware!\n\n");
- continue;
- }
-
- /* Check for USB controllers that generate SMIs */
- if (HackFlags & HAL_PCI_CHIP_HACK_USB_SMI_DISABLE)
- {
- DbgPrint("This chipset has a USB controller which generates SMIs. ReactOS will likely fail to boot!\n\n");
- continue;
- }
- }
-
- /* Terminate the entry */
- DbgPrint("\n");
- }
- }
- }
-
- /* Initialize NMI Crash Flag */
- HalpGetNMICrashFlag();
-
- /* Free the registry data */
- ExFreePoolWithTag(PciRegistryInfo, TAG_HAL);
-
- /* Tell PnP if this hard supports correct decoding */
- HalpMarkChipsetDecode(ExtendedAddressDecoding);
- DbgPrint("====== PCI BUS DETECTION COMPLETE =======\n\n");
-#endif
-}
-
-VOID
-NTAPI
-INIT_FUNCTION
-HalpInitBusHandlers(VOID)
-{
- /* Register the HAL Bus Handler support */
- HalpRegisterInternalBusHandlers();
-}
-
-VOID
-NTAPI
-INIT_FUNCTION
-HalpRegisterKdSupportFunctions(VOID)
-{
- /* Register PCI Device Functions */
- KdSetupPciDeviceForDebugging = HalpSetupPciDeviceForDebugging;
- KdReleasePciDeviceforDebugging = HalpReleasePciDeviceForDebugging;
-
- /* Register memory functions */
-#ifndef _MINIHAL_
- KdMapPhysicalMemory64 = HalpMapPhysicalMemory64;
- KdUnmapVirtualAddress = HalpUnmapVirtualAddress;
-#endif
-
- /* Register ACPI stub */
- KdCheckPowerButton = HalpCheckPowerButton;
-}
-
-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 %d\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;
-}
-
-BOOLEAN
-NTAPI
-HaliFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress,
- IN OUT PULONG_PTR Context,
- IN BOOLEAN NextBus)
-{
- PHAL_BUS_HANDLER BusHandler;
- PBUS_HANDLER Handler;
- PLIST_ENTRY NextEntry;
- ULONG ContextValue;
-
- /* Make sure we have a context */
- if (!Context) return FALSE;
- ASSERT((*Context) || (NextBus == TRUE));
-
- /* Read the context */
- ContextValue = *Context;
-
- /* Find the bus handler */
- Handler = HalpContextToBusHandler(ContextValue);
- if (!Handler) return FALSE;
-
- /* Check if this is an ongoing lookup */
- if (NextBus)
- {
- /* Get the HAL bus handler */
- BusHandler = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
- NextEntry = &BusHandler->AllHandlers;
-
- /* Get the next one if we were already with one */
- if (ContextValue) NextEntry = NextEntry->Flink;
-
- /* Start scanning */
- while (TRUE)
- {
- /* Check if this is the last one */
- if (NextEntry == &HalpAllBusHandlers)
- {
- /* Quit */
- *Context = 1;
- return FALSE;
- }
-
- /* Call this translator */
- BusHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
- if (HalTranslateBusAddress(BusHandler->Handler.InterfaceType,
- BusHandler->Handler.BusNumber,
- BusAddress,
- AddressSpace,
- TranslatedAddress)) break;
-
- /* Try the next one */
- NextEntry = NextEntry->Flink;
- }
-
- /* If we made it, we're done */
- *Context = (ULONG_PTR)Handler;
- return TRUE;
- }
-
- /* Try the first one through */
- if (!HalTranslateBusAddress(Handler->InterfaceType,
- Handler->BusNumber,
- BusAddress,
- AddressSpace,
- TranslatedAddress)) return FALSE;
-
- /* Remember for next time */
- *Context = (ULONG_PTR)Handler;
- return TRUE;
-}
-
-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: %x!\n", InterfaceType, BusNumber, Handler);
- return FALSE;
- }
-
- /* Do the assignment */
- Status = Handler->TranslateBusAddress(Handler,
- Handler,
- BusAddress,
- AddressSpace,
- TranslatedAddress);
-
- /* Dereference the handler and return */
- HalDereferenceBusHandler(Handler);
- return Status;
-}
-
-/* PUBLIC FUNCTIONS **********************************************************/
-
-/*
- * @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;
-}
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-HalAssignSlotResources(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)
-{
- PAGED_CODE();
-
- /* Check the bus type */
- if (BusType != PCIBus)
- {
- /* Call our internal handler */
- return HalpAssignSlotResources(RegistryPath,
- DriverClassName,
- DriverObject,
- DeviceObject,
- BusType,
- BusNumber,
- SlotNumber,
- AllocatedResources);
- }
- else
- {
- /* Call the PCI registered function */
- return HalPciAssignSlotResources(RegistryPath,
- DriverClassName,
- DriverObject,
- DeviceObject,
- PCIBus,
- BusNumber,
- SlotNumber,
- AllocatedResources);
- }
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalGetBusData(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length)
-{
- /* Call the extended function */
- return HalGetBusDataByOffset(BusDataType,
- BusNumber,
- SlotNumber,
- Buffer,
- 0,
- Length);
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length)
-{
- PBUS_HANDLER Handler;
- ULONG Status;
-
- /* Find the handler */
- Handler = HaliReferenceHandlerForConfigSpace(BusDataType, BusNumber);
- if (!Handler) return 0;
-
- /* Do the assignment */
- Status = Handler->GetBusData(Handler,
- Handler,
- SlotNumber,
- Buffer,
- Offset,
- Length);
-
- /* Dereference the handler and return */
- HalDereferenceBusHandler(Handler);
- return Status;
-}
-
-/*
- * @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
- */
-ULONG
-NTAPI
-HalSetBusData(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length)
-{
- /* Call the extended function */
- return HalSetBusDataByOffset(BusDataType,
- BusNumber,
- SlotNumber,
- Buffer,
- 0,
- Length);
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length)
-{
- PBUS_HANDLER Handler;
- ULONG Status;
-
- /* Find the handler */
- Handler = HaliReferenceHandlerForConfigSpace(BusDataType, BusNumber);
- if (!Handler) return 0;
-
- /* Do the assignment */
- Status = Handler->SetBusData(Handler,
- Handler,
- SlotNumber,
- Buffer,
- Offset,
- Length);
-
- /* Dereference the handler and return */
- HalDereferenceBusHandler(Handler);
- return Status;
-}
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress)
-{
- /* Look as the bus type */
- if (InterfaceType == PCIBus)
- {
- /* Call the PCI registered function */
- return HalPciTranslateBusAddress(PCIBus,
- BusNumber,
- BusAddress,
- AddressSpace,
- TranslatedAddress);
- }
- else
- {
- /* Call the bus handler */
- return HaliTranslateBusAddress(InterfaceType,
- BusNumber,
- BusAddress,
- AddressSpace,
- TranslatedAddress);
- }
-}
-
-/* EOF */