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 // Device Extension, Interface, Translator and Arbiter Signatures
55 typedef enum _PCI_SIGNATURE
57 PciPdoExtensionType
= '0Pci',
58 PciFdoExtensionType
= '1Pci',
60 PciArb_Memory
= '3Pci',
61 PciArb_Interrupt
= '4Pci',
62 PciArb_BusNumber
= '5Pci',
63 PciTrans_Interrupt
= '6Pci',
64 PciInterface_BusHandler
= '7Pci',
65 PciInterface_IntRouteHandler
= '8Pci',
66 PciInterface_PciCb
= '9Pci',
67 PciInterface_LegacyDeviceDetection
= ':Pci',
68 PciInterface_PmeHandler
= ';Pci',
69 PciInterface_DevicePresent
= '<Pci',
70 PciInterface_NativeIde
= '=Pci',
71 PciInterface_AgpTarget
= '>Pci',
72 PciInterface_Location
= '?Pci'
73 } PCI_SIGNATURE
, *PPCI_SIGNATURE
;
76 // Device Extension Logic States
78 typedef enum _PCI_STATE
85 PciSynchronizedOperation
,
90 // IRP Dispatch Logic Style
92 typedef enum _PCI_DISPATCH_STYLE
101 // PCI Hack Entry Information
103 typedef struct _PCI_HACK_ENTRY
112 } PCI_HACK_ENTRY
, *PPCI_HACK_ENTRY
;
115 // Power State Information for Device Extension
117 typedef struct _PCI_POWER_STATE
119 SYSTEM_POWER_STATE CurrentSystemState
;
120 DEVICE_POWER_STATE CurrentDeviceState
;
121 SYSTEM_POWER_STATE SystemWakeLevel
;
122 DEVICE_POWER_STATE DeviceWakeLevel
;
123 DEVICE_POWER_STATE SystemStateMapping
[7];
125 PVOID SavedCancelRoutine
;
129 } PCI_POWER_STATE
, *PPCI_POWER_STATE
;
132 // Internal PCI Lock Structure
134 typedef struct _PCI_LOCK
138 } PCI_LOCK
, *PPCI_LOCK
;
141 // Device Extension for a Bus FDO
143 typedef struct _PCI_FDO_EXTENSION
145 SINGLE_LIST_ENTRY List
;
147 struct _PCI_MJ_DISPATCH_TABLE
*IrpDispatchTable
;
149 BOOLEAN TentativeNextState
;
150 KEVENT SecondaryExtLock
;
151 PDEVICE_OBJECT PhysicalDeviceObject
;
152 PDEVICE_OBJECT FunctionalDeviceObject
;
153 PDEVICE_OBJECT AttachedDeviceObject
;
154 KEVENT ChildListLock
;
155 struct _PCI_PDO_EXTENSION
*ChildPdoList
;
156 struct _PCI_FDO_EXTENSION
*BusRootFdoExtension
;
157 struct _PCI_FDO_EXTENSION
*ParentFdoExtension
;
158 struct _PCI_PDO_EXTENSION
*ChildBridgePdoList
;
159 PPCI_BUS_INTERFACE_STANDARD PciBusInterface
;
160 BOOLEAN MaxSubordinateBus
;
161 BUS_HANDLER
*BusHandler
;
166 BOOLEAN ArbitersInitialized
;
167 BOOLEAN BrokenVideoHackApplied
;
169 PCI_POWER_STATE PowerState
;
170 SINGLE_LIST_ENTRY SecondaryExtension
;
171 LONG ChildWaitWakeCount
;
172 PPCI_COMMON_CONFIG PreservedConfig
;
177 BOOLEAN CacheLineSize
;
178 BOOLEAN LatencyTimer
;
183 } PCI_FDO_EXTENSION
, *PPCI_FDO_EXTENSION
;
186 // IRP Dispatch Function Type
188 typedef NTSTATUS (NTAPI
*PCI_DISPATCH_FUNCTION
)(
190 IN PIO_STACK_LOCATION IoStackLocation
,
191 IN PPCI_FDO_EXTENSION DeviceExtension
195 // IRP Dispatch Minor Table
197 typedef struct _PCI_MN_DISPATCH_TABLE
199 PCI_DISPATCH_STYLE DispatchStyle
;
200 PCI_DISPATCH_FUNCTION DispatchFunction
;
201 } PCI_MN_DISPATCH_TABLE
, *PPCI_MN_DISPATCH_TABLE
;
204 // IRP Dispatch Major Table
206 typedef struct _PCI_MJ_DISPATCH_TABLE
208 ULONG PnpIrpMaximumMinorFunction
;
209 PPCI_MN_DISPATCH_TABLE PnpIrpDispatchTable
;
210 ULONG PowerIrpMaximumMinorFunction
;
211 PPCI_MN_DISPATCH_TABLE PowerIrpDispatchTable
;
212 PCI_DISPATCH_STYLE SystemControlIrpDispatchStyle
;
213 PCI_DISPATCH_FUNCTION SystemControlIrpDispatchFunction
;
214 PCI_DISPATCH_STYLE OtherIrpDispatchStyle
;
215 PCI_DISPATCH_FUNCTION OtherIrpDispatchFunction
;
216 } PCI_MJ_DISPATCH_TABLE
, *PPCI_MJ_DISPATCH_TABLE
;
219 // Generic PCI Interface Constructor and Initializer
221 struct _PCI_INTERFACE
;
222 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_CONSTRUCTOR
)(
223 IN PPCI_FDO_EXTENSION DeviceExtension
,
225 IN PVOID InterfaceData
,
228 IN PINTERFACE Interface
231 typedef NTSTATUS (NTAPI
*PCI_INTERFACE_INITIALIZER
)(
236 // Generic PCI Interface (Interface, Translator, Arbiter)
238 typedef struct _PCI_INTERFACE
240 LPGUID InterfaceType
;
246 PCI_SIGNATURE Signature
;
247 PCI_INTERFACE_CONSTRUCTOR Constructor
;
248 PCI_INTERFACE_INITIALIZER Initializer
;
249 } PCI_INTERFACE
, *PPCI_INTERFACE
;
252 // Generic Secondary Extension Instance Header (Interface, Translator, Arbiter)
254 typedef struct PCI_SECONDARY_EXTENSION
256 SINGLE_LIST_ENTRY List
;
257 PCI_SIGNATURE ExtensionType
;
259 } PCI_SECONDARY_EXTENSION
, *PPCI_SECONDARY_EXTENSION
;
262 // PCI Arbiter Instance
264 typedef struct PCI_ARBITER_INSTANCE
266 PCI_SECONDARY_EXTENSION Header
;
267 PPCI_INTERFACE Interface
;
268 PPCI_FDO_EXTENSION BusFdoExtension
;
269 WCHAR InstanceName
[24];
270 //ARBITER_INSTANCE CommonInstance; FIXME: Need Arbiter Headers
271 } PCI_ARBITER_INSTANCE
, *PPCI_ARBITER_INSTANCE
;
274 // IRP Dispatch Routines
279 IN PDEVICE_OBJECT DeviceObject
,
287 IN PIO_STACK_LOCATION IoStackLocation
,
288 IN PPCI_FDO_EXTENSION DeviceExtension
297 IN PDRIVER_OBJECT DriverObject
,
298 IN PDEVICE_OBJECT PhysicalDeviceObject
302 // HAL Callback/Hook Routines
311 // PCI Verifier Routines
316 IN PDRIVER_OBJECT DriverObject
337 PciBuildDefaultExclusionLists(
343 PciUnicodeStringStrStr(
344 IN PUNICODE_STRING InputString
,
345 IN PCUNICODE_STRING EqualString
,
346 IN BOOLEAN CaseInSensitive
354 IN ACCESS_MASK DesiredAccess
,
355 OUT PHANDLE KeyHandle
,
356 OUT PNTSTATUS KeyStatus
364 IN HANDLE RootHandle
,
366 OUT PVOID
*OutputBuffer
,
367 OUT PULONG OutputLength
372 PciFindParentPciFdoExtension(
373 IN PDEVICE_OBJECT DeviceObject
,
379 PciInsertEntryAtTail(
380 IN PSINGLE_LIST_ENTRY ListHead
,
381 IN PPCI_FDO_EXTENSION DeviceExtension
,
387 PciGetDeviceProperty(
388 IN PDEVICE_OBJECT DeviceObject
,
389 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
390 OUT PVOID
*OutputBuffer
396 IN PDEVICE_OBJECT DeviceObject
,
397 IN ULONG IoControlCode
,
398 IN PVOID InputBuffer
,
399 IN ULONG InputBufferLength
,
400 IN PVOID OutputBuffer
,
401 IN ULONG OutputBufferLength
406 PcipLinkSecondaryExtension(
407 IN PSINGLE_LIST_ENTRY List
,
409 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
410 IN PCI_SIGNATURE ExtensionType
,
415 // Configuration Routines
419 PciGetConfigHandlers(
420 IN PPCI_FDO_EXTENSION FdoExtension
424 // State Machine Logic Transition Routines
429 IN PPCI_FDO_EXTENSION DeviceExtension
437 PciInitializeArbiters(
438 IN PPCI_FDO_EXTENSION FdoExtension
442 // External Resources
444 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
445 extern KEVENT PciGlobalLock
;
446 extern PPCI_INTERFACE PciInterfaces
[];