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 // Device Extension, Interface, Translator and Arbiter Signatures
62 typedef enum _PCI_SIGNATURE
64 PciPdoExtensionType
= 'icP0',
65 PciFdoExtensionType
= 'icP1',
67 PciArb_Memory
= 'icP3',
68 PciArb_Interrupt
= 'icP4',
69 PciArb_BusNumber
= 'icP5',
70 PciTrans_Interrupt
= 'icP6',
71 PciInterface_BusHandler
= 'icP7',
72 PciInterface_IntRouteHandler
= 'icP8',
73 PciInterface_PciCb
= 'icP9',
74 PciInterface_LegacyDeviceDetection
= 'icP:',
75 PciInterface_PmeHandler
= 'icP;',
76 PciInterface_DevicePresent
= 'icP<',
77 PciInterface_NativeIde
= 'icP=',
78 PciInterface_AgpTarget
= 'icP>',
79 PciInterface_Location
= 'icP?'
80 } PCI_SIGNATURE
, *PPCI_SIGNATURE
;
83 // Device Extension Logic States
85 typedef enum _PCI_STATE
92 PciSynchronizedOperation
,
97 // IRP Dispatch Logic Style
99 typedef enum _PCI_DISPATCH_STYLE
105 } PCI_DISPATCH_STYLE
;
108 // PCI Hack Entry Information
110 typedef struct _PCI_HACK_ENTRY
119 } PCI_HACK_ENTRY
, *PPCI_HACK_ENTRY
;
122 // Power State Information for Device Extension
124 typedef struct _PCI_POWER_STATE
126 SYSTEM_POWER_STATE CurrentSystemState
;
127 DEVICE_POWER_STATE CurrentDeviceState
;
128 SYSTEM_POWER_STATE SystemWakeLevel
;
129 DEVICE_POWER_STATE DeviceWakeLevel
;
130 DEVICE_POWER_STATE SystemStateMapping
[7];
132 PVOID SavedCancelRoutine
;
136 } PCI_POWER_STATE
, *PPCI_POWER_STATE
;
139 // Internal PCI Lock Structure
141 typedef struct _PCI_LOCK
145 } PCI_LOCK
, *PPCI_LOCK
;
148 // Device Extension for a Bus FDO
150 typedef struct _PCI_FDO_EXTENSION
152 SINGLE_LIST_ENTRY List
;
154 struct _PCI_MJ_DISPATCH_TABLE
*IrpDispatchTable
;
156 BOOLEAN TentativeNextState
;
157 KEVENT SecondaryExtLock
;
158 PDEVICE_OBJECT PhysicalDeviceObject
;
159 PDEVICE_OBJECT FunctionalDeviceObject
;
160 PDEVICE_OBJECT AttachedDeviceObject
;
161 KEVENT ChildListLock
;
162 struct _PCI_PDO_EXTENSION
*ChildPdoList
;
163 struct _PCI_FDO_EXTENSION
*BusRootFdoExtension
;
164 struct _PCI_FDO_EXTENSION
*ParentFdoExtension
;
165 struct _PCI_PDO_EXTENSION
*ChildBridgePdoList
;
166 PPCI_BUS_INTERFACE_STANDARD PciBusInterface
;
167 BOOLEAN MaxSubordinateBus
;
168 BUS_HANDLER
*BusHandler
;
173 BOOLEAN ArbitersInitialized
;
174 BOOLEAN BrokenVideoHackApplied
;
176 PCI_POWER_STATE PowerState
;
177 SINGLE_LIST_ENTRY SecondaryExtension
;
178 LONG ChildWaitWakeCount
;
179 PPCI_COMMON_CONFIG PreservedConfig
;
184 BOOLEAN CacheLineSize
;
185 BOOLEAN LatencyTimer
;
190 } PCI_FDO_EXTENSION
, *PPCI_FDO_EXTENSION
;
192 typedef struct _PCI_FUNCTION_RESOURCES
194 IO_RESOURCE_DESCRIPTOR Limit
[7];
195 CM_PARTIAL_RESOURCE_DESCRIPTOR Current
[7];
196 } PCI_FUNCTION_RESOURCES
, *PPCI_FUNCTION_RESOURCES
;
198 typedef union _PCI_HEADER_TYPE_DEPENDENT
208 UCHAR SubordinateBus
;
209 UCHAR SubtractiveDecode
:1;
212 UCHAR WeChangedBusNumbers
:1;
213 UCHAR IsaBitRequired
:1;
219 } PCI_HEADER_TYPE_DEPENDENT
, *PPCI_HEADER_TYPE_DEPENDENT
;
221 typedef struct _PCI_PDO_EXTENSION
225 struct _PCI_MJ_DISPATCH_TABLE
*IrpDispatchTable
;
227 BOOLEAN TentativeNextState
;
229 KEVENT SecondaryExtLock
;
230 PCI_SLOT_NUMBER Slot
;
231 PDEVICE_OBJECT PhysicalDeviceObject
;
232 PPCI_FDO_EXTENSION ParentFdoExtension
;
233 SINGLE_LIST_ENTRY SecondaryExtension
;
234 LONG BusInterfaceReferenceCount
;
235 LONG AgpInterfaceReferenceCount
;
238 USHORT SubsystemVendorId
;
244 BOOLEAN AdditionalResourceCount
;
245 BOOLEAN AdjustedInterruptLine
;
246 BOOLEAN InterruptPin
;
247 BOOLEAN RawInterruptLine
;
248 BOOLEAN CapabilitiesPtr
;
249 BOOLEAN SavedLatencyTimer
;
250 BOOLEAN SavedCacheLineSize
;
253 BOOLEAN ReportedMissing
;
254 BOOLEAN ExpectedWritebackFailure
;
255 BOOLEAN NoTouchPmeEnable
;
256 BOOLEAN LegacyDriver
;
257 BOOLEAN UpdateHardware
;
259 BOOLEAN DisablePowerDown
;
260 BOOLEAN NeedsHotPlugConfiguration
;
261 BOOLEAN SwitchedIDEToNativeMode
;
262 BOOLEAN BIOSAllowsIDESwitchToNativeMode
;
263 BOOLEAN IoSpaceUnderNativeIdeControl
;
265 PCI_POWER_STATE PowerState
;
266 PCI_HEADER_TYPE_DEPENDENT Dependent
;
268 PCI_FUNCTION_RESOURCES
*Resources
;
269 PCI_FDO_EXTENSION
*BridgeFdoExtension
;
270 struct _PCI_PDO_EXTENSION
*NextBridge
;
271 struct _PCI_PDO_EXTENSION
*NextHashEntry
;
273 PCI_PMC PowerCapabilities
;
274 BOOLEAN TargetAgpCapabilityId
;
275 USHORT CommandEnables
;
276 USHORT InitialCommand
;
277 } PCI_PDO_EXTENSION
, *PPCI_PDO_EXTENSION
;
280 // IRP Dispatch Function Type
282 typedef NTSTATUS (NTAPI
*PCI_DISPATCH_FUNCTION
)(
284 IN PIO_STACK_LOCATION IoStackLocation
,
285 IN PPCI_FDO_EXTENSION DeviceExtension
289 // IRP Dispatch Minor Table
291 typedef struct _PCI_MN_DISPATCH_TABLE
293 PCI_DISPATCH_STYLE DispatchStyle
;
294 PCI_DISPATCH_FUNCTION DispatchFunction
;
295 } PCI_MN_DISPATCH_TABLE
, *PPCI_MN_DISPATCH_TABLE
;
298 // IRP Dispatch Major Table
300 typedef struct _PCI_MJ_DISPATCH_TABLE
302 ULONG PnpIrpMaximumMinorFunction
;
303 PPCI_MN_DISPATCH_TABLE PnpIrpDispatchTable
;
304 ULONG PowerIrpMaximumMinorFunction
;
305 PPCI_MN_DISPATCH_TABLE PowerIrpDispatchTable
;
306 PCI_DISPATCH_STYLE SystemControlIrpDispatchStyle
;
307 PCI_DISPATCH_FUNCTION SystemControlIrpDispatchFunction
;
308 PCI_DISPATCH_STYLE OtherIrpDispatchStyle
;
309 PCI_DISPATCH_FUNCTION OtherIrpDispatchFunction
;
310 } PCI_MJ_DISPATCH_TABLE
, *PPCI_MJ_DISPATCH_TABLE
;
313 // Generic PCI Interface Constructor and Initializer
315 struct _PCI_INTERFACE
;
316 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_CONSTRUCTOR
)(
317 IN PVOID DeviceExtension
,
319 IN PVOID InterfaceData
,
322 IN PINTERFACE Interface
325 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_INITIALIZER
)(
330 // Generic PCI Interface (Interface, Translator, Arbiter)
332 typedef struct _PCI_INTERFACE
334 CONST GUID
*InterfaceType
;
340 PCI_SIGNATURE Signature
;
341 PCI_INTERFACE_CONSTRUCTOR Constructor
;
342 PCI_INTERFACE_INITIALIZER Initializer
;
343 } PCI_INTERFACE
, *PPCI_INTERFACE
;
346 // Generic Secondary Extension Instance Header (Interface, Translator, Arbiter)
348 typedef struct PCI_SECONDARY_EXTENSION
350 SINGLE_LIST_ENTRY List
;
351 PCI_SIGNATURE ExtensionType
;
353 } PCI_SECONDARY_EXTENSION
, *PPCI_SECONDARY_EXTENSION
;
356 // PCI Arbiter Instance
358 typedef struct PCI_ARBITER_INSTANCE
360 PCI_SECONDARY_EXTENSION Header
;
361 PPCI_INTERFACE Interface
;
362 PPCI_FDO_EXTENSION BusFdoExtension
;
363 WCHAR InstanceName
[24];
364 //ARBITER_INSTANCE CommonInstance; FIXME: Need Arbiter Headers
365 } PCI_ARBITER_INSTANCE
, *PPCI_ARBITER_INSTANCE
;
368 // IRP Dispatch Routines
373 IN PDEVICE_OBJECT DeviceObject
,
381 IN PIO_STACK_LOCATION IoStackLocation
,
382 IN PPCI_FDO_EXTENSION DeviceExtension
387 PciPassIrpFromFdoToPdo(
388 IN PPCI_FDO_EXTENSION DeviceExtension
,
395 IN PPCI_FDO_EXTENSION DeviceExtension
,
406 IN PIO_STACK_LOCATION IoStackLocation
,
407 IN PPCI_FDO_EXTENSION DeviceExtension
414 IN PIO_STACK_LOCATION IoStackLocation
,
415 IN PPCI_FDO_EXTENSION DeviceExtension
422 IN PIO_STACK_LOCATION IoStackLocation
,
423 IN PPCI_FDO_EXTENSION DeviceExtension
432 IN PDRIVER_OBJECT DriverObject
,
433 IN PDEVICE_OBJECT PhysicalDeviceObject
438 PciFdoIrpStartDevice(
440 IN PIO_STACK_LOCATION IoStackLocation
,
441 IN PPCI_FDO_EXTENSION DeviceExtension
446 PciFdoIrpQueryRemoveDevice(
448 IN PIO_STACK_LOCATION IoStackLocation
,
449 IN PPCI_FDO_EXTENSION DeviceExtension
454 PciFdoIrpRemoveDevice(
456 IN PIO_STACK_LOCATION IoStackLocation
,
457 IN PPCI_FDO_EXTENSION DeviceExtension
462 PciFdoIrpCancelRemoveDevice(
464 IN PIO_STACK_LOCATION IoStackLocation
,
465 IN PPCI_FDO_EXTENSION DeviceExtension
472 IN PIO_STACK_LOCATION IoStackLocation
,
473 IN PPCI_FDO_EXTENSION DeviceExtension
478 PciFdoIrpQueryStopDevice(
480 IN PIO_STACK_LOCATION IoStackLocation
,
481 IN PPCI_FDO_EXTENSION DeviceExtension
486 PciFdoIrpCancelStopDevice(
488 IN PIO_STACK_LOCATION IoStackLocation
,
489 IN PPCI_FDO_EXTENSION DeviceExtension
494 PciFdoIrpQueryDeviceRelations(
496 IN PIO_STACK_LOCATION IoStackLocation
,
497 IN PPCI_FDO_EXTENSION DeviceExtension
502 PciFdoIrpQueryInterface(
504 IN PIO_STACK_LOCATION IoStackLocation
,
505 IN PPCI_FDO_EXTENSION DeviceExtension
510 PciFdoIrpQueryCapabilities(
512 IN PIO_STACK_LOCATION IoStackLocation
,
513 IN PPCI_FDO_EXTENSION DeviceExtension
518 PciFdoIrpDeviceUsageNotification(
520 IN PIO_STACK_LOCATION IoStackLocation
,
521 IN PPCI_FDO_EXTENSION DeviceExtension
526 PciFdoIrpSurpriseRemoval(
528 IN PIO_STACK_LOCATION IoStackLocation
,
529 IN PPCI_FDO_EXTENSION DeviceExtension
534 PciFdoIrpQueryLegacyBusInformation(
536 IN PIO_STACK_LOCATION IoStackLocation
,
537 IN PPCI_FDO_EXTENSION DeviceExtension
541 // HAL Callback/Hook Routines
550 // PCI Verifier Routines
555 IN PDRIVER_OBJECT DriverObject
576 PciBuildDefaultExclusionLists(
582 PciUnicodeStringStrStr(
583 IN PUNICODE_STRING InputString
,
584 IN PCUNICODE_STRING EqualString
,
585 IN BOOLEAN CaseInSensitive
593 IN ACCESS_MASK DesiredAccess
,
594 OUT PHANDLE KeyHandle
,
595 OUT PNTSTATUS KeyStatus
603 IN HANDLE RootHandle
,
605 OUT PVOID
*OutputBuffer
,
606 OUT PULONG OutputLength
611 PciFindParentPciFdoExtension(
612 IN PDEVICE_OBJECT DeviceObject
,
618 PciInsertEntryAtTail(
619 IN PSINGLE_LIST_ENTRY ListHead
,
620 IN PPCI_FDO_EXTENSION DeviceExtension
,
626 PciGetDeviceProperty(
627 IN PDEVICE_OBJECT DeviceObject
,
628 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
629 OUT PVOID
*OutputBuffer
635 IN PDEVICE_OBJECT DeviceObject
,
636 IN ULONG IoControlCode
,
637 IN PVOID InputBuffer
,
638 IN ULONG InputBufferLength
,
639 IN PVOID OutputBuffer
,
640 IN ULONG OutputBufferLength
645 PcipLinkSecondaryExtension(
646 IN PSINGLE_LIST_ENTRY List
,
648 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
649 IN PCI_SIGNATURE ExtensionType
,
653 PPCI_SECONDARY_EXTENSION
655 PciFindNextSecondaryExtension(
656 IN PSINGLE_LIST_ENTRY ListHead
,
657 IN PCI_SIGNATURE ExtensionType
661 // Configuration Routines
665 PciGetConfigHandlers(
666 IN PPCI_FDO_EXTENSION FdoExtension
672 IN PPCI_FDO_EXTENSION DeviceExtension
,
673 IN PCI_SLOT_NUMBER Slot
,
680 // State Machine Logic Transition Routines
685 IN PPCI_FDO_EXTENSION DeviceExtension
690 PciBeginStateTransition(
691 IN PPCI_FDO_EXTENSION DeviceExtension
,
692 IN PCI_STATE NewState
697 PciCancelStateTransition(
698 IN PPCI_FDO_EXTENSION DeviceExtension
,
699 IN PCI_STATE NewState
704 PciCommitStateTransition(
705 IN PPCI_FDO_EXTENSION DeviceExtension
,
706 IN PCI_STATE NewState
715 PciInitializeArbiters(
716 IN PPCI_FDO_EXTENSION FdoExtension
721 PciInitializeArbiterRanges(
722 IN PPCI_FDO_EXTENSION DeviceExtension
,
723 IN PCM_RESOURCE_LIST Resources
731 PciDebugIrpDispatchDisplay(
732 IN PIO_STACK_LOCATION IoStackLocation
,
733 IN PPCI_FDO_EXTENSION DeviceExtension
,
739 PciDebugDumpCommonConfig(
740 IN PPCI_COMMON_HEADER PciData
749 IN PPCI_FDO_EXTENSION DeviceExtension
,
750 IN CONST GUID
* InterfaceType
,
753 IN PVOID InterfaceData
,
754 IN PINTERFACE Interface
,
755 IN BOOLEAN LastChance
760 PciPmeInterfaceInitializer(
766 routeintrf_Initializer(
778 agpintrf_Initializer(
790 busintrf_Initializer(
808 locintrf_Initializer(
814 pcicbintrf_Initializer(
820 lddintrf_Initializer(
826 devpresent_Initializer(
832 agpintrf_Constructor(
833 IN PVOID DeviceExtension
,
835 IN PVOID InterfaceData
,
838 IN PINTERFACE Interface
844 IN PVOID DeviceExtension
,
846 IN PVOID InterfaceData
,
849 IN PINTERFACE Interface
855 IN PVOID DeviceExtension
,
857 IN PVOID InterfaceData
,
860 IN PINTERFACE Interface
866 IN PVOID DeviceExtension
,
868 IN PVOID InterfaceData
,
871 IN PINTERFACE Interface
876 busintrf_Constructor(
877 IN PVOID DeviceExtension
,
879 IN PVOID InterfaceData
,
882 IN PINTERFACE Interface
888 IN PVOID DeviceExtension
,
890 IN PVOID InterfaceData
,
893 IN PINTERFACE Interface
898 pcicbintrf_Constructor(
899 IN PVOID DeviceExtension
,
901 IN PVOID InterfaceData
,
904 IN PINTERFACE Interface
909 lddintrf_Constructor(
910 IN PVOID DeviceExtension
,
912 IN PVOID InterfaceData
,
915 IN PINTERFACE Interface
920 locintrf_Constructor(
921 IN PVOID DeviceExtension
,
923 IN PVOID InterfaceData
,
926 IN PINTERFACE Interface
931 PciPmeInterfaceConstructor(
932 IN PVOID DeviceExtension
,
934 IN PVOID InterfaceData
,
937 IN PINTERFACE Interface
942 routeintrf_Constructor(
943 IN PVOID DeviceExtension
,
945 IN PVOID InterfaceData
,
948 IN PINTERFACE Interface
953 devpresent_Constructor(
954 IN PVOID DeviceExtension
,
956 IN PVOID InterfaceData
,
959 IN PINTERFACE Interface
963 // PCI Enumeration and Resources
967 PciQueryDeviceRelations(
968 IN PPCI_FDO_EXTENSION DeviceExtension
,
969 IN OUT PDEVICE_RELATIONS
*pDeviceRelations
973 // Identification Functions
977 PciGetDeviceDescriptionMessage(
983 // External Resources
985 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
986 extern KEVENT PciGlobalLock
;
987 extern PPCI_INTERFACE PciInterfaces
[];
988 extern PCI_INTERFACE ArbiterInterfaceBusNumber
;
989 extern PCI_INTERFACE ArbiterInterfaceMemory
;
990 extern PCI_INTERFACE ArbiterInterfaceIo
;
991 extern PCI_INTERFACE BusHandlerInterface
;
992 extern PCI_INTERFACE PciRoutingInterface
;
993 extern PCI_INTERFACE PciCardbusPrivateInterface
;
994 extern PCI_INTERFACE PciLegacyDeviceDetectionInterface
;
995 extern PCI_INTERFACE PciPmeInterface
;
996 extern PCI_INTERFACE PciDevicePresentInterface
;
997 //extern PCI_INTERFACE PciNativeIdeInterface;
998 extern PCI_INTERFACE PciLocationInterface
;
999 extern PCI_INTERFACE AgpTargetInterface
;
1000 extern PCI_INTERFACE TranslatorInterfaceInterrupt
;
1001 extern PDRIVER_OBJECT PciDriverObject
;
1002 extern PWATCHDOG_TABLE WdTable
;