2 * PROJECT: ReactOS PCI Bus Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/bus/pci/pci.h
5 * PURPOSE: Main Header File
6 * PROGRAMMERS: ReactOS Portable Systems Group
15 #include <drivers/pci/pci.h>
16 #include <drivers/acpi/acpi.h>
23 // Tag used in all pool allocations (Pci Bus)
25 #define PCI_POOL_TAG 'BicP'
28 // Checks if the specified FDO is the FDO for the Root PCI Bus
30 #define PCI_IS_ROOT_FDO(x) ((x)->BusRootFdoExtension == x)
33 // Assertions to make sure we are dealing with the right kind of extension
35 #define ASSERT_FDO(x) ASSERT((x)->ExtensionType == PciFdoExtensionType);
36 #define ASSERT_PDO(x) ASSERT((x)->ExtensionType == PciPdoExtensionType);
39 // PCI Hack Entry Name Lengths
41 #define PCI_HACK_ENTRY_SIZE sizeof(L"VVVVdddd") - sizeof(UNICODE_NULL)
42 #define PCI_HACK_ENTRY_REV_SIZE sizeof(L"VVVVddddRR") - sizeof(UNICODE_NULL)
43 #define PCI_HACK_ENTRY_SUBSYS_SIZE sizeof(L"VVVVddddssssIIII") - sizeof(UNICODE_NULL)
44 #define PCI_HACK_ENTRY_FULL_SIZE sizeof(L"VVVVddddssssIIIIRR") - sizeof(UNICODE_NULL)
47 // PCI Hack Entry Flags
49 #define PCI_HACK_HAS_REVISION_INFO 0x01
50 #define PCI_HACK_HAS_SUBSYSTEM_INFO 0x02
53 // PCI Interface Flags
55 #define PCI_INTERFACE_PDO 0x01
56 #define PCI_INTERFACE_FDO 0x02
57 #define PCI_INTERFACE_ROOT 0x04
60 // PCI Skip Function Flags
62 #define PCI_SKIP_DEVICE_ENUMERATION 0x01
63 #define PCI_SKIP_RESOURCE_ENUMERATION 0x02
66 // PCI Apply Hack Flags
68 #define PCI_HACK_FIXUP_BEFORE_CONFIGURATION 0x00
69 #define PCI_HACK_FIXUP_AFTER_CONFIGURATION 0x01
70 #define PCI_HACK_FIXUP_BEFORE_UPDATE 0x03
73 // PCI Debugging Device Support
75 #define MAX_DEBUGGING_DEVICES_SUPPORTED 0x04
78 // PCI Driver Verifier Failures
80 #define PCI_VERIFIER_CODES 0x04
83 // PCI ID Buffer ANSI Strings
85 #define MAX_ANSI_STRINGS 0x08
88 // Device Extension, Interface, Translator and Arbiter Signatures
90 typedef enum _PCI_SIGNATURE
92 PciPdoExtensionType
= 'icP0',
93 PciFdoExtensionType
= 'icP1',
95 PciArb_Memory
= 'icP3',
96 PciArb_Interrupt
= 'icP4',
97 PciArb_BusNumber
= 'icP5',
98 PciTrans_Interrupt
= 'icP6',
99 PciInterface_BusHandler
= 'icP7',
100 PciInterface_IntRouteHandler
= 'icP8',
101 PciInterface_PciCb
= 'icP9',
102 PciInterface_LegacyDeviceDetection
= 'icP:',
103 PciInterface_PmeHandler
= 'icP;',
104 PciInterface_DevicePresent
= 'icP<',
105 PciInterface_NativeIde
= 'icP=',
106 PciInterface_AgpTarget
= 'icP>',
107 PciInterface_Location
= 'icP?'
108 } PCI_SIGNATURE
, *PPCI_SIGNATURE
;
111 // Driver-handled PCI Device Types
113 typedef enum _PCI_DEVICE_TYPES
118 PciTypeCardbusBridge
,
123 // Device Extension Logic States
125 typedef enum _PCI_STATE
132 PciSynchronizedOperation
,
137 // IRP Dispatch Logic Style
139 typedef enum _PCI_DISPATCH_STYLE
145 } PCI_DISPATCH_STYLE
;
148 // PCI Hack Entry Information
150 typedef struct _PCI_HACK_ENTRY
159 } PCI_HACK_ENTRY
, *PPCI_HACK_ENTRY
;
162 // Power State Information for Device Extension
164 typedef struct _PCI_POWER_STATE
166 SYSTEM_POWER_STATE CurrentSystemState
;
167 DEVICE_POWER_STATE CurrentDeviceState
;
168 SYSTEM_POWER_STATE SystemWakeLevel
;
169 DEVICE_POWER_STATE DeviceWakeLevel
;
170 DEVICE_POWER_STATE SystemStateMapping
[7];
172 PVOID SavedCancelRoutine
;
176 } PCI_POWER_STATE
, *PPCI_POWER_STATE
;
179 // Internal PCI Lock Structure
181 typedef struct _PCI_LOCK
185 } PCI_LOCK
, *PPCI_LOCK
;
188 // Device Extension for a Bus FDO
190 typedef struct _PCI_FDO_EXTENSION
192 SINGLE_LIST_ENTRY List
;
194 struct _PCI_MJ_DISPATCH_TABLE
*IrpDispatchTable
;
196 BOOLEAN TentativeNextState
;
197 KEVENT SecondaryExtLock
;
198 PDEVICE_OBJECT PhysicalDeviceObject
;
199 PDEVICE_OBJECT FunctionalDeviceObject
;
200 PDEVICE_OBJECT AttachedDeviceObject
;
201 KEVENT ChildListLock
;
202 struct _PCI_PDO_EXTENSION
*ChildPdoList
;
203 struct _PCI_FDO_EXTENSION
*BusRootFdoExtension
;
204 struct _PCI_FDO_EXTENSION
*ParentFdoExtension
;
205 struct _PCI_PDO_EXTENSION
*ChildBridgePdoList
;
206 PPCI_BUS_INTERFACE_STANDARD PciBusInterface
;
207 BOOLEAN MaxSubordinateBus
;
208 BUS_HANDLER
*BusHandler
;
213 BOOLEAN ArbitersInitialized
;
214 BOOLEAN BrokenVideoHackApplied
;
216 PCI_POWER_STATE PowerState
;
217 SINGLE_LIST_ENTRY SecondaryExtension
;
218 LONG ChildWaitWakeCount
;
219 PPCI_COMMON_CONFIG PreservedConfig
;
224 BOOLEAN CacheLineSize
;
225 BOOLEAN LatencyTimer
;
230 } PCI_FDO_EXTENSION
, *PPCI_FDO_EXTENSION
;
232 typedef struct _PCI_FUNCTION_RESOURCES
234 IO_RESOURCE_DESCRIPTOR Limit
[7];
235 CM_PARTIAL_RESOURCE_DESCRIPTOR Current
[7];
236 } PCI_FUNCTION_RESOURCES
, *PPCI_FUNCTION_RESOURCES
;
238 typedef union _PCI_HEADER_TYPE_DEPENDENT
248 UCHAR SubordinateBus
;
249 UCHAR SubtractiveDecode
:1;
252 UCHAR WeChangedBusNumbers
:1;
253 UCHAR IsaBitRequired
:1;
259 } PCI_HEADER_TYPE_DEPENDENT
, *PPCI_HEADER_TYPE_DEPENDENT
;
261 typedef struct _PCI_PDO_EXTENSION
265 struct _PCI_MJ_DISPATCH_TABLE
*IrpDispatchTable
;
267 BOOLEAN TentativeNextState
;
269 KEVENT SecondaryExtLock
;
270 PCI_SLOT_NUMBER Slot
;
271 PDEVICE_OBJECT PhysicalDeviceObject
;
272 PPCI_FDO_EXTENSION ParentFdoExtension
;
273 SINGLE_LIST_ENTRY SecondaryExtension
;
274 LONG BusInterfaceReferenceCount
;
275 LONG AgpInterfaceReferenceCount
;
278 USHORT SubsystemVendorId
;
284 BOOLEAN AdditionalResourceCount
;
285 BOOLEAN AdjustedInterruptLine
;
286 BOOLEAN InterruptPin
;
287 BOOLEAN RawInterruptLine
;
288 BOOLEAN CapabilitiesPtr
;
289 BOOLEAN SavedLatencyTimer
;
290 BOOLEAN SavedCacheLineSize
;
293 BOOLEAN ReportedMissing
;
294 BOOLEAN ExpectedWritebackFailure
;
295 BOOLEAN NoTouchPmeEnable
;
296 BOOLEAN LegacyDriver
;
297 BOOLEAN UpdateHardware
;
299 BOOLEAN DisablePowerDown
;
300 BOOLEAN NeedsHotPlugConfiguration
;
301 BOOLEAN IDEInNativeMode
;
302 BOOLEAN BIOSAllowsIDESwitchToNativeMode
;
303 BOOLEAN IoSpaceUnderNativeIdeControl
;
305 BOOLEAN IoSpaceNotRequired
;
306 PCI_POWER_STATE PowerState
;
307 PCI_HEADER_TYPE_DEPENDENT Dependent
;
309 PCI_FUNCTION_RESOURCES
*Resources
;
310 PCI_FDO_EXTENSION
*BridgeFdoExtension
;
311 struct _PCI_PDO_EXTENSION
*NextBridge
;
312 struct _PCI_PDO_EXTENSION
*NextHashEntry
;
314 PCI_PMC PowerCapabilities
;
315 BOOLEAN TargetAgpCapabilityId
;
316 USHORT CommandEnables
;
317 USHORT InitialCommand
;
318 } PCI_PDO_EXTENSION
, *PPCI_PDO_EXTENSION
;
321 // IRP Dispatch Function Type
323 typedef NTSTATUS (NTAPI
*PCI_DISPATCH_FUNCTION
)(
325 IN PIO_STACK_LOCATION IoStackLocation
,
326 IN PVOID DeviceExtension
330 // IRP Dispatch Minor Table
332 typedef struct _PCI_MN_DISPATCH_TABLE
334 PCI_DISPATCH_STYLE DispatchStyle
;
335 PCI_DISPATCH_FUNCTION DispatchFunction
;
336 } PCI_MN_DISPATCH_TABLE
, *PPCI_MN_DISPATCH_TABLE
;
339 // IRP Dispatch Major Table
341 typedef struct _PCI_MJ_DISPATCH_TABLE
343 ULONG PnpIrpMaximumMinorFunction
;
344 PPCI_MN_DISPATCH_TABLE PnpIrpDispatchTable
;
345 ULONG PowerIrpMaximumMinorFunction
;
346 PPCI_MN_DISPATCH_TABLE PowerIrpDispatchTable
;
347 PCI_DISPATCH_STYLE SystemControlIrpDispatchStyle
;
348 PCI_DISPATCH_FUNCTION SystemControlIrpDispatchFunction
;
349 PCI_DISPATCH_STYLE OtherIrpDispatchStyle
;
350 PCI_DISPATCH_FUNCTION OtherIrpDispatchFunction
;
351 } PCI_MJ_DISPATCH_TABLE
, *PPCI_MJ_DISPATCH_TABLE
;
354 // Generic PCI Interface Constructor and Initializer
356 struct _PCI_INTERFACE
;
357 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_CONSTRUCTOR
)(
358 IN PVOID DeviceExtension
,
360 IN PVOID InterfaceData
,
363 IN PINTERFACE Interface
366 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_INITIALIZER
)(
371 // Generic PCI Interface (Interface, Translator, Arbiter)
373 typedef struct _PCI_INTERFACE
375 CONST GUID
*InterfaceType
;
381 PCI_SIGNATURE Signature
;
382 PCI_INTERFACE_CONSTRUCTOR Constructor
;
383 PCI_INTERFACE_INITIALIZER Initializer
;
384 } PCI_INTERFACE
, *PPCI_INTERFACE
;
387 // Generic Secondary Extension Instance Header (Interface, Translator, Arbiter)
389 typedef struct PCI_SECONDARY_EXTENSION
391 SINGLE_LIST_ENTRY List
;
392 PCI_SIGNATURE ExtensionType
;
394 } PCI_SECONDARY_EXTENSION
, *PPCI_SECONDARY_EXTENSION
;
397 // PCI Arbiter Instance
399 typedef struct PCI_ARBITER_INSTANCE
401 PCI_SECONDARY_EXTENSION Header
;
402 PPCI_INTERFACE Interface
;
403 PPCI_FDO_EXTENSION BusFdoExtension
;
404 WCHAR InstanceName
[24];
405 //ARBITER_INSTANCE CommonInstance; FIXME: Need Arbiter Headers
406 } PCI_ARBITER_INSTANCE
, *PPCI_ARBITER_INSTANCE
;
411 typedef struct _PCI_VERIFIER_DATA
414 VF_FAILURE_CLASS FailureClass
;
415 ULONG AssertionControl
;
416 PCHAR DebuggerMessageText
;
417 } PCI_VERIFIER_DATA
, *PPCI_VERIFIER_DATA
;
420 // PCI ID Buffer Descriptor
422 typedef struct _PCI_ID_BUFFER
425 ANSI_STRING Strings
[MAX_ANSI_STRINGS
];
426 ULONG StringSize
[MAX_ANSI_STRINGS
];
429 CHAR BufferData
[256];
430 } PCI_ID_BUFFER
, *PPCI_ID_BUFFER
;
433 // PCI Configuration Callbacks
435 struct _PCI_CONFIGURATOR_CONTEXT
;
437 typedef VOID (NTAPI
*PCI_CONFIGURATOR_INITIALIZE
)(
438 IN
struct _PCI_CONFIGURATOR_CONTEXT
* Context
441 typedef VOID (NTAPI
*PCI_CONFIGURATOR_RESTORE_CURRENT
)(
442 IN
struct _PCI_CONFIGURATOR_CONTEXT
* Context
445 typedef VOID (NTAPI
*PCI_CONFIGURATOR_SAVE_LIMITS
)(
446 IN
struct _PCI_CONFIGURATOR_CONTEXT
* Context
449 typedef VOID (NTAPI
*PCI_CONFIGURATOR_SAVE_CURRENT_SETTINGS
)(
450 IN
struct _PCI_CONFIGURATOR_CONTEXT
* Context
453 typedef VOID (NTAPI
*PCI_CONFIGURATOR_CHANGE_RESOURCE_SETTINGS
)(
454 IN PPCI_PDO_EXTENSION PdoExtension
,
455 IN PPCI_COMMON_HEADER PciData
458 typedef VOID (NTAPI
*PCI_CONFIGURATOR_GET_ADDITIONAL_RESOURCE_DESCRIPTORS
)(
459 IN
struct _PCI_CONFIGURATOR_CONTEXT
* Context
,
460 IN PPCI_COMMON_HEADER PciData
,
461 IN PIO_RESOURCE_DESCRIPTOR IoDescriptor
464 typedef VOID (NTAPI
*PCI_CONFIGURATOR_RESET_DEVICE
)(
465 IN PPCI_PDO_EXTENSION PdoExtension
,
466 IN PPCI_COMMON_HEADER PciData
472 typedef struct _PCI_CONFIGURATOR
474 PCI_CONFIGURATOR_INITIALIZE Initialize
;
475 PCI_CONFIGURATOR_RESTORE_CURRENT RestoreCurrent
;
476 PCI_CONFIGURATOR_SAVE_LIMITS SaveLimits
;
477 PCI_CONFIGURATOR_SAVE_CURRENT_SETTINGS SaveCurrentSettings
;
478 PCI_CONFIGURATOR_CHANGE_RESOURCE_SETTINGS ChangeResourceSettings
;
479 PCI_CONFIGURATOR_GET_ADDITIONAL_RESOURCE_DESCRIPTORS GetAdditionalResourceDescriptors
;
480 PCI_CONFIGURATOR_RESET_DEVICE ResetDevice
;
481 } PCI_CONFIGURATOR
, *PPCI_CONFIGURATOR
;
484 // PCI Configurator Context
486 typedef struct _PCI_CONFIGURATOR_CONTEXT
488 PPCI_PDO_EXTENSION PdoExtension
;
489 PPCI_COMMON_HEADER Current
;
490 PPCI_COMMON_HEADER PciData
;
491 PPCI_CONFIGURATOR Configurator
;
492 USHORT SecondaryStatus
;
495 } PCI_CONFIGURATOR_CONTEXT
, *PPCI_CONFIGURATOR_CONTEXT
;
500 typedef VOID (NTAPI
*PCI_IPI_FUNCTION
)(
508 typedef struct _PCI_IPI_CONTEXT
512 PVOID DeviceExtension
;
513 PCI_IPI_FUNCTION Function
;
515 } PCI_IPI_CONTEXT
, *PPCI_IPI_CONTEXT
;
518 // PCI Legacy Device Location Cache
520 typedef struct _PCI_LEGACY_DEVICE
522 struct _PCI_LEGACY_DEVICE
*Next
;
523 PDEVICE_OBJECT DeviceObject
;
530 PDEVICE_OBJECT PhysicalDeviceObject
;
531 ROUTING_TOKEN RoutingToken
;
532 PPCI_PDO_EXTENSION PdoExtension
;
533 } PCI_LEGACY_DEVICE
, *PPCI_LEGACY_DEVICE
;
536 // IRP Dispatch Routines
541 IN PDEVICE_OBJECT DeviceObject
,
549 IN PIO_STACK_LOCATION IoStackLocation
,
550 IN PPCI_FDO_EXTENSION DeviceExtension
555 PciPassIrpFromFdoToPdo(
556 IN PPCI_FDO_EXTENSION DeviceExtension
,
563 IN PPCI_FDO_EXTENSION DeviceExtension
,
569 PciIrpInvalidDeviceRequest(
571 IN PIO_STACK_LOCATION IoStackLocation
,
572 IN PPCI_FDO_EXTENSION DeviceExtension
582 IN PIO_STACK_LOCATION IoStackLocation
,
583 IN PPCI_FDO_EXTENSION DeviceExtension
590 IN PIO_STACK_LOCATION IoStackLocation
,
591 IN PPCI_FDO_EXTENSION DeviceExtension
598 IN PIO_STACK_LOCATION IoStackLocation
,
599 IN PPCI_FDO_EXTENSION DeviceExtension
604 PciSetPowerManagedDevicePowerState(
605 IN PPCI_PDO_EXTENSION DeviceExtension
,
606 IN DEVICE_POWER_STATE DeviceState
,
616 IN PDRIVER_OBJECT DriverObject
,
617 IN PDEVICE_OBJECT PhysicalDeviceObject
622 PciFdoIrpStartDevice(
624 IN PIO_STACK_LOCATION IoStackLocation
,
625 IN PPCI_FDO_EXTENSION DeviceExtension
630 PciFdoIrpQueryRemoveDevice(
632 IN PIO_STACK_LOCATION IoStackLocation
,
633 IN PPCI_FDO_EXTENSION DeviceExtension
638 PciFdoIrpRemoveDevice(
640 IN PIO_STACK_LOCATION IoStackLocation
,
641 IN PPCI_FDO_EXTENSION DeviceExtension
646 PciFdoIrpCancelRemoveDevice(
648 IN PIO_STACK_LOCATION IoStackLocation
,
649 IN PPCI_FDO_EXTENSION DeviceExtension
656 IN PIO_STACK_LOCATION IoStackLocation
,
657 IN PPCI_FDO_EXTENSION DeviceExtension
662 PciFdoIrpQueryStopDevice(
664 IN PIO_STACK_LOCATION IoStackLocation
,
665 IN PPCI_FDO_EXTENSION DeviceExtension
670 PciFdoIrpCancelStopDevice(
672 IN PIO_STACK_LOCATION IoStackLocation
,
673 IN PPCI_FDO_EXTENSION DeviceExtension
678 PciFdoIrpQueryDeviceRelations(
680 IN PIO_STACK_LOCATION IoStackLocation
,
681 IN PPCI_FDO_EXTENSION DeviceExtension
686 PciFdoIrpQueryInterface(
688 IN PIO_STACK_LOCATION IoStackLocation
,
689 IN PPCI_FDO_EXTENSION DeviceExtension
694 PciFdoIrpQueryCapabilities(
696 IN PIO_STACK_LOCATION IoStackLocation
,
697 IN PPCI_FDO_EXTENSION DeviceExtension
702 PciFdoIrpDeviceUsageNotification(
704 IN PIO_STACK_LOCATION IoStackLocation
,
705 IN PPCI_FDO_EXTENSION DeviceExtension
710 PciFdoIrpSurpriseRemoval(
712 IN PIO_STACK_LOCATION IoStackLocation
,
713 IN PPCI_FDO_EXTENSION DeviceExtension
718 PciFdoIrpQueryLegacyBusInformation(
720 IN PIO_STACK_LOCATION IoStackLocation
,
721 IN PPCI_FDO_EXTENSION DeviceExtension
725 // Device PDO Routines
730 IN PPCI_FDO_EXTENSION DeviceExtension
,
731 IN PCI_SLOT_NUMBER Slot
,
732 OUT PDEVICE_OBJECT
*PdoDeviceObject
739 IN PIO_STACK_LOCATION IoStackLocation
,
740 IN PPCI_PDO_EXTENSION DeviceExtension
747 IN PIO_STACK_LOCATION IoStackLocation
,
748 IN PPCI_PDO_EXTENSION DeviceExtension
755 IN PIO_STACK_LOCATION IoStackLocation
,
756 IN PPCI_PDO_EXTENSION DeviceExtension
761 PciPdoIrpStartDevice(
763 IN PIO_STACK_LOCATION IoStackLocation
,
764 IN PPCI_PDO_EXTENSION DeviceExtension
769 PciPdoIrpQueryRemoveDevice(
771 IN PIO_STACK_LOCATION IoStackLocation
,
772 IN PPCI_PDO_EXTENSION DeviceExtension
777 PciPdoIrpRemoveDevice(
779 IN PIO_STACK_LOCATION IoStackLocation
,
780 IN PPCI_PDO_EXTENSION DeviceExtension
785 PciPdoIrpCancelRemoveDevice(
787 IN PIO_STACK_LOCATION IoStackLocation
,
788 IN PPCI_PDO_EXTENSION DeviceExtension
795 IN PIO_STACK_LOCATION IoStackLocation
,
796 IN PPCI_PDO_EXTENSION DeviceExtension
801 PciPdoIrpQueryStopDevice(
803 IN PIO_STACK_LOCATION IoStackLocation
,
804 IN PPCI_PDO_EXTENSION DeviceExtension
809 PciPdoIrpCancelStopDevice(
811 IN PIO_STACK_LOCATION IoStackLocation
,
812 IN PPCI_PDO_EXTENSION DeviceExtension
817 PciPdoIrpQueryDeviceRelations(
819 IN PIO_STACK_LOCATION IoStackLocation
,
820 IN PPCI_PDO_EXTENSION DeviceExtension
825 PciPdoIrpQueryInterface(
827 IN PIO_STACK_LOCATION IoStackLocation
,
828 IN PPCI_PDO_EXTENSION DeviceExtension
833 PciPdoIrpQueryCapabilities(
835 IN PIO_STACK_LOCATION IoStackLocation
,
836 IN PPCI_PDO_EXTENSION DeviceExtension
841 PciPdoIrpQueryResources(
843 IN PIO_STACK_LOCATION IoStackLocation
,
844 IN PPCI_PDO_EXTENSION DeviceExtension
849 PciPdoIrpQueryResourceRequirements(
851 IN PIO_STACK_LOCATION IoStackLocation
,
852 IN PPCI_PDO_EXTENSION DeviceExtension
857 PciPdoIrpQueryDeviceText(
859 IN PIO_STACK_LOCATION IoStackLocation
,
860 IN PPCI_PDO_EXTENSION DeviceExtension
867 IN PIO_STACK_LOCATION IoStackLocation
,
868 IN PPCI_PDO_EXTENSION DeviceExtension
873 PciPdoIrpWriteConfig(
875 IN PIO_STACK_LOCATION IoStackLocation
,
876 IN PPCI_PDO_EXTENSION DeviceExtension
883 IN PIO_STACK_LOCATION IoStackLocation
,
884 IN PPCI_PDO_EXTENSION DeviceExtension
889 PciPdoIrpQueryDeviceState(
891 IN PIO_STACK_LOCATION IoStackLocation
,
892 IN PPCI_PDO_EXTENSION DeviceExtension
897 PciPdoIrpQueryBusInformation(
899 IN PIO_STACK_LOCATION IoStackLocation
,
900 IN PPCI_PDO_EXTENSION DeviceExtension
905 PciPdoIrpDeviceUsageNotification(
907 IN PIO_STACK_LOCATION IoStackLocation
,
908 IN PPCI_PDO_EXTENSION DeviceExtension
913 PciPdoIrpSurpriseRemoval(
915 IN PIO_STACK_LOCATION IoStackLocation
,
916 IN PPCI_PDO_EXTENSION DeviceExtension
921 PciPdoIrpQueryLegacyBusInformation(
923 IN PIO_STACK_LOCATION IoStackLocation
,
924 IN PPCI_PDO_EXTENSION DeviceExtension
929 // HAL Callback/Hook Routines
938 // PCI Verifier Routines
943 IN PDRIVER_OBJECT DriverObject
948 PciVerifierRetrieveFailureData(
970 PciBuildDefaultExclusionLists(
976 PciUnicodeStringStrStr(
977 IN PUNICODE_STRING InputString
,
978 IN PCUNICODE_STRING EqualString
,
979 IN BOOLEAN CaseInSensitive
987 IN ACCESS_MASK DesiredAccess
,
988 OUT PHANDLE KeyHandle
,
989 OUT PNTSTATUS KeyStatus
997 IN HANDLE RootHandle
,
999 OUT PVOID
*OutputBuffer
,
1000 OUT PULONG OutputLength
1005 PciFindParentPciFdoExtension(
1006 IN PDEVICE_OBJECT DeviceObject
,
1012 PciInsertEntryAtTail(
1013 IN PSINGLE_LIST_ENTRY ListHead
,
1014 IN PPCI_FDO_EXTENSION DeviceExtension
,
1020 PciGetDeviceProperty(
1021 IN PDEVICE_OBJECT DeviceObject
,
1022 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
1023 OUT PVOID
*OutputBuffer
1029 IN PDEVICE_OBJECT DeviceObject
,
1030 IN ULONG IoControlCode
,
1031 IN PVOID InputBuffer
,
1032 IN ULONG InputBufferLength
,
1033 IN PVOID OutputBuffer
,
1034 IN ULONG OutputBufferLength
1039 PcipLinkSecondaryExtension(
1040 IN PSINGLE_LIST_ENTRY List
,
1042 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
1043 IN PCI_SIGNATURE ExtensionType
,
1047 PPCI_SECONDARY_EXTENSION
1049 PciFindNextSecondaryExtension(
1050 IN PSINGLE_LIST_ENTRY ListHead
,
1051 IN PCI_SIGNATURE ExtensionType
1059 IN USHORT SubVendorId
,
1060 IN USHORT SubSystemId
,
1066 PciFindPdoByFunction(
1067 IN PPCI_FDO_EXTENSION DeviceExtension
,
1068 IN ULONG FunctionNumber
,
1069 IN PPCI_COMMON_HEADER PciData
1074 PciIsCriticalDeviceClass(
1081 PciIsDeviceOnDebugPath(
1082 IN PPCI_PDO_EXTENSION DeviceExtension
1088 IN PPCI_PDO_EXTENSION DeviceExtension
,
1089 OUT PPCI_COMMON_HEADER PciData
1095 IN PPCI_PDO_EXTENSION DeviceExtension
,
1096 OUT PPCI_COMMON_HEADER PciData
1101 PciReadDeviceCapability(
1102 IN PPCI_PDO_EXTENSION DeviceExtension
,
1104 IN ULONG CapabilityId
,
1105 OUT PPCI_CAPABILITIES_HEADER Buffer
,
1111 PciCanDisableDecodes(
1112 IN PPCI_PDO_EXTENSION DeviceExtension
,
1113 IN PPCI_COMMON_HEADER Config
,
1114 IN ULONGLONG HackFlags
,
1115 IN BOOLEAN ForPowerDown
1120 PciClassifyDeviceType(
1121 IN PPCI_PDO_EXTENSION PdoExtension
1126 PciExecuteCriticalSystemRoutine(
1127 IN ULONG_PTR IpiContext
1132 PciCreateIoDescriptorFromBarLimit(
1133 PIO_RESOURCE_DESCRIPTOR ResourceDescriptor
,
1140 PciIsSlotPresentInParentMethod(
1141 IN PPCI_PDO_EXTENSION PdoExtension
,
1148 IN PPCI_PDO_EXTENSION PdoExtension
,
1155 PciQueryBusInformation(
1156 IN PPCI_PDO_EXTENSION PdoExtension
,
1157 IN PPNP_BUS_INFORMATION
* Buffer
1162 PciQueryCapabilities(
1163 IN PPCI_PDO_EXTENSION PdoExtension
,
1164 IN OUT PDEVICE_CAPABILITIES DeviceCapability
1167 PCM_PARTIAL_RESOURCE_DESCRIPTOR
1169 PciNextPartialDescriptor(
1170 PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor
1174 // Configuration Routines
1178 PciGetConfigHandlers(
1179 IN PPCI_FDO_EXTENSION FdoExtension
1185 IN PPCI_FDO_EXTENSION DeviceExtension
,
1186 IN PCI_SLOT_NUMBER Slot
,
1194 PciWriteDeviceConfig(
1195 IN PPCI_PDO_EXTENSION DeviceExtension
,
1203 PciReadDeviceConfig(
1204 IN PPCI_PDO_EXTENSION DeviceExtension
,
1212 PciGetAdjustedInterruptLine(
1213 IN PPCI_PDO_EXTENSION PdoExtension
1217 // State Machine Logic Transition Routines
1222 IN PPCI_FDO_EXTENSION DeviceExtension
1227 PciBeginStateTransition(
1228 IN PPCI_FDO_EXTENSION DeviceExtension
,
1229 IN PCI_STATE NewState
1234 PciCancelStateTransition(
1235 IN PPCI_FDO_EXTENSION DeviceExtension
,
1236 IN PCI_STATE NewState
1241 PciCommitStateTransition(
1242 IN PPCI_FDO_EXTENSION DeviceExtension
,
1243 IN PCI_STATE NewState
1251 PciInitializeArbiters(
1252 IN PPCI_FDO_EXTENSION FdoExtension
1257 PciInitializeArbiterRanges(
1258 IN PPCI_FDO_EXTENSION DeviceExtension
,
1259 IN PCM_RESOURCE_LIST Resources
1267 PciDebugIrpDispatchDisplay(
1268 IN PIO_STACK_LOCATION IoStackLocation
,
1269 IN PPCI_FDO_EXTENSION DeviceExtension
,
1275 PciDebugDumpCommonConfig(
1276 IN PPCI_COMMON_HEADER PciData
1281 PciDebugDumpQueryCapabilities(
1282 IN PDEVICE_CAPABILITIES DeviceCaps
1287 PciDebugPrintIoResReqList(
1288 IN PIO_RESOURCE_REQUIREMENTS_LIST Requirements
1293 PciDebugPrintCmResList(
1294 IN PCM_RESOURCE_LIST ResourceList
1299 PciDebugPrintPartialResource(
1300 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResource
1304 // Interface Support
1309 IN PPCI_FDO_EXTENSION DeviceExtension
,
1310 IN CONST GUID
* InterfaceType
,
1313 IN PVOID InterfaceData
,
1314 IN PINTERFACE Interface
,
1315 IN BOOLEAN LastChance
1320 PciPmeInterfaceInitializer(
1326 routeintrf_Initializer(
1332 arbusno_Initializer(
1338 agpintrf_Initializer(
1344 tranirq_Initializer(
1350 busintrf_Initializer(
1368 locintrf_Initializer(
1374 pcicbintrf_Initializer(
1380 lddintrf_Initializer(
1386 devpresent_Initializer(
1392 agpintrf_Constructor(
1393 IN PVOID DeviceExtension
,
1395 IN PVOID InterfaceData
,
1398 IN PINTERFACE Interface
1403 arbusno_Constructor(
1404 IN PVOID DeviceExtension
,
1406 IN PVOID InterfaceData
,
1409 IN PINTERFACE Interface
1414 tranirq_Constructor(
1415 IN PVOID DeviceExtension
,
1417 IN PVOID InterfaceData
,
1420 IN PINTERFACE Interface
1426 IN PVOID DeviceExtension
,
1428 IN PVOID InterfaceData
,
1431 IN PINTERFACE Interface
1436 busintrf_Constructor(
1437 IN PVOID DeviceExtension
,
1439 IN PVOID InterfaceData
,
1442 IN PINTERFACE Interface
1448 IN PVOID DeviceExtension
,
1450 IN PVOID InterfaceData
,
1453 IN PINTERFACE Interface
1458 ario_ApplyBrokenVideoHack(
1459 IN PPCI_FDO_EXTENSION FdoExtension
1464 pcicbintrf_Constructor(
1465 IN PVOID DeviceExtension
,
1467 IN PVOID InterfaceData
,
1470 IN PINTERFACE Interface
1475 lddintrf_Constructor(
1476 IN PVOID DeviceExtension
,
1478 IN PVOID InterfaceData
,
1481 IN PINTERFACE Interface
1486 locintrf_Constructor(
1487 IN PVOID DeviceExtension
,
1489 IN PVOID InterfaceData
,
1492 IN PINTERFACE Interface
1497 PciPmeInterfaceConstructor(
1498 IN PVOID DeviceExtension
,
1500 IN PVOID InterfaceData
,
1503 IN PINTERFACE Interface
1508 routeintrf_Constructor(
1509 IN PVOID DeviceExtension
,
1511 IN PVOID InterfaceData
,
1514 IN PINTERFACE Interface
1519 devpresent_Constructor(
1520 IN PVOID DeviceExtension
,
1522 IN PVOID InterfaceData
,
1525 IN PINTERFACE Interface
1529 // PCI Enumeration and Resources
1533 PciQueryDeviceRelations(
1534 IN PPCI_FDO_EXTENSION DeviceExtension
,
1535 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
1541 IN PPCI_PDO_EXTENSION PdoExtension
,
1542 OUT PCM_RESOURCE_LIST
*Buffer
1547 PciQueryTargetDeviceRelations(
1548 IN PPCI_PDO_EXTENSION PdoExtension
,
1549 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
1554 PciQueryEjectionRelations(
1555 IN PPCI_PDO_EXTENSION PdoExtension
,
1556 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
1561 PciQueryRequirements(
1562 IN PPCI_PDO_EXTENSION PdoExtension
,
1563 IN OUT PIO_RESOURCE_REQUIREMENTS_LIST
*RequirementsList
1568 PciComputeNewCurrentSettings(
1569 IN PPCI_PDO_EXTENSION PdoExtension
,
1570 IN PCM_RESOURCE_LIST ResourceList
1576 IN PPCI_PDO_EXTENSION PdoExtension
,
1578 IN BOOLEAN SomethingSomethingDarkSide
1583 PciBuildRequirementsList(
1584 IN PPCI_PDO_EXTENSION PdoExtension
,
1585 IN PPCI_COMMON_HEADER PciData
,
1586 OUT PIO_RESOURCE_REQUIREMENTS_LIST
* Buffer
1590 // Identification Functions
1594 PciGetDeviceDescriptionMessage(
1602 IN PPCI_PDO_EXTENSION PdoExtension
,
1603 IN DEVICE_TEXT_TYPE QueryType
,
1611 IN PPCI_PDO_EXTENSION DeviceExtension
,
1612 IN BUS_QUERY_ID_TYPE QueryType
,
1621 Cardbus_MassageHeaderForLimitsDetermination(
1622 IN PPCI_CONFIGURATOR_CONTEXT Context
1627 Cardbus_SaveCurrentSettings(
1628 IN PPCI_CONFIGURATOR_CONTEXT Context
1634 IN PPCI_CONFIGURATOR_CONTEXT Context
1639 Cardbus_RestoreCurrent(
1640 IN PPCI_CONFIGURATOR_CONTEXT Context
1645 Cardbus_GetAdditionalResourceDescriptors(
1646 IN PPCI_CONFIGURATOR_CONTEXT Context
,
1647 IN PPCI_COMMON_HEADER PciData
,
1648 IN PIO_RESOURCE_DESCRIPTOR IoDescriptor
1653 Cardbus_ResetDevice(
1654 IN PPCI_PDO_EXTENSION PdoExtension
,
1655 IN PPCI_COMMON_HEADER PciData
1660 Cardbus_ChangeResourceSettings(
1661 IN PPCI_PDO_EXTENSION PdoExtension
,
1662 IN PPCI_COMMON_HEADER PciData
1666 // PCI Device Support
1670 Device_MassageHeaderForLimitsDetermination(
1671 IN PPCI_CONFIGURATOR_CONTEXT Context
1676 Device_SaveCurrentSettings(
1677 IN PPCI_CONFIGURATOR_CONTEXT Context
1683 IN PPCI_CONFIGURATOR_CONTEXT Context
1688 Device_RestoreCurrent(
1689 IN PPCI_CONFIGURATOR_CONTEXT Context
1694 Device_GetAdditionalResourceDescriptors(
1695 IN PPCI_CONFIGURATOR_CONTEXT Context
,
1696 IN PPCI_COMMON_HEADER PciData
,
1697 IN PIO_RESOURCE_DESCRIPTOR IoDescriptor
1703 IN PPCI_PDO_EXTENSION PdoExtension
,
1704 IN PPCI_COMMON_HEADER PciData
1709 Device_ChangeResourceSettings(
1710 IN PPCI_PDO_EXTENSION PdoExtension
,
1711 IN PPCI_COMMON_HEADER PciData
1715 // PCI-to-PCI Bridge Device Support
1719 PPBridge_MassageHeaderForLimitsDetermination(
1720 IN PPCI_CONFIGURATOR_CONTEXT Context
1725 PPBridge_SaveCurrentSettings(
1726 IN PPCI_CONFIGURATOR_CONTEXT Context
1731 PPBridge_SaveLimits(
1732 IN PPCI_CONFIGURATOR_CONTEXT Context
1737 PPBridge_RestoreCurrent(
1738 IN PPCI_CONFIGURATOR_CONTEXT Context
1743 PPBridge_GetAdditionalResourceDescriptors(
1744 IN PPCI_CONFIGURATOR_CONTEXT Context
,
1745 IN PPCI_COMMON_HEADER PciData
,
1746 IN PIO_RESOURCE_DESCRIPTOR IoDescriptor
1751 PPBridge_ResetDevice(
1752 IN PPCI_PDO_EXTENSION PdoExtension
,
1753 IN PPCI_COMMON_HEADER PciData
1758 PPBridge_ChangeResourceSettings(
1759 IN PPCI_PDO_EXTENSION PdoExtension
,
1760 IN PPCI_COMMON_HEADER PciData
1764 // Bus Number Routines
1768 PciAreBusNumbersConfigured(
1769 IN PPCI_PDO_EXTENSION PdoExtension
1773 // Routine Interface
1777 PciCacheLegacyDeviceRouting(
1778 IN PDEVICE_OBJECT DeviceObject
,
1780 IN ULONG SlotNumber
,
1781 IN UCHAR InterruptLine
,
1782 IN UCHAR InterruptPin
,
1785 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1786 IN PPCI_PDO_EXTENSION PdoExtension
,
1787 OUT PDEVICE_OBJECT
*pFoundDeviceObject
1791 // External Resources
1793 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
1794 extern KEVENT PciGlobalLock
;
1795 extern PPCI_INTERFACE PciInterfaces
[];
1796 extern PCI_INTERFACE ArbiterInterfaceBusNumber
;
1797 extern PCI_INTERFACE ArbiterInterfaceMemory
;
1798 extern PCI_INTERFACE ArbiterInterfaceIo
;
1799 extern PCI_INTERFACE BusHandlerInterface
;
1800 extern PCI_INTERFACE PciRoutingInterface
;
1801 extern PCI_INTERFACE PciCardbusPrivateInterface
;
1802 extern PCI_INTERFACE PciLegacyDeviceDetectionInterface
;
1803 extern PCI_INTERFACE PciPmeInterface
;
1804 extern PCI_INTERFACE PciDevicePresentInterface
;
1805 //extern PCI_INTERFACE PciNativeIdeInterface;
1806 extern PCI_INTERFACE PciLocationInterface
;
1807 extern PCI_INTERFACE AgpTargetInterface
;
1808 extern PCI_INTERFACE TranslatorInterfaceInterrupt
;
1809 extern PDRIVER_OBJECT PciDriverObject
;
1810 extern PWATCHDOG_TABLE WdTable
;
1811 extern PPCI_HACK_ENTRY PciHackTable
;
1812 extern BOOLEAN PciAssignBusNumbers
;
1813 extern BOOLEAN PciEnableNativeModeATA
;
1814 extern PPCI_IRQ_ROUTING_TABLE PciIrqRoutingTable
;
1815 extern BOOLEAN PciRunningDatacenter
;
1817 /* Exported by NTOS, should this go in the NDK? */
1818 extern NTSYSAPI BOOLEAN InitSafeBootMode
;