xref: /reactos/drivers/bus/pci/pci.h (revision 50cf16b3)
1 #ifndef _PCI_PCH_
2 #define _PCI_PCH_
3 
4 #include <ntifs.h>
5 
6 #define TAG_PCI '0ICP'
7 
8 typedef struct _PCI_DEVICE
9 {
10     // Entry on device list
11     LIST_ENTRY ListEntry;
12     // Physical Device Object of device
13     PDEVICE_OBJECT Pdo;
14     // PCI bus number
15     ULONG BusNumber;
16     // PCI slot number
17     PCI_SLOT_NUMBER SlotNumber;
18     // PCI configuration data
19     PCI_COMMON_CONFIG PciConfig;
20     // Enable memory space
21     BOOLEAN EnableMemorySpace;
22     // Enable I/O space
23     BOOLEAN EnableIoSpace;
24     // Enable bus master
25     BOOLEAN EnableBusMaster;
26 } PCI_DEVICE, *PPCI_DEVICE;
27 
28 
29 typedef enum
30 {
31     dsStopped,
32     dsStarted,
33     dsPaused,
34     dsRemoved,
35     dsSurpriseRemoved
36 } PCI_DEVICE_STATE;
37 
38 
39 typedef struct _COMMON_DEVICE_EXTENSION
40 {
41     // Pointer to device object, this device extension is associated with
42     PDEVICE_OBJECT DeviceObject;
43     // Wether this device extension is for an FDO or PDO
44     BOOLEAN IsFDO;
45     // Wether the device is removed
46     BOOLEAN Removed;
47     // Current device power state for the device
48     DEVICE_POWER_STATE DevicePowerState;
49 } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
50 
51 /* Physical Device Object device extension for a child device */
52 typedef struct _PDO_DEVICE_EXTENSION
53 {
54     // Common device data
55     COMMON_DEVICE_EXTENSION Common;
56     // Functional device object
57     PDEVICE_OBJECT Fdo;
58     // Pointer to PCI Device informations
59     PPCI_DEVICE PciDevice;
60     // Device ID
61     UNICODE_STRING DeviceID;
62     // Instance ID
63     UNICODE_STRING InstanceID;
64     // Hardware IDs
65     UNICODE_STRING HardwareIDs;
66     // Compatible IDs
67     UNICODE_STRING CompatibleIDs;
68     // Textual description of device
69     UNICODE_STRING DeviceDescription;
70     // Textual description of device location
71     UNICODE_STRING DeviceLocation;
72     // Number of interfaces references
73     LONG References;
74 } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
75 
76 /* Functional Device Object device extension for the PCI driver device object */
77 typedef struct _FDO_DEVICE_EXTENSION
78 {
79     // Common device data
80     COMMON_DEVICE_EXTENSION Common;
81     // Entry on device list
82     LIST_ENTRY ListEntry;
83     // PCI bus number serviced by this FDO
84     ULONG BusNumber;
85     // Current state of the driver
86     PCI_DEVICE_STATE State;
87     // Namespace device list
88     LIST_ENTRY DeviceListHead;
89     // Number of (not removed) devices in device list
90     ULONG DeviceListCount;
91     // Lock for namespace device list
92     KSPIN_LOCK DeviceListLock;
93     // Lower device object
94     PDEVICE_OBJECT Ldo;
95 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
96 
97 
98 /* Driver extension associated with PCI driver */
99 typedef struct _PCI_DRIVER_EXTENSION
100 {
101     //
102     LIST_ENTRY BusListHead;
103     // Lock for namespace bus list
104     KSPIN_LOCK BusListLock;
105 } PCI_DRIVER_EXTENSION, *PPCI_DRIVER_EXTENSION;
106 
107 
108 /* We need a global variable to get the driver extension,
109  * because at least InterfacePciDevicePresent has no
110  * other way to get it... */
111 extern PPCI_DRIVER_EXTENSION DriverExtension;
112 
113 /* fdo.c */
114 
115 NTSTATUS
116 FdoPnpControl(
117     PDEVICE_OBJECT DeviceObject,
118     PIRP Irp);
119 
120 NTSTATUS
121 FdoPowerControl(
122     PDEVICE_OBJECT DeviceObject,
123     PIRP Irp);
124 
125 /* pci.c */
126 
127 NTSTATUS
128 PciCreateDeviceIDString(
129     PUNICODE_STRING DeviceID,
130     PPCI_DEVICE Device);
131 
132 NTSTATUS
133 PciCreateInstanceIDString(
134     PUNICODE_STRING InstanceID,
135     PPCI_DEVICE Device);
136 
137 NTSTATUS
138 PciCreateHardwareIDsString(
139     PUNICODE_STRING HardwareIDs,
140     PPCI_DEVICE Device);
141 
142 NTSTATUS
143 PciCreateCompatibleIDsString(
144     PUNICODE_STRING HardwareIDs,
145     PPCI_DEVICE Device);
146 
147 NTSTATUS
148 PciCreateDeviceDescriptionString(
149     PUNICODE_STRING DeviceDescription,
150     PPCI_DEVICE Device);
151 
152 NTSTATUS
153 PciCreateDeviceLocationString(
154     PUNICODE_STRING DeviceLocation,
155     PPCI_DEVICE Device);
156 
157 NTSTATUS
158 PciDuplicateUnicodeString(
159     IN ULONG Flags,
160     IN PCUNICODE_STRING SourceString,
161     OUT PUNICODE_STRING DestinationString);
162 
163 /* pdo.c */
164 
165 NTSTATUS
166 PdoPnpControl(
167     PDEVICE_OBJECT DeviceObject,
168     PIRP Irp);
169 
170 NTSTATUS
171 PdoPowerControl(
172     PDEVICE_OBJECT DeviceObject,
173     PIRP Irp);
174 
175 NTSTATUS
176 NTAPI
177 DriverEntry(
178     IN PDRIVER_OBJECT DriverObject,
179     IN PUNICODE_STRING RegistryPath);
180 
181 #endif /* _PCI_PCH_ */
182