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 // Device Extension, Interface, Translator and Arbiter Signatures
68 typedef enum _PCI_SIGNATURE
70 PciPdoExtensionType
= 'icP0',
71 PciFdoExtensionType
= 'icP1',
73 PciArb_Memory
= 'icP3',
74 PciArb_Interrupt
= 'icP4',
75 PciArb_BusNumber
= 'icP5',
76 PciTrans_Interrupt
= 'icP6',
77 PciInterface_BusHandler
= 'icP7',
78 PciInterface_IntRouteHandler
= 'icP8',
79 PciInterface_PciCb
= 'icP9',
80 PciInterface_LegacyDeviceDetection
= 'icP:',
81 PciInterface_PmeHandler
= 'icP;',
82 PciInterface_DevicePresent
= 'icP<',
83 PciInterface_NativeIde
= 'icP=',
84 PciInterface_AgpTarget
= 'icP>',
85 PciInterface_Location
= 'icP?'
86 } PCI_SIGNATURE
, *PPCI_SIGNATURE
;
89 // Device Extension Logic States
91 typedef enum _PCI_STATE
98 PciSynchronizedOperation
,
103 // IRP Dispatch Logic Style
105 typedef enum _PCI_DISPATCH_STYLE
111 } PCI_DISPATCH_STYLE
;
114 // PCI Hack Entry Information
116 typedef struct _PCI_HACK_ENTRY
125 } PCI_HACK_ENTRY
, *PPCI_HACK_ENTRY
;
128 // Power State Information for Device Extension
130 typedef struct _PCI_POWER_STATE
132 SYSTEM_POWER_STATE CurrentSystemState
;
133 DEVICE_POWER_STATE CurrentDeviceState
;
134 SYSTEM_POWER_STATE SystemWakeLevel
;
135 DEVICE_POWER_STATE DeviceWakeLevel
;
136 DEVICE_POWER_STATE SystemStateMapping
[7];
138 PVOID SavedCancelRoutine
;
142 } PCI_POWER_STATE
, *PPCI_POWER_STATE
;
145 // Internal PCI Lock Structure
147 typedef struct _PCI_LOCK
151 } PCI_LOCK
, *PPCI_LOCK
;
154 // Device Extension for a Bus FDO
156 typedef struct _PCI_FDO_EXTENSION
158 SINGLE_LIST_ENTRY List
;
160 struct _PCI_MJ_DISPATCH_TABLE
*IrpDispatchTable
;
162 BOOLEAN TentativeNextState
;
163 KEVENT SecondaryExtLock
;
164 PDEVICE_OBJECT PhysicalDeviceObject
;
165 PDEVICE_OBJECT FunctionalDeviceObject
;
166 PDEVICE_OBJECT AttachedDeviceObject
;
167 KEVENT ChildListLock
;
168 struct _PCI_PDO_EXTENSION
*ChildPdoList
;
169 struct _PCI_FDO_EXTENSION
*BusRootFdoExtension
;
170 struct _PCI_FDO_EXTENSION
*ParentFdoExtension
;
171 struct _PCI_PDO_EXTENSION
*ChildBridgePdoList
;
172 PPCI_BUS_INTERFACE_STANDARD PciBusInterface
;
173 BOOLEAN MaxSubordinateBus
;
174 BUS_HANDLER
*BusHandler
;
179 BOOLEAN ArbitersInitialized
;
180 BOOLEAN BrokenVideoHackApplied
;
182 PCI_POWER_STATE PowerState
;
183 SINGLE_LIST_ENTRY SecondaryExtension
;
184 LONG ChildWaitWakeCount
;
185 PPCI_COMMON_CONFIG PreservedConfig
;
190 BOOLEAN CacheLineSize
;
191 BOOLEAN LatencyTimer
;
196 } PCI_FDO_EXTENSION
, *PPCI_FDO_EXTENSION
;
198 typedef struct _PCI_FUNCTION_RESOURCES
200 IO_RESOURCE_DESCRIPTOR Limit
[7];
201 CM_PARTIAL_RESOURCE_DESCRIPTOR Current
[7];
202 } PCI_FUNCTION_RESOURCES
, *PPCI_FUNCTION_RESOURCES
;
204 typedef union _PCI_HEADER_TYPE_DEPENDENT
214 UCHAR SubordinateBus
;
215 UCHAR SubtractiveDecode
:1;
218 UCHAR WeChangedBusNumbers
:1;
219 UCHAR IsaBitRequired
:1;
225 } PCI_HEADER_TYPE_DEPENDENT
, *PPCI_HEADER_TYPE_DEPENDENT
;
227 typedef struct _PCI_PDO_EXTENSION
231 struct _PCI_MJ_DISPATCH_TABLE
*IrpDispatchTable
;
233 BOOLEAN TentativeNextState
;
235 KEVENT SecondaryExtLock
;
236 PCI_SLOT_NUMBER Slot
;
237 PDEVICE_OBJECT PhysicalDeviceObject
;
238 PPCI_FDO_EXTENSION ParentFdoExtension
;
239 SINGLE_LIST_ENTRY SecondaryExtension
;
240 LONG BusInterfaceReferenceCount
;
241 LONG AgpInterfaceReferenceCount
;
244 USHORT SubsystemVendorId
;
250 BOOLEAN AdditionalResourceCount
;
251 BOOLEAN AdjustedInterruptLine
;
252 BOOLEAN InterruptPin
;
253 BOOLEAN RawInterruptLine
;
254 BOOLEAN CapabilitiesPtr
;
255 BOOLEAN SavedLatencyTimer
;
256 BOOLEAN SavedCacheLineSize
;
259 BOOLEAN ReportedMissing
;
260 BOOLEAN ExpectedWritebackFailure
;
261 BOOLEAN NoTouchPmeEnable
;
262 BOOLEAN LegacyDriver
;
263 BOOLEAN UpdateHardware
;
265 BOOLEAN DisablePowerDown
;
266 BOOLEAN NeedsHotPlugConfiguration
;
267 BOOLEAN SwitchedIDEToNativeMode
;
268 BOOLEAN BIOSAllowsIDESwitchToNativeMode
;
269 BOOLEAN IoSpaceUnderNativeIdeControl
;
271 PCI_POWER_STATE PowerState
;
272 PCI_HEADER_TYPE_DEPENDENT Dependent
;
274 PCI_FUNCTION_RESOURCES
*Resources
;
275 PCI_FDO_EXTENSION
*BridgeFdoExtension
;
276 struct _PCI_PDO_EXTENSION
*NextBridge
;
277 struct _PCI_PDO_EXTENSION
*NextHashEntry
;
279 PCI_PMC PowerCapabilities
;
280 BOOLEAN TargetAgpCapabilityId
;
281 USHORT CommandEnables
;
282 USHORT InitialCommand
;
283 } PCI_PDO_EXTENSION
, *PPCI_PDO_EXTENSION
;
286 // IRP Dispatch Function Type
288 typedef NTSTATUS (NTAPI
*PCI_DISPATCH_FUNCTION
)(
290 IN PIO_STACK_LOCATION IoStackLocation
,
291 IN PPCI_FDO_EXTENSION DeviceExtension
295 // IRP Dispatch Minor Table
297 typedef struct _PCI_MN_DISPATCH_TABLE
299 PCI_DISPATCH_STYLE DispatchStyle
;
300 PCI_DISPATCH_FUNCTION DispatchFunction
;
301 } PCI_MN_DISPATCH_TABLE
, *PPCI_MN_DISPATCH_TABLE
;
304 // IRP Dispatch Major Table
306 typedef struct _PCI_MJ_DISPATCH_TABLE
308 ULONG PnpIrpMaximumMinorFunction
;
309 PPCI_MN_DISPATCH_TABLE PnpIrpDispatchTable
;
310 ULONG PowerIrpMaximumMinorFunction
;
311 PPCI_MN_DISPATCH_TABLE PowerIrpDispatchTable
;
312 PCI_DISPATCH_STYLE SystemControlIrpDispatchStyle
;
313 PCI_DISPATCH_FUNCTION SystemControlIrpDispatchFunction
;
314 PCI_DISPATCH_STYLE OtherIrpDispatchStyle
;
315 PCI_DISPATCH_FUNCTION OtherIrpDispatchFunction
;
316 } PCI_MJ_DISPATCH_TABLE
, *PPCI_MJ_DISPATCH_TABLE
;
319 // Generic PCI Interface Constructor and Initializer
321 struct _PCI_INTERFACE
;
322 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_CONSTRUCTOR
)(
323 IN PVOID DeviceExtension
,
325 IN PVOID InterfaceData
,
328 IN PINTERFACE Interface
331 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_INITIALIZER
)(
336 // Generic PCI Interface (Interface, Translator, Arbiter)
338 typedef struct _PCI_INTERFACE
340 CONST GUID
*InterfaceType
;
346 PCI_SIGNATURE Signature
;
347 PCI_INTERFACE_CONSTRUCTOR Constructor
;
348 PCI_INTERFACE_INITIALIZER Initializer
;
349 } PCI_INTERFACE
, *PPCI_INTERFACE
;
352 // Generic Secondary Extension Instance Header (Interface, Translator, Arbiter)
354 typedef struct PCI_SECONDARY_EXTENSION
356 SINGLE_LIST_ENTRY List
;
357 PCI_SIGNATURE ExtensionType
;
359 } PCI_SECONDARY_EXTENSION
, *PPCI_SECONDARY_EXTENSION
;
362 // PCI Arbiter Instance
364 typedef struct PCI_ARBITER_INSTANCE
366 PCI_SECONDARY_EXTENSION Header
;
367 PPCI_INTERFACE Interface
;
368 PPCI_FDO_EXTENSION BusFdoExtension
;
369 WCHAR InstanceName
[24];
370 //ARBITER_INSTANCE CommonInstance; FIXME: Need Arbiter Headers
371 } PCI_ARBITER_INSTANCE
, *PPCI_ARBITER_INSTANCE
;
374 // IRP Dispatch Routines
379 IN PDEVICE_OBJECT DeviceObject
,
387 IN PIO_STACK_LOCATION IoStackLocation
,
388 IN PPCI_FDO_EXTENSION DeviceExtension
393 PciPassIrpFromFdoToPdo(
394 IN PPCI_FDO_EXTENSION DeviceExtension
,
401 IN PPCI_FDO_EXTENSION DeviceExtension
,
412 IN PIO_STACK_LOCATION IoStackLocation
,
413 IN PPCI_FDO_EXTENSION DeviceExtension
420 IN PIO_STACK_LOCATION IoStackLocation
,
421 IN PPCI_FDO_EXTENSION DeviceExtension
428 IN PIO_STACK_LOCATION IoStackLocation
,
429 IN PPCI_FDO_EXTENSION DeviceExtension
438 IN PDRIVER_OBJECT DriverObject
,
439 IN PDEVICE_OBJECT PhysicalDeviceObject
444 PciFdoIrpStartDevice(
446 IN PIO_STACK_LOCATION IoStackLocation
,
447 IN PPCI_FDO_EXTENSION DeviceExtension
452 PciFdoIrpQueryRemoveDevice(
454 IN PIO_STACK_LOCATION IoStackLocation
,
455 IN PPCI_FDO_EXTENSION DeviceExtension
460 PciFdoIrpRemoveDevice(
462 IN PIO_STACK_LOCATION IoStackLocation
,
463 IN PPCI_FDO_EXTENSION DeviceExtension
468 PciFdoIrpCancelRemoveDevice(
470 IN PIO_STACK_LOCATION IoStackLocation
,
471 IN PPCI_FDO_EXTENSION DeviceExtension
478 IN PIO_STACK_LOCATION IoStackLocation
,
479 IN PPCI_FDO_EXTENSION DeviceExtension
484 PciFdoIrpQueryStopDevice(
486 IN PIO_STACK_LOCATION IoStackLocation
,
487 IN PPCI_FDO_EXTENSION DeviceExtension
492 PciFdoIrpCancelStopDevice(
494 IN PIO_STACK_LOCATION IoStackLocation
,
495 IN PPCI_FDO_EXTENSION DeviceExtension
500 PciFdoIrpQueryDeviceRelations(
502 IN PIO_STACK_LOCATION IoStackLocation
,
503 IN PPCI_FDO_EXTENSION DeviceExtension
508 PciFdoIrpQueryInterface(
510 IN PIO_STACK_LOCATION IoStackLocation
,
511 IN PPCI_FDO_EXTENSION DeviceExtension
516 PciFdoIrpQueryCapabilities(
518 IN PIO_STACK_LOCATION IoStackLocation
,
519 IN PPCI_FDO_EXTENSION DeviceExtension
524 PciFdoIrpDeviceUsageNotification(
526 IN PIO_STACK_LOCATION IoStackLocation
,
527 IN PPCI_FDO_EXTENSION DeviceExtension
532 PciFdoIrpSurpriseRemoval(
534 IN PIO_STACK_LOCATION IoStackLocation
,
535 IN PPCI_FDO_EXTENSION DeviceExtension
540 PciFdoIrpQueryLegacyBusInformation(
542 IN PIO_STACK_LOCATION IoStackLocation
,
543 IN PPCI_FDO_EXTENSION DeviceExtension
547 // HAL Callback/Hook Routines
556 // PCI Verifier Routines
561 IN PDRIVER_OBJECT DriverObject
582 PciBuildDefaultExclusionLists(
588 PciUnicodeStringStrStr(
589 IN PUNICODE_STRING InputString
,
590 IN PCUNICODE_STRING EqualString
,
591 IN BOOLEAN CaseInSensitive
599 IN ACCESS_MASK DesiredAccess
,
600 OUT PHANDLE KeyHandle
,
601 OUT PNTSTATUS KeyStatus
609 IN HANDLE RootHandle
,
611 OUT PVOID
*OutputBuffer
,
612 OUT PULONG OutputLength
617 PciFindParentPciFdoExtension(
618 IN PDEVICE_OBJECT DeviceObject
,
624 PciInsertEntryAtTail(
625 IN PSINGLE_LIST_ENTRY ListHead
,
626 IN PPCI_FDO_EXTENSION DeviceExtension
,
632 PciGetDeviceProperty(
633 IN PDEVICE_OBJECT DeviceObject
,
634 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
635 OUT PVOID
*OutputBuffer
641 IN PDEVICE_OBJECT DeviceObject
,
642 IN ULONG IoControlCode
,
643 IN PVOID InputBuffer
,
644 IN ULONG InputBufferLength
,
645 IN PVOID OutputBuffer
,
646 IN ULONG OutputBufferLength
651 PcipLinkSecondaryExtension(
652 IN PSINGLE_LIST_ENTRY List
,
654 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
655 IN PCI_SIGNATURE ExtensionType
,
659 PPCI_SECONDARY_EXTENSION
661 PciFindNextSecondaryExtension(
662 IN PSINGLE_LIST_ENTRY ListHead
,
663 IN PCI_SIGNATURE ExtensionType
671 IN USHORT SubVendorId
,
672 IN USHORT SubSystemId
,
678 PciFindPdoByFunction(
679 IN PPCI_FDO_EXTENSION DeviceExtension
,
680 IN ULONG FunctionNumber
,
681 IN PPCI_COMMON_HEADER PciData
686 PciIsCriticalDeviceClass(
692 // Configuration Routines
696 PciGetConfigHandlers(
697 IN PPCI_FDO_EXTENSION FdoExtension
703 IN PPCI_FDO_EXTENSION DeviceExtension
,
704 IN PCI_SLOT_NUMBER Slot
,
711 // State Machine Logic Transition Routines
716 IN PPCI_FDO_EXTENSION DeviceExtension
721 PciBeginStateTransition(
722 IN PPCI_FDO_EXTENSION DeviceExtension
,
723 IN PCI_STATE NewState
728 PciCancelStateTransition(
729 IN PPCI_FDO_EXTENSION DeviceExtension
,
730 IN PCI_STATE NewState
735 PciCommitStateTransition(
736 IN PPCI_FDO_EXTENSION DeviceExtension
,
737 IN PCI_STATE NewState
746 PciInitializeArbiters(
747 IN PPCI_FDO_EXTENSION FdoExtension
752 PciInitializeArbiterRanges(
753 IN PPCI_FDO_EXTENSION DeviceExtension
,
754 IN PCM_RESOURCE_LIST Resources
762 PciDebugIrpDispatchDisplay(
763 IN PIO_STACK_LOCATION IoStackLocation
,
764 IN PPCI_FDO_EXTENSION DeviceExtension
,
770 PciDebugDumpCommonConfig(
771 IN PPCI_COMMON_HEADER PciData
780 IN PPCI_FDO_EXTENSION DeviceExtension
,
781 IN CONST GUID
* InterfaceType
,
784 IN PVOID InterfaceData
,
785 IN PINTERFACE Interface
,
786 IN BOOLEAN LastChance
791 PciPmeInterfaceInitializer(
797 routeintrf_Initializer(
809 agpintrf_Initializer(
821 busintrf_Initializer(
839 locintrf_Initializer(
845 pcicbintrf_Initializer(
851 lddintrf_Initializer(
857 devpresent_Initializer(
863 agpintrf_Constructor(
864 IN PVOID DeviceExtension
,
866 IN PVOID InterfaceData
,
869 IN PINTERFACE Interface
875 IN PVOID DeviceExtension
,
877 IN PVOID InterfaceData
,
880 IN PINTERFACE Interface
886 IN PVOID DeviceExtension
,
888 IN PVOID InterfaceData
,
891 IN PINTERFACE Interface
897 IN PVOID DeviceExtension
,
899 IN PVOID InterfaceData
,
902 IN PINTERFACE Interface
907 busintrf_Constructor(
908 IN PVOID DeviceExtension
,
910 IN PVOID InterfaceData
,
913 IN PINTERFACE Interface
919 IN PVOID DeviceExtension
,
921 IN PVOID InterfaceData
,
924 IN PINTERFACE Interface
929 pcicbintrf_Constructor(
930 IN PVOID DeviceExtension
,
932 IN PVOID InterfaceData
,
935 IN PINTERFACE Interface
940 lddintrf_Constructor(
941 IN PVOID DeviceExtension
,
943 IN PVOID InterfaceData
,
946 IN PINTERFACE Interface
951 locintrf_Constructor(
952 IN PVOID DeviceExtension
,
954 IN PVOID InterfaceData
,
957 IN PINTERFACE Interface
962 PciPmeInterfaceConstructor(
963 IN PVOID DeviceExtension
,
965 IN PVOID InterfaceData
,
968 IN PINTERFACE Interface
973 routeintrf_Constructor(
974 IN PVOID DeviceExtension
,
976 IN PVOID InterfaceData
,
979 IN PINTERFACE Interface
984 devpresent_Constructor(
985 IN PVOID DeviceExtension
,
987 IN PVOID InterfaceData
,
990 IN PINTERFACE Interface
994 // PCI Enumeration and Resources
998 PciQueryDeviceRelations(
999 IN PPCI_FDO_EXTENSION DeviceExtension
,
1000 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
1004 // Identification Functions
1008 PciGetDeviceDescriptionMessage(
1014 // External Resources
1016 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
1017 extern KEVENT PciGlobalLock
;
1018 extern PPCI_INTERFACE PciInterfaces
[];
1019 extern PCI_INTERFACE ArbiterInterfaceBusNumber
;
1020 extern PCI_INTERFACE ArbiterInterfaceMemory
;
1021 extern PCI_INTERFACE ArbiterInterfaceIo
;
1022 extern PCI_INTERFACE BusHandlerInterface
;
1023 extern PCI_INTERFACE PciRoutingInterface
;
1024 extern PCI_INTERFACE PciCardbusPrivateInterface
;
1025 extern PCI_INTERFACE PciLegacyDeviceDetectionInterface
;
1026 extern PCI_INTERFACE PciPmeInterface
;
1027 extern PCI_INTERFACE PciDevicePresentInterface
;
1028 //extern PCI_INTERFACE PciNativeIdeInterface;
1029 extern PCI_INTERFACE PciLocationInterface
;
1030 extern PCI_INTERFACE AgpTargetInterface
;
1031 extern PCI_INTERFACE TranslatorInterfaceInterrupt
;
1032 extern PDRIVER_OBJECT PciDriverObject
;
1033 extern PWATCHDOG_TABLE WdTable
;
1034 extern PPCI_HACK_ENTRY PciHackTable
;