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
298 IN PIO_STACK_LOCATION IoStackLocation
,
299 IN PPCI_FDO_EXTENSION DeviceExtension
306 IN PIO_STACK_LOCATION IoStackLocation
,
307 IN PPCI_FDO_EXTENSION DeviceExtension
314 IN PIO_STACK_LOCATION IoStackLocation
,
315 IN PPCI_FDO_EXTENSION DeviceExtension
324 IN PDRIVER_OBJECT DriverObject
,
325 IN PDEVICE_OBJECT PhysicalDeviceObject
330 PciFdoIrpStartDevice(
332 IN PIO_STACK_LOCATION IoStackLocation
,
333 IN PPCI_FDO_EXTENSION DeviceExtension
338 PciFdoIrpQueryRemoveDevice(
340 IN PIO_STACK_LOCATION IoStackLocation
,
341 IN PPCI_FDO_EXTENSION DeviceExtension
346 PciFdoIrpRemoveDevice(
348 IN PIO_STACK_LOCATION IoStackLocation
,
349 IN PPCI_FDO_EXTENSION DeviceExtension
354 PciFdoIrpCancelRemoveDevice(
356 IN PIO_STACK_LOCATION IoStackLocation
,
357 IN PPCI_FDO_EXTENSION DeviceExtension
364 IN PIO_STACK_LOCATION IoStackLocation
,
365 IN PPCI_FDO_EXTENSION DeviceExtension
370 PciFdoIrpQueryStopDevice(
372 IN PIO_STACK_LOCATION IoStackLocation
,
373 IN PPCI_FDO_EXTENSION DeviceExtension
378 PciFdoIrpCancelStopDevice(
380 IN PIO_STACK_LOCATION IoStackLocation
,
381 IN PPCI_FDO_EXTENSION DeviceExtension
386 PciFdoIrpQueryDeviceRelations(
388 IN PIO_STACK_LOCATION IoStackLocation
,
389 IN PPCI_FDO_EXTENSION DeviceExtension
394 PciFdoIrpQueryInterface(
396 IN PIO_STACK_LOCATION IoStackLocation
,
397 IN PPCI_FDO_EXTENSION DeviceExtension
402 PciFdoIrpQueryCapabilities(
404 IN PIO_STACK_LOCATION IoStackLocation
,
405 IN PPCI_FDO_EXTENSION DeviceExtension
410 PciFdoIrpDeviceUsageNotification(
412 IN PIO_STACK_LOCATION IoStackLocation
,
413 IN PPCI_FDO_EXTENSION DeviceExtension
418 PciFdoIrpSurpriseRemoval(
420 IN PIO_STACK_LOCATION IoStackLocation
,
421 IN PPCI_FDO_EXTENSION DeviceExtension
426 PciFdoIrpQueryLegacyBusInformation(
428 IN PIO_STACK_LOCATION IoStackLocation
,
429 IN PPCI_FDO_EXTENSION DeviceExtension
433 // HAL Callback/Hook Routines
442 // PCI Verifier Routines
447 IN PDRIVER_OBJECT DriverObject
468 PciBuildDefaultExclusionLists(
474 PciUnicodeStringStrStr(
475 IN PUNICODE_STRING InputString
,
476 IN PCUNICODE_STRING EqualString
,
477 IN BOOLEAN CaseInSensitive
485 IN ACCESS_MASK DesiredAccess
,
486 OUT PHANDLE KeyHandle
,
487 OUT PNTSTATUS KeyStatus
495 IN HANDLE RootHandle
,
497 OUT PVOID
*OutputBuffer
,
498 OUT PULONG OutputLength
503 PciFindParentPciFdoExtension(
504 IN PDEVICE_OBJECT DeviceObject
,
510 PciInsertEntryAtTail(
511 IN PSINGLE_LIST_ENTRY ListHead
,
512 IN PPCI_FDO_EXTENSION DeviceExtension
,
518 PciGetDeviceProperty(
519 IN PDEVICE_OBJECT DeviceObject
,
520 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
521 OUT PVOID
*OutputBuffer
527 IN PDEVICE_OBJECT DeviceObject
,
528 IN ULONG IoControlCode
,
529 IN PVOID InputBuffer
,
530 IN ULONG InputBufferLength
,
531 IN PVOID OutputBuffer
,
532 IN ULONG OutputBufferLength
537 PcipLinkSecondaryExtension(
538 IN PSINGLE_LIST_ENTRY List
,
540 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
541 IN PCI_SIGNATURE ExtensionType
,
546 // Configuration Routines
550 PciGetConfigHandlers(
551 IN PPCI_FDO_EXTENSION FdoExtension
555 // State Machine Logic Transition Routines
560 IN PPCI_FDO_EXTENSION DeviceExtension
568 PciInitializeArbiters(
569 IN PPCI_FDO_EXTENSION FdoExtension
577 PciDebugIrpDispatchDisplay(
578 IN PIO_STACK_LOCATION IoStackLocation
,
579 IN PPCI_FDO_EXTENSION DeviceExtension
,
584 // External Resources
586 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
587 extern KEVENT PciGlobalLock
;
588 extern PPCI_INTERFACE PciInterfaces
[];