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
,
320 IN PIO_STACK_LOCATION IoStackLocation
,
321 IN PPCI_FDO_EXTENSION DeviceExtension
328 IN PIO_STACK_LOCATION IoStackLocation
,
329 IN PPCI_FDO_EXTENSION DeviceExtension
336 IN PIO_STACK_LOCATION IoStackLocation
,
337 IN PPCI_FDO_EXTENSION DeviceExtension
346 IN PDRIVER_OBJECT DriverObject
,
347 IN PDEVICE_OBJECT PhysicalDeviceObject
352 PciFdoIrpStartDevice(
354 IN PIO_STACK_LOCATION IoStackLocation
,
355 IN PPCI_FDO_EXTENSION DeviceExtension
360 PciFdoIrpQueryRemoveDevice(
362 IN PIO_STACK_LOCATION IoStackLocation
,
363 IN PPCI_FDO_EXTENSION DeviceExtension
368 PciFdoIrpRemoveDevice(
370 IN PIO_STACK_LOCATION IoStackLocation
,
371 IN PPCI_FDO_EXTENSION DeviceExtension
376 PciFdoIrpCancelRemoveDevice(
378 IN PIO_STACK_LOCATION IoStackLocation
,
379 IN PPCI_FDO_EXTENSION DeviceExtension
386 IN PIO_STACK_LOCATION IoStackLocation
,
387 IN PPCI_FDO_EXTENSION DeviceExtension
392 PciFdoIrpQueryStopDevice(
394 IN PIO_STACK_LOCATION IoStackLocation
,
395 IN PPCI_FDO_EXTENSION DeviceExtension
400 PciFdoIrpCancelStopDevice(
402 IN PIO_STACK_LOCATION IoStackLocation
,
403 IN PPCI_FDO_EXTENSION DeviceExtension
408 PciFdoIrpQueryDeviceRelations(
410 IN PIO_STACK_LOCATION IoStackLocation
,
411 IN PPCI_FDO_EXTENSION DeviceExtension
416 PciFdoIrpQueryInterface(
418 IN PIO_STACK_LOCATION IoStackLocation
,
419 IN PPCI_FDO_EXTENSION DeviceExtension
424 PciFdoIrpQueryCapabilities(
426 IN PIO_STACK_LOCATION IoStackLocation
,
427 IN PPCI_FDO_EXTENSION DeviceExtension
432 PciFdoIrpDeviceUsageNotification(
434 IN PIO_STACK_LOCATION IoStackLocation
,
435 IN PPCI_FDO_EXTENSION DeviceExtension
440 PciFdoIrpSurpriseRemoval(
442 IN PIO_STACK_LOCATION IoStackLocation
,
443 IN PPCI_FDO_EXTENSION DeviceExtension
448 PciFdoIrpQueryLegacyBusInformation(
450 IN PIO_STACK_LOCATION IoStackLocation
,
451 IN PPCI_FDO_EXTENSION DeviceExtension
455 // HAL Callback/Hook Routines
464 // PCI Verifier Routines
469 IN PDRIVER_OBJECT DriverObject
490 PciBuildDefaultExclusionLists(
496 PciUnicodeStringStrStr(
497 IN PUNICODE_STRING InputString
,
498 IN PCUNICODE_STRING EqualString
,
499 IN BOOLEAN CaseInSensitive
507 IN ACCESS_MASK DesiredAccess
,
508 OUT PHANDLE KeyHandle
,
509 OUT PNTSTATUS KeyStatus
517 IN HANDLE RootHandle
,
519 OUT PVOID
*OutputBuffer
,
520 OUT PULONG OutputLength
525 PciFindParentPciFdoExtension(
526 IN PDEVICE_OBJECT DeviceObject
,
532 PciInsertEntryAtTail(
533 IN PSINGLE_LIST_ENTRY ListHead
,
534 IN PPCI_FDO_EXTENSION DeviceExtension
,
540 PciGetDeviceProperty(
541 IN PDEVICE_OBJECT DeviceObject
,
542 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
543 OUT PVOID
*OutputBuffer
549 IN PDEVICE_OBJECT DeviceObject
,
550 IN ULONG IoControlCode
,
551 IN PVOID InputBuffer
,
552 IN ULONG InputBufferLength
,
553 IN PVOID OutputBuffer
,
554 IN ULONG OutputBufferLength
559 PcipLinkSecondaryExtension(
560 IN PSINGLE_LIST_ENTRY List
,
562 IN PPCI_SECONDARY_EXTENSION SecondaryExtension
,
563 IN PCI_SIGNATURE ExtensionType
,
568 // Configuration Routines
572 PciGetConfigHandlers(
573 IN PPCI_FDO_EXTENSION FdoExtension
577 // State Machine Logic Transition Routines
582 IN PPCI_FDO_EXTENSION DeviceExtension
590 PciInitializeArbiters(
591 IN PPCI_FDO_EXTENSION FdoExtension
599 PciDebugIrpDispatchDisplay(
600 IN PIO_STACK_LOCATION IoStackLocation
,
601 IN PPCI_FDO_EXTENSION DeviceExtension
,
611 IN PPCI_FDO_EXTENSION DeviceExtension
,
612 IN CONST GUID
* InterfaceType
,
615 IN PVOID InterfaceData
,
616 IN PINTERFACE Interface
,
617 IN BOOLEAN LastChance
622 PciPmeInterfaceInitializer(
628 routeintrf_Initializer(
640 agpintrf_Initializer(
652 busintrf_Initializer(
670 locintrf_Initializer(
676 pcicbintrf_Initializer(
682 lddintrf_Initializer(
688 devpresent_Initializer(
694 agpintrf_Constructor(
695 IN PVOID DeviceExtension
,
697 IN PVOID InterfaceData
,
700 IN PINTERFACE Interface
706 IN PVOID DeviceExtension
,
708 IN PVOID InterfaceData
,
711 IN PINTERFACE Interface
717 IN PVOID DeviceExtension
,
719 IN PVOID InterfaceData
,
722 IN PINTERFACE Interface
728 IN PVOID DeviceExtension
,
730 IN PVOID InterfaceData
,
733 IN PINTERFACE Interface
738 busintrf_Constructor(
739 IN PVOID DeviceExtension
,
741 IN PVOID InterfaceData
,
744 IN PINTERFACE Interface
750 IN PVOID DeviceExtension
,
752 IN PVOID InterfaceData
,
755 IN PINTERFACE Interface
760 pcicbintrf_Constructor(
761 IN PVOID DeviceExtension
,
763 IN PVOID InterfaceData
,
766 IN PINTERFACE Interface
771 lddintrf_Constructor(
772 IN PVOID DeviceExtension
,
774 IN PVOID InterfaceData
,
777 IN PINTERFACE Interface
782 locintrf_Constructor(
783 IN PVOID DeviceExtension
,
785 IN PVOID InterfaceData
,
788 IN PINTERFACE Interface
793 PciPmeInterfaceConstructor(
794 IN PVOID DeviceExtension
,
796 IN PVOID InterfaceData
,
799 IN PINTERFACE Interface
804 routeintrf_Constructor(
805 IN PVOID DeviceExtension
,
807 IN PVOID InterfaceData
,
810 IN PINTERFACE Interface
815 devpresent_Constructor(
816 IN PVOID DeviceExtension
,
818 IN PVOID InterfaceData
,
821 IN PINTERFACE Interface
825 // External Resources
827 extern SINGLE_LIST_ENTRY PciFdoExtensionListHead
;
828 extern KEVENT PciGlobalLock
;
829 extern PPCI_INTERFACE PciInterfaces
[];
830 extern PCI_INTERFACE ArbiterInterfaceBusNumber
;
831 extern PCI_INTERFACE ArbiterInterfaceMemory
;
832 extern PCI_INTERFACE ArbiterInterfaceIo
;
833 extern PCI_INTERFACE BusHandlerInterface
;
834 extern PCI_INTERFACE PciRoutingInterface
;
835 extern PCI_INTERFACE PciCardbusPrivateInterface
;
836 extern PCI_INTERFACE PciLegacyDeviceDetectionInterface
;
837 extern PCI_INTERFACE PciPmeInterface
;
838 extern PCI_INTERFACE PciDevicePresentInterface
;
839 //extern PCI_INTERFACE PciNativeIdeInterface;
840 extern PCI_INTERFACE PciLocationInterface
;
841 extern PCI_INTERFACE AgpTargetInterface
;
842 extern PCI_INTERFACE TranslatorInterfaceInterrupt
;