495 lines
10 KiB
C
495 lines
10 KiB
C
|
//
|
||
|
// 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
|