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
;
193 // IRP Dispatch Function Type
195 typedef NTSTATUS (NTAPI
*PCI_DISPATCH_FUNCTION
)(
197 IN PIO_STACK_LOCATION IoStackLocation
,
198 IN PPCI_FDO_EXTENSION DeviceExtension
202 // IRP Dispatch Minor Table
204 typedef struct _PCI_MN_DISPATCH_TABLE
206 PCI_DISPATCH_STYLE DispatchStyle
;
207 PCI_DISPATCH_FUNCTION DispatchFunction
;
208 } PCI_MN_DISPATCH_TABLE
, *PPCI_MN_DISPATCH_TABLE
;
211 // IRP Dispatch Major Table
213 typedef struct _PCI_MJ_DISPATCH_TABLE
215 ULONG PnpIrpMaximumMinorFunction
;
216 PPCI_MN_DISPATCH_TABLE PnpIrpDispatchTable
;
217 ULONG PowerIrpMaximumMinorFunction
;
218 PPCI_MN_DISPATCH_TABLE PowerIrpDispatchTable
;
219 PCI_DISPATCH_STYLE SystemControlIrpDispatchStyle
;
220 PCI_DISPATCH_FUNCTION SystemControlIrpDispatchFunction
;
221 PCI_DISPATCH_STYLE OtherIrpDispatchStyle
;
222 PCI_DISPATCH_FUNCTION OtherIrpDispatchFunction
;
223 } PCI_MJ_DISPATCH_TABLE
, *PPCI_MJ_DISPATCH_TABLE
;
226 // Generic PCI Interface Constructor and Initializer
228 struct _PCI_INTERFACE
;
229 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_CONSTRUCTOR
)(
230 IN PVOID DeviceExtension
,
232 IN PVOID InterfaceData
,
235 IN PINTERFACE Interface
238 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_INITIALIZER
)(
243 // Generic PCI Interface (Interface, Translator, Arbiter)
245 typedef struct _PCI_INTERFACE
247 CONST GUID
*InterfaceType
;
253 PCI_SIGNATURE Signature
;
254 PCI_INTERFACE_CONSTRUCTOR Constructor
;
255 PCI_INTERFACE_INITIALIZER Initializer
;
256 } PCI_INTERFACE
, *PPCI_INTERFACE
;
259 // Generic Secondary Extension Instance Header (Interface, Translator, Arbiter)
261 typedef struct PCI_SECONDARY_EXTENSION
263 SINGLE_LIST_ENTRY List
;
264 PCI_SIGNATURE ExtensionType
;
266 } PCI_SECONDARY_EXTENSION
, *PPCI_SECONDARY_EXTENSION
;
269 // PCI Arbiter Instance
271 typedef struct PCI_ARBITER_INSTANCE
273 PCI_SECONDARY_EXTENSION Header
;
274 PPCI_INTERFACE Interface
;
275 PPCI_FDO_EXTENSION BusFdoExtension
;
276 WCHAR InstanceName
[24];
277 //ARBITER_INSTANCE CommonInstance; FIXME: Need Arbiter Headers
278 } PCI_ARBITER_INSTANCE
, *PPCI_ARBITER_INSTANCE
;
281 // IRP Dispatch Routines
286 IN PDEVICE_OBJECT DeviceObject
,
294 IN PIO_STACK_LOCATION IoStackLocation
,
295 IN PPCI_FDO_EXTENSION DeviceExtension
300 PciPassIrpFromFdoToPdo(
301 IN PPCI_FDO_EXTENSION DeviceExtension
,
308 IN PPCI_FDO_EXTENSION DeviceExtension
,
319 IN PIO_STACK_LOCATION IoStackLocation
,
320 IN PPCI_FDO_EXTENSION DeviceExtension
327 IN PIO_STACK_LOCATION IoStackLocation
,
328 IN PPCI_FDO_EXTENSION DeviceExtension
335 IN PIO_STACK_LOCATION IoStackLocation
,
336 IN PPCI_FDO_EXTENSION DeviceExtension
345 IN PDRIVER_OBJECT DriverObject
,
346 IN PDEVICE_OBJECT PhysicalDeviceObject
351 PciFdoIrpStartDevice(
353 IN PIO_STACK_LOCATION IoStackLocation
,
354 IN PPCI_FDO_EXTENSION DeviceExtension
359 PciFdoIrpQueryRemoveDevice(
361 IN PIO_STACK_LOCATION IoStackLocation
,
362 IN PPCI_FDO_EXTENSION DeviceExtension
367 PciFdoIrpRemoveDevice(
369 IN PIO_STACK_LOCATION IoStackLocation
,
370 IN PPCI_FDO_EXTENSION DeviceExtension
375 PciFdoIrpCancelRemoveDevice(
377 IN PIO_STACK_LOCATION IoStackLocation
,
378 IN PPCI_FDO_EXTENSION DeviceExtension
385 IN PIO_STACK_LOCATION IoStackLocation
,
386 IN PPCI_FDO_EXTENSION DeviceExtension
391 PciFdoIrpQueryStopDevice(
393 IN PIO_STACK_LOCATION IoStackLocation
,
394 IN PPCI_FDO_EXTENSION DeviceExtension
399 PciFdoIrpCancelStopDevice(
401 IN PIO_STACK_LOCATION IoStackLocation
,
402 IN PPCI_FDO_EXTENSION DeviceExtension
407 PciFdoIrpQueryDeviceRelations(
409 IN PIO_STACK_LOCATION IoStackLocation
,
410 IN PPCI_FDO_EXTENSION DeviceExtension
415 PciFdoIrpQueryInterface(
417 IN PIO_STACK_LOCATION IoStackLocation
,
418 IN PPCI_FDO_EXTENSION DeviceExtension
423 PciFdoIrpQueryCapabilities(
425 IN PIO_STACK_LOCATION IoStackLocation
,
426 IN PPCI_FDO_EXTENSION DeviceExtension
431 PciFdoIrpDeviceUsageNotification(
433 IN PIO_STACK_LOCATION IoStackLocation
,
434 IN PPCI_FDO_EXTENSION DeviceExtension
439 PciFdoIrpSurpriseRemoval(
441 IN PIO_STACK_LOCATION IoStackLocation
,
442 IN PPCI_FDO_EXTENSION DeviceExtension
447 PciFdoIrpQueryLegacyBusInformation(
449 IN PIO_STACK_LOCATION IoStackLocation
,
450 IN PPCI_FDO_EXTENSION DeviceExtension
454 // HAL Callback/Hook Routines
463 // PCI Verifier Routines
468 IN PDRIVER_OBJECT DriverObject
489 PciBuildDefaultExclusionLists(
495 PciUnicodeStringStrStr(
496 IN PUNICODE_STRING InputString
,
497 IN PCUNICODE_STRING EqualString
,
498 IN BOOLEAN CaseInSensitive
506 IN ACCESS_MASK DesiredAccess
,
507 OUT PHANDLE KeyHandle
,
508 OUT PNTSTATUS KeyStatus
516 IN HANDLE RootHandle
,
518 OUT PVOID
*OutputBuffer
,
519 OUT PULONG OutputLength
524 PciFindParentPciFdoExtension(
525 IN PDEVICE_OBJECT DeviceObject
,
531 PciInsertEntryAtTail(
532 IN PSINGLE_LIST_ENTRY ListHead
,
533 IN PPCI_FDO_EXTENSION DeviceExtension
,
539 PciGetDeviceProperty(
540 IN PDEVICE_OBJECT DeviceObject
,
541 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
542 OUT PVOID
*OutputBuffer
548 IN PDEVICE_OBJECT DeviceObject
,
549 IN ULONG IoControlCode
,
550 IN PVOID InputBuffer
,
551 IN ULONG InputBufferLength
,
552 IN PVOID OutputBuffer
,
553 IN ULONG OutputBufferLength
558 PcipLinkSecondaryExtension(
559 IN PSINGLE_LIST_ENTRY List
,
561 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
562 IN PCI_SIGNATURE ExtensionType
,
566 PPCI_SECONDARY_EXTENSION
568 PciFindNextSecondaryExtension(
569 IN PSINGLE_LIST_ENTRY ListHead
,
570 IN PCI_SIGNATURE ExtensionType
574 // Configuration Routines
578 PciGetConfigHandlers(
579 IN PPCI_FDO_EXTENSION FdoExtension
583 // State Machine Logic Transition Routines
588 IN PPCI_FDO_EXTENSION DeviceExtension
593 PciBeginStateTransition(
594 IN PPCI_FDO_EXTENSION DeviceExtension
,
595 IN PCI_STATE NewState
600 PciCancelStateTransition(
601 IN PPCI_FDO_EXTENSION DeviceExtension
,
602 IN PCI_STATE NewState
607 PciCommitStateTransition(
608 IN PPCI_FDO_EXTENSION DeviceExtension
,
609 IN PCI_STATE NewState
618 PciInitializeArbiters(
619 IN PPCI_FDO_EXTENSION FdoExtension
624 PciInitializeArbiterRanges(
625 IN PPCI_FDO_EXTENSION DeviceExtension
,
626 IN PCM_RESOURCE_LIST Resources
634 PciDebugIrpDispatchDisplay(
635 IN PIO_STACK_LOCATION IoStackLocation
,
636 IN PPCI_FDO_EXTENSION DeviceExtension
,
646 IN PPCI_FDO_EXTENSION DeviceExtension
,
647 IN CONST GUID
* InterfaceType
,
650 IN PVOID InterfaceData
,
651 IN PINTERFACE Interface
,
652 IN BOOLEAN LastChance
657 PciPmeInterfaceInitializer(
663 routeintrf_Initializer(
675 agpintrf_Initializer(
687 busintrf_Initializer(
705 locintrf_Initializer(
711 pcicbintrf_Initializer(
717 lddintrf_Initializer(
723 devpresent_Initializer(
729 agpintrf_Constructor(
730 IN PVOID DeviceExtension
,
732 IN PVOID InterfaceData
,
735 IN PINTERFACE Interface
741 IN PVOID DeviceExtension
,
743 IN PVOID InterfaceData
,
746 IN PINTERFACE Interface
752 IN PVOID DeviceExtension
,
754 IN PVOID InterfaceData
,
757 IN PINTERFACE Interface
763 IN PVOID DeviceExtension
,
765 IN PVOID InterfaceData
,
768 IN PINTERFACE Interface
773 busintrf_Constructor(
774 IN PVOID DeviceExtension
,
776 IN PVOID InterfaceData
,
779 IN PINTERFACE Interface
785 IN PVOID DeviceExtension
,
787 IN PVOID InterfaceData
,
790 IN PINTERFACE Interface
795 pcicbintrf_Constructor(
796 IN PVOID DeviceExtension
,
798 IN PVOID InterfaceData
,
801 IN PINTERFACE Interface
806 lddintrf_Constructor(
807 IN PVOID DeviceExtension
,
809 IN PVOID InterfaceData
,
812 IN PINTERFACE Interface
817 locintrf_Constructor(
818 IN PVOID DeviceExtension
,
820 IN PVOID InterfaceData
,
823 IN PINTERFACE Interface
828 PciPmeInterfaceConstructor(
829 IN PVOID DeviceExtension
,
831 IN PVOID InterfaceData
,
834 IN PINTERFACE Interface
839 routeintrf_Constructor(
840 IN PVOID DeviceExtension
,
842 IN PVOID InterfaceData
,
845 IN PINTERFACE Interface
850 devpresent_Constructor(
851 IN PVOID DeviceExtension
,
853 IN PVOID InterfaceData
,
856 IN PINTERFACE Interface
860 // External Resources
862 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
863 extern KEVENT PciGlobalLock
;
864 extern PPCI_INTERFACE PciInterfaces
[];
865 extern PCI_INTERFACE ArbiterInterfaceBusNumber
;
866 extern PCI_INTERFACE ArbiterInterfaceMemory
;
867 extern PCI_INTERFACE ArbiterInterfaceIo
;
868 extern PCI_INTERFACE BusHandlerInterface
;
869 extern PCI_INTERFACE PciRoutingInterface
;
870 extern PCI_INTERFACE PciCardbusPrivateInterface
;
871 extern PCI_INTERFACE PciLegacyDeviceDetectionInterface
;
872 extern PCI_INTERFACE PciPmeInterface
;
873 extern PCI_INTERFACE PciDevicePresentInterface
;
874 //extern PCI_INTERFACE PciNativeIdeInterface;
875 extern PCI_INTERFACE PciLocationInterface
;
876 extern PCI_INTERFACE AgpTargetInterface
;
877 extern PCI_INTERFACE TranslatorInterfaceInterrupt
;