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
16 #include <drivers/pci/pci.h>
17 #include <drivers/acpi/acpi.h>
18 #include <ndk/halfuncs.h>
19 #include <ndk/rtlfuncs.h>
20 #include <ndk/vffuncs.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
539 DRIVER_DISPATCH PciDispatchIrp
;
544 IN PDEVICE_OBJECT DeviceObject
,
552 IN PIO_STACK_LOCATION IoStackLocation
,
553 IN PPCI_FDO_EXTENSION DeviceExtension
558 PciPassIrpFromFdoToPdo(
559 IN PPCI_FDO_EXTENSION DeviceExtension
,
566 IN PPCI_FDO_EXTENSION DeviceExtension
,
572 PciIrpInvalidDeviceRequest(
574 IN PIO_STACK_LOCATION IoStackLocation
,
575 IN PPCI_FDO_EXTENSION DeviceExtension
585 IN PIO_STACK_LOCATION IoStackLocation
,
586 IN PPCI_FDO_EXTENSION DeviceExtension
593 IN PIO_STACK_LOCATION IoStackLocation
,
594 IN PPCI_FDO_EXTENSION DeviceExtension
601 IN PIO_STACK_LOCATION IoStackLocation
,
602 IN PPCI_FDO_EXTENSION DeviceExtension
607 PciSetPowerManagedDevicePowerState(
608 IN PPCI_PDO_EXTENSION DeviceExtension
,
609 IN DEVICE_POWER_STATE DeviceState
,
617 DRIVER_ADD_DEVICE PciAddDevice
;
622 IN PDRIVER_OBJECT DriverObject
,
623 IN PDEVICE_OBJECT PhysicalDeviceObject
628 PciFdoIrpStartDevice(
630 IN PIO_STACK_LOCATION IoStackLocation
,
631 IN PPCI_FDO_EXTENSION DeviceExtension
636 PciFdoIrpQueryRemoveDevice(
638 IN PIO_STACK_LOCATION IoStackLocation
,
639 IN PPCI_FDO_EXTENSION DeviceExtension
644 PciFdoIrpRemoveDevice(
646 IN PIO_STACK_LOCATION IoStackLocation
,
647 IN PPCI_FDO_EXTENSION DeviceExtension
652 PciFdoIrpCancelRemoveDevice(
654 IN PIO_STACK_LOCATION IoStackLocation
,
655 IN PPCI_FDO_EXTENSION DeviceExtension
662 IN PIO_STACK_LOCATION IoStackLocation
,
663 IN PPCI_FDO_EXTENSION DeviceExtension
668 PciFdoIrpQueryStopDevice(
670 IN PIO_STACK_LOCATION IoStackLocation
,
671 IN PPCI_FDO_EXTENSION DeviceExtension
676 PciFdoIrpCancelStopDevice(
678 IN PIO_STACK_LOCATION IoStackLocation
,
679 IN PPCI_FDO_EXTENSION DeviceExtension
684 PciFdoIrpQueryDeviceRelations(
686 IN PIO_STACK_LOCATION IoStackLocation
,
687 IN PPCI_FDO_EXTENSION DeviceExtension
692 PciFdoIrpQueryInterface(
694 IN PIO_STACK_LOCATION IoStackLocation
,
695 IN PPCI_FDO_EXTENSION DeviceExtension
700 PciFdoIrpQueryCapabilities(
702 IN PIO_STACK_LOCATION IoStackLocation
,
703 IN PPCI_FDO_EXTENSION DeviceExtension
708 PciFdoIrpDeviceUsageNotification(
710 IN PIO_STACK_LOCATION IoStackLocation
,
711 IN PPCI_FDO_EXTENSION DeviceExtension
716 PciFdoIrpSurpriseRemoval(
718 IN PIO_STACK_LOCATION IoStackLocation
,
719 IN PPCI_FDO_EXTENSION DeviceExtension
724 PciFdoIrpQueryLegacyBusInformation(
726 IN PIO_STACK_LOCATION IoStackLocation
,
727 IN PPCI_FDO_EXTENSION DeviceExtension
731 // Device PDO Routines
736 IN PPCI_FDO_EXTENSION DeviceExtension
,
737 IN PCI_SLOT_NUMBER Slot
,
738 OUT PDEVICE_OBJECT
*PdoDeviceObject
745 IN PIO_STACK_LOCATION IoStackLocation
,
746 IN PPCI_PDO_EXTENSION DeviceExtension
753 IN PIO_STACK_LOCATION IoStackLocation
,
754 IN PPCI_PDO_EXTENSION DeviceExtension
761 IN PIO_STACK_LOCATION IoStackLocation
,
762 IN PPCI_PDO_EXTENSION DeviceExtension
767 PciPdoIrpStartDevice(
769 IN PIO_STACK_LOCATION IoStackLocation
,
770 IN PPCI_PDO_EXTENSION DeviceExtension
775 PciPdoIrpQueryRemoveDevice(
777 IN PIO_STACK_LOCATION IoStackLocation
,
778 IN PPCI_PDO_EXTENSION DeviceExtension
783 PciPdoIrpRemoveDevice(
785 IN PIO_STACK_LOCATION IoStackLocation
,
786 IN PPCI_PDO_EXTENSION DeviceExtension
791 PciPdoIrpCancelRemoveDevice(
793 IN PIO_STACK_LOCATION IoStackLocation
,
794 IN PPCI_PDO_EXTENSION DeviceExtension
801 IN PIO_STACK_LOCATION IoStackLocation
,
802 IN PPCI_PDO_EXTENSION DeviceExtension
807 PciPdoIrpQueryStopDevice(
809 IN PIO_STACK_LOCATION IoStackLocation
,
810 IN PPCI_PDO_EXTENSION DeviceExtension
815 PciPdoIrpCancelStopDevice(
817 IN PIO_STACK_LOCATION IoStackLocation
,
818 IN PPCI_PDO_EXTENSION DeviceExtension
823 PciPdoIrpQueryDeviceRelations(
825 IN PIO_STACK_LOCATION IoStackLocation
,
826 IN PPCI_PDO_EXTENSION DeviceExtension
831 PciPdoIrpQueryInterface(
833 IN PIO_STACK_LOCATION IoStackLocation
,
834 IN PPCI_PDO_EXTENSION DeviceExtension
839 PciPdoIrpQueryCapabilities(
841 IN PIO_STACK_LOCATION IoStackLocation
,
842 IN PPCI_PDO_EXTENSION DeviceExtension
847 PciPdoIrpQueryResources(
849 IN PIO_STACK_LOCATION IoStackLocation
,
850 IN PPCI_PDO_EXTENSION DeviceExtension
855 PciPdoIrpQueryResourceRequirements(
857 IN PIO_STACK_LOCATION IoStackLocation
,
858 IN PPCI_PDO_EXTENSION DeviceExtension
863 PciPdoIrpQueryDeviceText(
865 IN PIO_STACK_LOCATION IoStackLocation
,
866 IN PPCI_PDO_EXTENSION DeviceExtension
873 IN PIO_STACK_LOCATION IoStackLocation
,
874 IN PPCI_PDO_EXTENSION DeviceExtension
879 PciPdoIrpWriteConfig(
881 IN PIO_STACK_LOCATION IoStackLocation
,
882 IN PPCI_PDO_EXTENSION DeviceExtension
889 IN PIO_STACK_LOCATION IoStackLocation
,
890 IN PPCI_PDO_EXTENSION DeviceExtension
895 PciPdoIrpQueryDeviceState(
897 IN PIO_STACK_LOCATION IoStackLocation
,
898 IN PPCI_PDO_EXTENSION DeviceExtension
903 PciPdoIrpQueryBusInformation(
905 IN PIO_STACK_LOCATION IoStackLocation
,
906 IN PPCI_PDO_EXTENSION DeviceExtension
911 PciPdoIrpDeviceUsageNotification(
913 IN PIO_STACK_LOCATION IoStackLocation
,
914 IN PPCI_PDO_EXTENSION DeviceExtension
919 PciPdoIrpSurpriseRemoval(
921 IN PIO_STACK_LOCATION IoStackLocation
,
922 IN PPCI_PDO_EXTENSION DeviceExtension
927 PciPdoIrpQueryLegacyBusInformation(
929 IN PIO_STACK_LOCATION IoStackLocation
,
930 IN PPCI_PDO_EXTENSION DeviceExtension
935 // HAL Callback/Hook Routines
944 // PCI Verifier Routines
949 IN PDRIVER_OBJECT DriverObject
954 PciVerifierRetrieveFailureData(
976 PciBuildDefaultExclusionLists(
982 PciUnicodeStringStrStr(
983 IN PUNICODE_STRING InputString
,
984 IN PCUNICODE_STRING EqualString
,
985 IN BOOLEAN CaseInSensitive
993 IN ACCESS_MASK DesiredAccess
,
994 OUT PHANDLE KeyHandle
,
995 OUT PNTSTATUS KeyStatus
1000 PciGetRegistryValue(
1001 IN PWCHAR ValueName
,
1003 IN HANDLE RootHandle
,
1005 OUT PVOID
*OutputBuffer
,
1006 OUT PULONG OutputLength
1011 PciFindParentPciFdoExtension(
1012 IN PDEVICE_OBJECT DeviceObject
,
1018 PciInsertEntryAtTail(
1019 IN PSINGLE_LIST_ENTRY ListHead
,
1020 IN PPCI_FDO_EXTENSION DeviceExtension
,
1026 PciGetDeviceProperty(
1027 IN PDEVICE_OBJECT DeviceObject
,
1028 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
1029 OUT PVOID
*OutputBuffer
1035 IN PDEVICE_OBJECT DeviceObject
,
1036 IN ULONG IoControlCode
,
1037 IN PVOID InputBuffer
,
1038 IN ULONG InputBufferLength
,
1039 IN PVOID OutputBuffer
,
1040 IN ULONG OutputBufferLength
1045 PcipLinkSecondaryExtension(
1046 IN PSINGLE_LIST_ENTRY List
,
1048 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
1049 IN PCI_SIGNATURE ExtensionType
,
1053 PPCI_SECONDARY_EXTENSION
1055 PciFindNextSecondaryExtension(
1056 IN PSINGLE_LIST_ENTRY ListHead
,
1057 IN PCI_SIGNATURE ExtensionType
1065 IN USHORT SubVendorId
,
1066 IN USHORT SubSystemId
,
1072 PciFindPdoByFunction(
1073 IN PPCI_FDO_EXTENSION DeviceExtension
,
1074 IN ULONG FunctionNumber
,
1075 IN PPCI_COMMON_HEADER PciData
1080 PciIsCriticalDeviceClass(
1087 PciIsDeviceOnDebugPath(
1088 IN PPCI_PDO_EXTENSION DeviceExtension
1094 IN PPCI_PDO_EXTENSION DeviceExtension
,
1095 OUT PPCI_COMMON_HEADER PciData
1101 IN PPCI_PDO_EXTENSION DeviceExtension
,
1102 OUT PPCI_COMMON_HEADER PciData
1107 PciReadDeviceCapability(
1108 IN PPCI_PDO_EXTENSION DeviceExtension
,
1110 IN ULONG CapabilityId
,
1111 OUT PPCI_CAPABILITIES_HEADER Buffer
,
1117 PciCanDisableDecodes(
1118 IN PPCI_PDO_EXTENSION DeviceExtension
,
1119 IN PPCI_COMMON_HEADER Config
,
1120 IN ULONGLONG HackFlags
,
1121 IN BOOLEAN ForPowerDown
1126 PciClassifyDeviceType(
1127 IN PPCI_PDO_EXTENSION PdoExtension
1130 KIPI_BROADCAST_WORKER PciExecuteCriticalSystemRoutine
;
1134 PciExecuteCriticalSystemRoutine(
1135 IN ULONG_PTR IpiContext
1140 PciCreateIoDescriptorFromBarLimit(
1141 PIO_RESOURCE_DESCRIPTOR ResourceDescriptor
,
1148 PciIsSlotPresentInParentMethod(
1149 IN PPCI_PDO_EXTENSION PdoExtension
,
1156 IN PPCI_PDO_EXTENSION PdoExtension
,
1163 PciQueryBusInformation(
1164 IN PPCI_PDO_EXTENSION PdoExtension
,
1165 IN PPNP_BUS_INFORMATION
* Buffer
1170 PciQueryCapabilities(
1171 IN PPCI_PDO_EXTENSION PdoExtension
,
1172 IN OUT PDEVICE_CAPABILITIES DeviceCapability
1175 PCM_PARTIAL_RESOURCE_DESCRIPTOR
1177 PciNextPartialDescriptor(
1178 PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor
1182 // Configuration Routines
1186 PciGetConfigHandlers(
1187 IN PPCI_FDO_EXTENSION FdoExtension
1193 IN PPCI_FDO_EXTENSION DeviceExtension
,
1194 IN PCI_SLOT_NUMBER Slot
,
1202 PciWriteDeviceConfig(
1203 IN PPCI_PDO_EXTENSION DeviceExtension
,
1211 PciReadDeviceConfig(
1212 IN PPCI_PDO_EXTENSION DeviceExtension
,
1220 PciGetAdjustedInterruptLine(
1221 IN PPCI_PDO_EXTENSION PdoExtension
1225 // State Machine Logic Transition Routines
1230 IN PPCI_FDO_EXTENSION DeviceExtension
1235 PciBeginStateTransition(
1236 IN PPCI_FDO_EXTENSION DeviceExtension
,
1237 IN PCI_STATE NewState
1242 PciCancelStateTransition(
1243 IN PPCI_FDO_EXTENSION DeviceExtension
,
1244 IN PCI_STATE NewState
1249 PciCommitStateTransition(
1250 IN PPCI_FDO_EXTENSION DeviceExtension
,
1251 IN PCI_STATE NewState
1259 PciInitializeArbiters(
1260 IN PPCI_FDO_EXTENSION FdoExtension
1265 PciInitializeArbiterRanges(
1266 IN PPCI_FDO_EXTENSION DeviceExtension
,
1267 IN PCM_RESOURCE_LIST Resources
1275 PciDebugIrpDispatchDisplay(
1276 IN PIO_STACK_LOCATION IoStackLocation
,
1277 IN PPCI_FDO_EXTENSION DeviceExtension
,
1283 PciDebugDumpCommonConfig(
1284 IN PPCI_COMMON_HEADER PciData
1289 PciDebugDumpQueryCapabilities(
1290 IN PDEVICE_CAPABILITIES DeviceCaps
1295 PciDebugPrintIoResReqList(
1296 IN PIO_RESOURCE_REQUIREMENTS_LIST Requirements
1301 PciDebugPrintCmResList(
1302 IN PCM_RESOURCE_LIST ResourceList
1307 PciDebugPrintPartialResource(
1308 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResource
1312 // Interface Support
1317 IN PPCI_FDO_EXTENSION DeviceExtension
,
1318 IN CONST GUID
* InterfaceType
,
1321 IN PVOID InterfaceData
,
1322 IN PINTERFACE Interface
,
1323 IN BOOLEAN LastChance
1328 PciPmeInterfaceInitializer(
1334 routeintrf_Initializer(
1340 arbusno_Initializer(
1346 agpintrf_Initializer(
1352 tranirq_Initializer(
1358 busintrf_Initializer(
1376 locintrf_Initializer(
1382 pcicbintrf_Initializer(
1388 lddintrf_Initializer(
1394 devpresent_Initializer(
1400 agpintrf_Constructor(
1401 IN PVOID DeviceExtension
,
1403 IN PVOID InterfaceData
,
1406 IN PINTERFACE Interface
1411 arbusno_Constructor(
1412 IN PVOID DeviceExtension
,
1414 IN PVOID InterfaceData
,
1417 IN PINTERFACE Interface
1422 tranirq_Constructor(
1423 IN PVOID DeviceExtension
,
1425 IN PVOID InterfaceData
,
1428 IN PINTERFACE Interface
1434 IN PVOID DeviceExtension
,
1436 IN PVOID InterfaceData
,
1439 IN PINTERFACE Interface
1444 busintrf_Constructor(
1445 IN PVOID DeviceExtension
,
1447 IN PVOID InterfaceData
,
1450 IN PINTERFACE Interface
1456 IN PVOID DeviceExtension
,
1458 IN PVOID InterfaceData
,
1461 IN PINTERFACE Interface
1466 ario_ApplyBrokenVideoHack(
1467 IN PPCI_FDO_EXTENSION FdoExtension
1472 pcicbintrf_Constructor(
1473 IN PVOID DeviceExtension
,
1475 IN PVOID InterfaceData
,
1478 IN PINTERFACE Interface
1483 lddintrf_Constructor(
1484 IN PVOID DeviceExtension
,
1486 IN PVOID InterfaceData
,
1489 IN PINTERFACE Interface
1494 locintrf_Constructor(
1495 IN PVOID DeviceExtension
,
1497 IN PVOID InterfaceData
,
1500 IN PINTERFACE Interface
1505 PciPmeInterfaceConstructor(
1506 IN PVOID DeviceExtension
,
1508 IN PVOID InterfaceData
,
1511 IN PINTERFACE Interface
1516 routeintrf_Constructor(
1517 IN PVOID DeviceExtension
,
1519 IN PVOID InterfaceData
,
1522 IN PINTERFACE Interface
1527 devpresent_Constructor(
1528 IN PVOID DeviceExtension
,
1530 IN PVOID InterfaceData
,
1533 IN PINTERFACE Interface
1537 // PCI Enumeration and Resources
1541 PciQueryDeviceRelations(
1542 IN PPCI_FDO_EXTENSION DeviceExtension
,
1543 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
1549 IN PPCI_PDO_EXTENSION PdoExtension
,
1550 OUT PCM_RESOURCE_LIST
*Buffer
1555 PciQueryTargetDeviceRelations(
1556 IN PPCI_PDO_EXTENSION PdoExtension
,
1557 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
1562 PciQueryEjectionRelations(
1563 IN PPCI_PDO_EXTENSION PdoExtension
,
1564 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
1569 PciQueryRequirements(
1570 IN PPCI_PDO_EXTENSION PdoExtension
,
1571 IN OUT PIO_RESOURCE_REQUIREMENTS_LIST
*RequirementsList
1576 PciComputeNewCurrentSettings(
1577 IN PPCI_PDO_EXTENSION PdoExtension
,
1578 IN PCM_RESOURCE_LIST ResourceList
1584 IN PPCI_PDO_EXTENSION PdoExtension
,
1586 IN BOOLEAN SomethingSomethingDarkSide
1591 PciBuildRequirementsList(
1592 IN PPCI_PDO_EXTENSION PdoExtension
,
1593 IN PPCI_COMMON_HEADER PciData
,
1594 OUT PIO_RESOURCE_REQUIREMENTS_LIST
* Buffer
1598 // Identification Functions
1602 PciGetDeviceDescriptionMessage(
1610 IN PPCI_PDO_EXTENSION PdoExtension
,
1611 IN DEVICE_TEXT_TYPE QueryType
,
1619 IN PPCI_PDO_EXTENSION DeviceExtension
,
1620 IN BUS_QUERY_ID_TYPE QueryType
,
1629 Cardbus_MassageHeaderForLimitsDetermination(
1630 IN PPCI_CONFIGURATOR_CONTEXT Context
1635 Cardbus_SaveCurrentSettings(
1636 IN PPCI_CONFIGURATOR_CONTEXT Context
1642 IN PPCI_CONFIGURATOR_CONTEXT Context
1647 Cardbus_RestoreCurrent(
1648 IN PPCI_CONFIGURATOR_CONTEXT Context
1653 Cardbus_GetAdditionalResourceDescriptors(
1654 IN PPCI_CONFIGURATOR_CONTEXT Context
,
1655 IN PPCI_COMMON_HEADER PciData
,
1656 IN PIO_RESOURCE_DESCRIPTOR IoDescriptor
1661 Cardbus_ResetDevice(
1662 IN PPCI_PDO_EXTENSION PdoExtension
,
1663 IN PPCI_COMMON_HEADER PciData
1668 Cardbus_ChangeResourceSettings(
1669 IN PPCI_PDO_EXTENSION PdoExtension
,
1670 IN PPCI_COMMON_HEADER PciData
1674 // PCI Device Support
1678 Device_MassageHeaderForLimitsDetermination(
1679 IN PPCI_CONFIGURATOR_CONTEXT Context
1684 Device_SaveCurrentSettings(
1685 IN PPCI_CONFIGURATOR_CONTEXT Context
1691 IN PPCI_CONFIGURATOR_CONTEXT Context
1696 Device_RestoreCurrent(
1697 IN PPCI_CONFIGURATOR_CONTEXT Context
1702 Device_GetAdditionalResourceDescriptors(
1703 IN PPCI_CONFIGURATOR_CONTEXT Context
,
1704 IN PPCI_COMMON_HEADER PciData
,
1705 IN PIO_RESOURCE_DESCRIPTOR IoDescriptor
1711 IN PPCI_PDO_EXTENSION PdoExtension
,
1712 IN PPCI_COMMON_HEADER PciData
1717 Device_ChangeResourceSettings(
1718 IN PPCI_PDO_EXTENSION PdoExtension
,
1719 IN PPCI_COMMON_HEADER PciData
1723 // PCI-to-PCI Bridge Device Support
1727 PPBridge_MassageHeaderForLimitsDetermination(
1728 IN PPCI_CONFIGURATOR_CONTEXT Context
1733 PPBridge_SaveCurrentSettings(
1734 IN PPCI_CONFIGURATOR_CONTEXT Context
1739 PPBridge_SaveLimits(
1740 IN PPCI_CONFIGURATOR_CONTEXT Context
1745 PPBridge_RestoreCurrent(
1746 IN PPCI_CONFIGURATOR_CONTEXT Context
1751 PPBridge_GetAdditionalResourceDescriptors(
1752 IN PPCI_CONFIGURATOR_CONTEXT Context
,
1753 IN PPCI_COMMON_HEADER PciData
,
1754 IN PIO_RESOURCE_DESCRIPTOR IoDescriptor
1759 PPBridge_ResetDevice(
1760 IN PPCI_PDO_EXTENSION PdoExtension
,
1761 IN PPCI_COMMON_HEADER PciData
1766 PPBridge_ChangeResourceSettings(
1767 IN PPCI_PDO_EXTENSION PdoExtension
,
1768 IN PPCI_COMMON_HEADER PciData
1772 // Bus Number Routines
1776 PciAreBusNumbersConfigured(
1777 IN PPCI_PDO_EXTENSION PdoExtension
1781 // Routine Interface
1785 PciCacheLegacyDeviceRouting(
1786 IN PDEVICE_OBJECT DeviceObject
,
1788 IN ULONG SlotNumber
,
1789 IN UCHAR InterruptLine
,
1790 IN UCHAR InterruptPin
,
1793 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1794 IN PPCI_PDO_EXTENSION PdoExtension
,
1795 OUT PDEVICE_OBJECT
*pFoundDeviceObject
1799 // External Resources
1801 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
1802 extern KEVENT PciGlobalLock
;
1803 extern PPCI_INTERFACE PciInterfaces
[];
1804 extern PCI_INTERFACE ArbiterInterfaceBusNumber
;
1805 extern PCI_INTERFACE ArbiterInterfaceMemory
;
1806 extern PCI_INTERFACE ArbiterInterfaceIo
;
1807 extern PCI_INTERFACE BusHandlerInterface
;
1808 extern PCI_INTERFACE PciRoutingInterface
;
1809 extern PCI_INTERFACE PciCardbusPrivateInterface
;
1810 extern PCI_INTERFACE PciLegacyDeviceDetectionInterface
;
1811 extern PCI_INTERFACE PciPmeInterface
;
1812 extern PCI_INTERFACE PciDevicePresentInterface
;
1813 //extern PCI_INTERFACE PciNativeIdeInterface;
1814 extern PCI_INTERFACE PciLocationInterface
;
1815 extern PCI_INTERFACE AgpTargetInterface
;
1816 extern PCI_INTERFACE TranslatorInterfaceInterrupt
;
1817 extern PDRIVER_OBJECT PciDriverObject
;
1818 extern PWATCHDOG_TABLE WdTable
;
1819 extern PPCI_HACK_ENTRY PciHackTable
;
1820 extern BOOLEAN PciAssignBusNumbers
;
1821 extern BOOLEAN PciEnableNativeModeATA
;
1822 extern PPCI_IRQ_ROUTING_TABLE PciIrqRoutingTable
;
1823 extern BOOLEAN PciRunningDatacenter
;
1825 /* Exported by NTOS, should this go in the NDK? */
1826 extern NTSYSAPI BOOLEAN InitSafeBootMode
;
1828 #endif /* _PCIX_PCH_ */