1 /* 2 * PROJECT: ReactOS ISA PnP Bus driver 3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) 4 * PURPOSE: Common header file 5 * COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org> 6 * Copyright 2020 Hervé Poussineau <hpoussin@reactos.org> 7 */ 8 9 #ifndef _ISAPNP_PCH_ 10 #define _ISAPNP_PCH_ 11 12 #include <ntddk.h> 13 #include <ntstrsafe.h> 14 #include <section_attribs.h> 15 16 #include "isapnphw.h" 17 #include "isapnpres.h" 18 19 #include <initguid.h> 20 #include <wdmguid.h> 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 #define TAG_ISAPNP 'pasI' 27 28 typedef enum 29 { 30 dsStopped, 31 dsStarted 32 } ISAPNP_DEVICE_STATE; 33 34 typedef enum _ISAPNP_SIGNATURE 35 { 36 IsaPnpBus = 'odFI', 37 IsaPnpLogicalDevice = 'veDI', 38 IsaPnpReadDataPort = 'pdRI' 39 } ISAPNP_SIGNATURE; 40 41 typedef struct _ISAPNP_COMMON_EXTENSION 42 { 43 ISAPNP_SIGNATURE Signature; 44 PDEVICE_OBJECT Self; 45 ISAPNP_DEVICE_STATE State; 46 } ISAPNP_COMMON_EXTENSION, *PISAPNP_COMMON_EXTENSION; 47 48 typedef struct _ISAPNP_FDO_EXTENSION 49 { 50 ISAPNP_COMMON_EXTENSION Common; 51 PDEVICE_OBJECT Ldo; 52 PDEVICE_OBJECT Pdo; 53 PDEVICE_OBJECT ReadPortPdo; /**< @remarks The pointer is NULL for all inactive FDOs. */ 54 ULONG BusNumber; 55 KEVENT DeviceSyncEvent; 56 57 _Guarded_by_(DeviceSyncEvent) 58 LIST_ENTRY DeviceListHead; 59 60 _Guarded_by_(DeviceSyncEvent) 61 ULONG DeviceCount; 62 63 PDRIVER_OBJECT DriverObject; 64 PUCHAR ReadDataPort; 65 ULONG Cards; 66 LIST_ENTRY BusLink; 67 } ISAPNP_FDO_EXTENSION, *PISAPNP_FDO_EXTENSION; 68 69 typedef struct _ISAPNP_PDO_EXTENSION 70 { 71 ISAPNP_COMMON_EXTENSION Common; 72 PISAPNP_FDO_EXTENSION FdoExt; 73 74 ULONG Flags; 75 #define ISAPNP_ENUMERATED 0x00000001 /**< @brief Whether the device has been reported to the PnP manager. */ 76 #define ISAPNP_SCANNED_BY_READ_PORT 0x00000002 /**< @brief The bus has been scanned by Read Port PDO. */ 77 #define ISAPNP_READ_PORT_ALLOW_FDO_SCAN 0x00000004 /**< @brief Allows the active FDO to scan the bus. */ 78 #define ISAPNP_READ_PORT_NEED_REBALANCE 0x00000008 /**< @brief The I/O resource requirements have changed. */ 79 80 union 81 { 82 /* Data belonging to logical devices */ 83 struct 84 { 85 PISAPNP_LOGICAL_DEVICE IsaPnpDevice; 86 87 PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList; 88 89 PCM_RESOURCE_LIST ResourceList; 90 ULONG ResourceListSize; 91 }; 92 93 ULONG SelectedPort; 94 }; 95 96 _Write_guarded_by_(_Global_interlock_) 97 volatile LONG SpecialFiles; 98 } ISAPNP_PDO_EXTENSION, *PISAPNP_PDO_EXTENSION; 99 100 extern KEVENT BusSyncEvent; 101 102 _Guarded_by_(BusSyncEvent) 103 extern BOOLEAN ReadPortCreated; 104 105 _Guarded_by_(BusSyncEvent) 106 extern LIST_ENTRY BusListHead; 107 108 _Requires_lock_not_held_(BusSyncEvent) 109 _Acquires_lock_(BusSyncEvent) 110 FORCEINLINE 111 VOID 112 IsaPnpAcquireBusDataLock(VOID) 113 { 114 ASSERT(PsGetCurrentProcess() == PsInitialSystemProcess); 115 116 KeWaitForSingleObject(&BusSyncEvent, Executive, KernelMode, FALSE, NULL); 117 } 118 119 _Releases_lock_(BusSyncEvent) 120 FORCEINLINE 121 VOID 122 IsaPnpReleaseBusDataLock(VOID) 123 { 124 KeSetEvent(&BusSyncEvent, IO_NO_INCREMENT, FALSE); 125 } 126 127 _Requires_lock_not_held_(FdoExt->DeviceSyncEvent) 128 _Acquires_lock_(FdoExt->DeviceSyncEvent) 129 FORCEINLINE 130 VOID 131 IsaPnpAcquireDeviceDataLock( 132 _In_ PISAPNP_FDO_EXTENSION FdoExt) 133 { 134 ASSERT(PsGetCurrentProcess() == PsInitialSystemProcess); 135 136 KeWaitForSingleObject(&FdoExt->DeviceSyncEvent, Executive, KernelMode, FALSE, NULL); 137 } 138 139 _Releases_lock_(FdoExt->DeviceSyncEvent) 140 FORCEINLINE 141 VOID 142 IsaPnpReleaseDeviceDataLock( 143 _In_ PISAPNP_FDO_EXTENSION FdoExt) 144 { 145 KeSetEvent(&FdoExt->DeviceSyncEvent, IO_NO_INCREMENT, FALSE); 146 } 147 148 /* isapnp.c */ 149 150 CODE_SEG("PAGE") 151 BOOLEAN 152 FindIoDescriptor( 153 _In_ PISAPNP_LOGICAL_DEVICE LogDevice, 154 _In_opt_ ULONG Base, 155 _In_ ULONG RangeStart, 156 _In_ ULONG RangeEnd, 157 _Out_opt_ PUCHAR Information, 158 _Out_opt_ PULONG Length); 159 160 CODE_SEG("PAGE") 161 BOOLEAN 162 FindIrqDescriptor( 163 _In_ PISAPNP_LOGICAL_DEVICE LogDevice, 164 _In_ ULONG Vector); 165 166 CODE_SEG("PAGE") 167 BOOLEAN 168 FindDmaDescriptor( 169 _In_ PISAPNP_LOGICAL_DEVICE LogDevice, 170 _In_ ULONG Channel); 171 172 CODE_SEG("PAGE") 173 BOOLEAN 174 FindMemoryDescriptor( 175 _In_ PISAPNP_LOGICAL_DEVICE LogDevice, 176 _In_ ULONG RangeStart, 177 _In_ ULONG RangeEnd, 178 _Out_opt_ PUCHAR Information); 179 180 CODE_SEG("PAGE") 181 PIO_RESOURCE_REQUIREMENTS_LIST 182 IsaPnpCreateReadPortDORequirements( 183 _In_opt_ ULONG SelectedReadPort); 184 185 CODE_SEG("PAGE") 186 PCM_RESOURCE_LIST 187 IsaPnpCreateReadPortDOResources(VOID); 188 189 CODE_SEG("PAGE") 190 VOID 191 IsaPnpRemoveReadPortDO( 192 _In_ PDEVICE_OBJECT Pdo); 193 194 CODE_SEG("PAGE") 195 NTSTATUS 196 IsaPnpFillDeviceRelations( 197 _In_ PISAPNP_FDO_EXTENSION FdoExt, 198 _Inout_ PIRP Irp, 199 _In_ BOOLEAN IncludeDataPort); 200 201 CODE_SEG("INIT") 202 DRIVER_INITIALIZE DriverEntry; 203 204 /* fdo.c */ 205 CODE_SEG("PAGE") 206 NTSTATUS 207 IsaFdoPnp( 208 _In_ PISAPNP_FDO_EXTENSION FdoExt, 209 _Inout_ PIRP Irp, 210 _In_ PIO_STACK_LOCATION IrpSp); 211 212 /* interface.c */ 213 CODE_SEG("PAGE") 214 NTSTATUS 215 IsaFdoQueryInterface( 216 _In_ PISAPNP_FDO_EXTENSION FdoExt, 217 _In_ PIO_STACK_LOCATION IrpSp); 218 219 /* pdo.c */ 220 CODE_SEG("PAGE") 221 NTSTATUS 222 IsaPdoPnp( 223 _In_ PISAPNP_PDO_EXTENSION PdoDeviceExtension, 224 _Inout_ PIRP Irp, 225 _In_ PIO_STACK_LOCATION IrpSp); 226 227 CODE_SEG("PAGE") 228 VOID 229 IsaPnpRemoveLogicalDeviceDO( 230 _In_ PDEVICE_OBJECT Pdo); 231 232 /* hardware.c */ 233 CODE_SEG("PAGE") 234 UCHAR 235 IsaHwTryReadDataPort( 236 _In_ PUCHAR ReadDataPort); 237 238 _Requires_lock_held_(FdoExt->DeviceSyncEvent) 239 CODE_SEG("PAGE") 240 NTSTATUS 241 IsaHwFillDeviceList( 242 _In_ PISAPNP_FDO_EXTENSION FdoExt); 243 244 CODE_SEG("PAGE") 245 NTSTATUS 246 IsaHwConfigureDevice( 247 _In_ PISAPNP_FDO_EXTENSION FdoExt, 248 _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice, 249 _In_ PCM_RESOURCE_LIST Resources); 250 251 CODE_SEG("PAGE") 252 VOID 253 IsaHwWakeDevice( 254 _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice); 255 256 CODE_SEG("PAGE") 257 VOID 258 IsaHwDeactivateDevice( 259 _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice); 260 261 CODE_SEG("PAGE") 262 VOID 263 IsaHwActivateDevice( 264 _In_ PISAPNP_FDO_EXTENSION FdoExt, 265 _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice); 266 267 CODE_SEG("PAGE") 268 VOID 269 IsaHwWaitForKey(VOID); 270 271 #ifdef __cplusplus 272 } 273 #endif 274 275 #endif /* _ISAPNP_PCH_ */ 276