// // Hal specific PCI bus structures // // Copyright (c) 1995-1999 Microsoft Corporation // typedef struct _TYPE2EXTRAS { USHORT SubVendorID; USHORT SubSystemID; ULONG LegacyModeBaseAddress; } TYPE2EXTRAS; typedef NTSTATUS (*PciIrqRange) ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PCI_SLOT_NUMBER PciSlot, OUT PSUPPORTED_RANGE *Interrupt ); typedef struct tagPCIPBUSDATA { // // Defined PCI data // PCIBUSDATA CommonData; // // Implementation specific data // union { struct { PULONG Address; ULONG Data; } Type1; struct { PUCHAR CSE; PUCHAR Forward; ULONG Base; } Type2; } Config; ULONG MaxDevice; PciIrqRange GetIrqRange; BOOLEAN BridgeConfigRead; UCHAR ParentBus; BOOLEAN Subtractive; UCHAR reserved[1]; UCHAR SwizzleIn[4]; RTL_BITMAP DeviceConfigured; ULONG ConfiguredBits[PCI_MAX_DEVICES * PCI_MAX_FUNCTION / 32]; USHORT IrqMask; } PCIPBUSDATA, *PPCIPBUSDATA; #define PciBitIndex(Dev,Fnc) (Fnc*32 + Dev); #define PCI_CONFIG_TYPE(PciData) ((PciData)->HeaderType & ~PCI_MULTIFUNCTION) #define Is64BitBaseAddress(a) \ (((a & PCI_ADDRESS_IO_SPACE) == 0) && \ ((a & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT)) // // Orion B0 errata workaround // struct { PBUS_HANDLER Handler; PCI_SLOT_NUMBER Slot; } HalpOrionOPB; typedef ULONG (*FncConfigIO) ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); typedef VOID (*FncSync) ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot, IN PKIRQL Irql, IN PVOID State ); typedef VOID (*FncReleaseSync) ( IN PBUS_HANDLER BusHandler, IN KIRQL Irql ); typedef struct _PCI_CONFIG_HANDLER { FncSync Synchronize; FncReleaseSync ReleaseSynchronzation; FncConfigIO ConfigRead[3]; FncConfigIO ConfigWrite[3]; } PCI_CONFIG_HANDLER, *PPCI_CONFIG_HANDLER; extern KSPIN_LOCK HalpPCIConfigLock; extern PCI_CONFIG_HANDLER PCIConfigHandler; extern const PCI_CONFIG_HANDLER PCIConfigHandlerType1; extern const PCI_CONFIG_HANDLER PCIConfigHandlerType2; // // Feature types (for PCI_CARD_DESCRIPTOR) // #define PCIFT_FULLDECODE_HOSTBRIDGE 0x00001 // // Card flags (for PCI_CARD_DESCRIPTOR) // #define PCICF_CHECK_REVISIONID 0x10000 #define PCICF_CHECK_SSVID 0x20000 #define PCICF_CHECK_SSID 0x40000 // // Description of a PCI card. // typedef struct _PCI_CARD_DESCRIPTOR { ULONG Flags; USHORT VendorID; USHORT DeviceID; USHORT RevisionID; USHORT SubsystemVendorID; USHORT SubsystemID; USHORT Reserved; } PCI_CARD_DESCRIPTOR; // // Superclass of PCI_REGISTRY_INFO // typedef struct _PCI_REGISTRY_INFO_INTERNAL { struct _PCI_REGISTRY_INFO; // unnamed structure. ULONG ElementCount; PCI_CARD_DESCRIPTOR CardList[]; // Zero entries. } PCI_REGISTRY_INFO_INTERNAL, *PPCI_REGISTRY_INFO_INTERNAL; // // The venerable IRQXOR has got to go, as it now has to extend into // the PCI driver. And that would require the PCI driver to match // the HAL in its checked/free nature. // //#if DBG //#define IRQXOR 0x2B //#else #define IRQXOR 0 //#endif // // Prototypes for functions in ixpcibus.c // VOID HalpInitializePciBus ( VOID ); VOID HalpInitializePciStubs ( VOID ); PPCI_REGISTRY_INFO_INTERNAL HalpQueryPciRegistryInfo ( VOID ); BOOLEAN HalpIsRecognizedCard( IN PPCI_REGISTRY_INFO_INTERNAL PCIRegInfo, IN PPCI_COMMON_CONFIG PciData, IN ULONG FeatureMask ); VOID HalpReadPCIConfig ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); VOID HalpWritePCIConfig ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); PBUS_HANDLER HalpAllocateAndInitPciBusHandler ( IN ULONG HwType, IN ULONG BusNo, IN BOOLEAN TestAllocation ); BOOLEAN HalpIsValidPCIDevice ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot ); BOOLEAN HalpValidPCISlot ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot ); VOID HalpPCISynchronizeType1 ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot, IN PKIRQL Irql, IN PVOID State ); VOID HalpPCIReleaseSynchronzationType1 ( IN PBUS_HANDLER BusHandler, IN KIRQL Irql ); VOID HalpPCISynchronizeOrionB0 ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot, IN PKIRQL Irql, IN PPCI_TYPE1_CFG_BITS PciCfg1 ); VOID HalpPCIReleaseSynchronzationOrionB0 ( IN PBUS_HANDLER BusHandler, IN KIRQL Irql ); ULONG HalpPCIReadUlongType1 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIReadUcharType1 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIReadUshortType1 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIWriteUlongType1 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIWriteUcharType1 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIWriteUshortType1 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); VOID HalpPCISynchronizeType2 ( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER Slot, IN PKIRQL Irql, IN PVOID State ); VOID HalpPCIReleaseSynchronzationType2 ( IN PBUS_HANDLER BusHandler, IN KIRQL Irql ); ULONG HalpPCIReadUlongType2 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIReadUcharType2 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIReadUshortType2 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIWriteUlongType2 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIWriteUcharType2 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpPCIWriteUshortType2 ( IN PPCIPBUSDATA BusData, IN PVOID State, IN PUCHAR Buffer, IN ULONG Offset ); ULONG HalpGetPCIData ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PCI_SLOT_NUMBER SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); ULONG HalpSetPCIData ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PCI_SLOT_NUMBER SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); NTSTATUS HalpAssignPCISlotResources ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources ); // // Prototypes for functions in ixpciint.c // ULONG HalpGetPCIIntOnISABus ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN ULONG BusInterruptLevel, IN ULONG BusInterruptVector, OUT PKIRQL Irql, OUT PKAFFINITY Affinity ); VOID HalpPCIAcquireType2Lock ( PKSPIN_LOCK SpinLock, PKIRQL Irql ); VOID HalpPCIReleaseType2Lock ( PKSPIN_LOCK SpinLock, KIRQL Irql ); NTSTATUS HalpAdjustPCIResourceList ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList ); VOID HalpPCIPin2ISALine ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PCI_SLOT_NUMBER SlotNumber, IN PPCI_COMMON_CONFIG PciData ); VOID HalpPCIISALine2Pin ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PCI_SLOT_NUMBER SlotNumber, IN PPCI_COMMON_CONFIG PciNewData, IN PPCI_COMMON_CONFIG PciOldData ); NTSTATUS HalpGetISAFixedPCIIrq ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PCI_SLOT_NUMBER PciSlot, OUT PSUPPORTED_RANGE *Interrupt ); // // Prototypes for functions in ixpcibrd.c // BOOLEAN HalpGetPciBridgeConfig ( IN ULONG HwType, IN PUCHAR MaxPciBus ); VOID HalpFixupPciSupportedRanges ( IN ULONG MaxBuses ); // // Prototypes for functions in pmpcisup.c // ULONG HaliPciInterfaceReadConfig( IN PVOID Context, IN UCHAR BusOffset, IN ULONG Slot, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); ULONG HaliPciInterfaceWriteConfig( IN PVOID Context, IN UCHAR BusOffset, IN ULONG Slot, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); #if DBG #define DBGMSG(a) DbgPrint(a) VOID HalpTestPci ( ULONG ); #else #define DBGMSG(a) #endif #ifdef SUBCLASSPCI VOID HalpSubclassPCISupport ( IN PBUS_HANDLER BusHandler, IN ULONG HwType ); #endif