Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

570 lines
12 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1995 Microsoft Corporation
  3. Module Name:
  4. pciport.h
  5. Abstract:
  6. header file for pciport.sys
  7. Author:
  8. Ken Reneris (kenr) March-13-1885
  9. Environment:
  10. Kernel mode only.
  11. Revision History:
  12. --*/
  13. #include "nthal.h"
  14. #include "hal.h"
  15. #include "pci.h"
  16. #include "stdio.h"
  17. #include "stdarg.h"
  18. //
  19. // Structures
  20. //
  21. #define PciExtension Reserved[0]
  22. //
  23. // When queued, the following HAL_DEVICE_CONTROL_CONTEXT values are defined
  24. //
  25. #define ContextWorkQueue BusExtenderReserved[0]
  26. #define ContextControlHandler BusExtenderReserved[2]
  27. //
  28. // When in progress, the following HAL_DEVICE_CONTROL_CONTEXT values are defined
  29. //
  30. #define ContextArgument1 BusExtenderReserved[0]
  31. #define ContextArgument2 BusExtenderReserved[1]
  32. #define ContextBusyFlag BusExtenderReserved[2]
  33. #define PCIPORTDATA(a) \
  34. ((PPCI_PORT) ( ((PPCIBUSDATA) (a)->BusData)->PciExtension))
  35. #define PCI_CONFIG_TYPE(PciData) \
  36. ((PciData)->HeaderType & ~PCI_MULTIFUNCTION)
  37. #define Is64BitBaseAddress(a) \
  38. (((a & PCI_ADDRESS_IO_SPACE) == 0) && \
  39. ((a & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT))
  40. #define MAX_VALID_DEVICE_HANDLE 0x7FFFFFFF
  41. // the follow are handle value states when the handle is > MAX_VALID_DEVICE_HANDLE
  42. #define INITIALIZE_DEVICE_HANDLE 0x80000000
  43. #define TRANSISTION_DEVICE_HANDLE 0x80000001
  44. #define INVALID_DEVICE_HANDLE 0x80000002
  45. typedef struct _DEVICE_DATA_ {
  46. SINGLE_LIST_ENTRY Next;
  47. //
  48. // SlotNumber for which this device data corrisponds
  49. //
  50. //PCI_SLOT_NUMBER SlotNumber;
  51. //
  52. //
  53. //
  54. BOOLEAN Valid;
  55. //
  56. // DeviceControl in progress flags
  57. //
  58. BOOLEAN SyncBusy;
  59. BOOLEAN AsyncBusy;
  60. //
  61. // Track the lock state of the device
  62. // PendPowerUp is used while an Unlock is in progress
  63. // to cause a power up request to wait
  64. //
  65. BOOLEAN Locked;
  66. BOOLEAN PendPowerUp;
  67. //
  68. // Track the power state of the device.
  69. // If it's powered off, track the device's configuration.
  70. //
  71. // If the powered off configuration has changed, track the
  72. // original configuration in case the new configuration is
  73. // not supported by the h/w. (would be a defective device)
  74. //
  75. BOOLEAN Power;
  76. PPCI_COMMON_CONFIG CurrentConfig;
  77. //
  78. // Since PCI doesn't have a runtime safe way to determine
  79. // the length of it's base register's will we keep track
  80. // of them here.
  81. //
  82. ULONG BARBits[PCI_TYPE0_ADDRESSES+1];
  83. //
  84. //
  85. //
  86. BOOLEAN BARBitsSet;
  87. //
  88. // Determine if the device's rom base address register should
  89. // be enabled
  90. //
  91. BOOLEAN EnableRom;
  92. //
  93. // Flag defective hardware which we've noticed that it's base
  94. // address registers do not function properly.
  95. //
  96. BOOLEAN BrokenDevice;
  97. } DEVICE_DATA, *PDEVICE_DATA;
  98. extern POBJECT_TYPE *IoDeviceHandlerObjectType;
  99. extern PULONG IoDeviceHandlerObjectSize;
  100. #define DeviceHandler2DeviceData(a) ((PDEVICE_DATA) (((PUCHAR) a) + PcipDeviceHandlerObjectSize))
  101. #define DeviceData2DeviceHandler(a) ((PDEVICE_HANDLER_OBJECT) (((PUCHAR) a) - PcipDeviceHandlerObjectSize))
  102. #define DeviceDataSlot(a) DeviceData2DeviceHandler(a)->SlotNumber
  103. typedef struct {
  104. BOOLEAN Control;
  105. } *PBCTL_SET_CONTROL;
  106. typedef struct {
  107. PBUS_HANDLER Handler;
  108. LIST_ENTRY CheckBus;
  109. LIST_ENTRY DeviceControl;
  110. ULONG NoValidSlots;
  111. SINGLE_LIST_ENTRY ValidSlots;
  112. PVOID Spare;
  113. } PCI_PORT, *PPCI_PORT;
  114. //
  115. // Internal DeviceControls
  116. //
  117. #define BCTL_ASSIGN_SLOT_RESOURCES 0x90000001
  118. #define BCTL_CHECK_DEVICE 0x90000002
  119. #define BCTL_INITIAL_DEVICE 0x90000003
  120. typedef struct {
  121. PUNICODE_STRING RegistryPath;
  122. PUNICODE_STRING DriverClassName;
  123. PDRIVER_OBJECT DriverObject;
  124. PCM_RESOURCE_LIST *AllocatedResources;
  125. } CTL_ASSIGN_RESOURCES, *PCTL_ASSIGN_RESOURCES;
  126. typedef BOOLEAN (FASTCALL * BGNFNC)(PDEVICE_DATA, PHAL_DEVICE_CONTROL_CONTEXT);
  127. typedef VOID (* CTLFNC)(PDEVICE_DATA, PHAL_DEVICE_CONTROL_CONTEXT);
  128. typedef struct {
  129. ULONG ControlCode;
  130. ULONG MinBuffer;
  131. BGNFNC BeginDeviceControl;
  132. CTLFNC ControlHandler;
  133. } DEVICE_CONTROL_HANDLER, *PDEVICE_CONTROL_HANDLER;
  134. //
  135. //
  136. //
  137. #if DBG
  138. VOID PciDebugPrint (
  139. ULONG Level,
  140. PCCHAR DebugMessage,
  141. ...
  142. );
  143. #define DebugPrint(arg) PciDebugPrint arg
  144. #else
  145. #define DebugPrint(arg)
  146. #endif
  147. //
  148. // Globals
  149. //
  150. extern FAST_MUTEX PcipMutex;
  151. extern KSPIN_LOCK PcipSpinlock;
  152. extern LIST_ENTRY PcipControlWorkerList;
  153. extern LIST_ENTRY PcipControlDpcList;
  154. extern LIST_ENTRY PcipCheckBusList;
  155. extern ULONG PcipWorkerQueued;
  156. extern WORK_QUEUE_ITEM PcipWorkItem;
  157. extern KDPC PcipWorkDpc;
  158. extern ULONG PcipNextHandle;
  159. extern DEVICE_CONTROL_HANDLER PcipControl[];
  160. extern PDRIVER_OBJECT PciDriverObject;
  161. extern HAL_CALLBACKS PciHalCallbacks;
  162. extern PVOID PciSuspendRegistration;
  163. extern PVOID PciCodeLock;
  164. extern WCHAR rgzPCIDeviceName[];
  165. extern WCHAR rgzSuspendCallbackName[];
  166. extern WCHAR PCI_ID[];
  167. extern WCHAR PNP_VGA[];
  168. extern WCHAR PNP_IDE[];
  169. extern BOOLEAN PcipNoBusyFlag;
  170. extern ULONG PcipDeviceHandlerObjectSize;
  171. //
  172. // Prototypes
  173. //
  174. NTSTATUS
  175. DriverEntry(
  176. IN PDRIVER_OBJECT DriverObject,
  177. IN PUNICODE_STRING RegistryPath
  178. );
  179. NTSTATUS
  180. PciPortInitialize (
  181. PBUS_HANDLER PciBus
  182. );
  183. ULONG
  184. PcipGetBusData (
  185. IN PBUS_HANDLER BusHandler,
  186. IN PBUS_HANDLER RootHandler,
  187. IN PCI_SLOT_NUMBER SlotNumber,
  188. IN PUCHAR Buffer,
  189. IN ULONG Offset,
  190. IN ULONG Length
  191. );
  192. ULONG
  193. PcipGetDeviceData (
  194. IN struct _BUS_HANDLER *BusHandler,
  195. IN struct _BUS_HANDLER *RootHandler,
  196. IN PDEVICE_HANDLER_OBJECT DeviceHandler,
  197. IN ULONG DataType,
  198. IN PUCHAR Buffer,
  199. IN ULONG Offset,
  200. IN ULONG Length
  201. );
  202. ULONG
  203. PcipSetBusData (
  204. IN PBUS_HANDLER BusHandler,
  205. IN PBUS_HANDLER RootHandler,
  206. IN PCI_SLOT_NUMBER SlotNumber,
  207. IN PUCHAR Buffer,
  208. IN ULONG Offset,
  209. IN ULONG Length
  210. );
  211. ULONG
  212. PcipSetDeviceData (
  213. IN struct _BUS_HANDLER *BusHandler,
  214. IN struct _BUS_HANDLER *RootHandler,
  215. IN PDEVICE_HANDLER_OBJECT DeviceHandler,
  216. IN ULONG DataType,
  217. IN PUCHAR Buffer,
  218. IN ULONG Offset,
  219. IN ULONG Length
  220. );
  221. NTSTATUS
  222. PcipAssignSlotResources (
  223. IN PBUS_HANDLER BusHandler,
  224. IN PBUS_HANDLER RootHandler,
  225. IN PUNICODE_STRING RegistryPath,
  226. IN PUNICODE_STRING DriverClassName OPTIONAL,
  227. IN PDRIVER_OBJECT DriverObject,
  228. IN PDEVICE_OBJECT DeviceObject OPTIONAL,
  229. IN ULONG SlotNumber,
  230. IN OUT PCM_RESOURCE_LIST *AllocatedResources
  231. );
  232. NTSTATUS
  233. PcipQueryBusSlots (
  234. IN PBUS_HANDLER BusHandler,
  235. IN PBUS_HANDLER RootHandler,
  236. IN ULONG BufferSize,
  237. OUT PULONG SlotNumbers,
  238. OUT PULONG ReturnedLength
  239. );
  240. PDEVICE_HANDLER_OBJECT
  241. PcipReferenceDeviceHandler (
  242. IN struct _BUS_HANDLER *BusHandler,
  243. IN struct _BUS_HANDLER *RootHandler,
  244. IN PCI_SLOT_NUMBER SlotNumber
  245. );
  246. NTSTATUS
  247. PcipDeviceControl (
  248. IN PHAL_DEVICE_CONTROL_CONTEXT Context
  249. );
  250. NTSTATUS
  251. PcipHibernateBus (
  252. IN PBUS_HANDLER BusHandler,
  253. IN PBUS_HANDLER RootHandler
  254. );
  255. NTSTATUS
  256. PcipResumeBus (
  257. IN PBUS_HANDLER BusHandler,
  258. IN PBUS_HANDLER RootHandler
  259. );
  260. VOID
  261. PcipSuspendNotification (
  262. IN PVOID CallbackContext,
  263. IN PVOID Argument1,
  264. IN PVOID Argument2
  265. );
  266. VOID
  267. PcipStartWorker (
  268. VOID
  269. );
  270. VOID
  271. PcipControlWorker (
  272. IN PVOID WorkerContext
  273. );
  274. VOID
  275. PcipControlDpc (
  276. PKDPC Dpc,
  277. PVOID DeferredContext,
  278. PVOID SystemArgument1,
  279. PVOID SystemArgument2
  280. );
  281. VOID
  282. PcipDispatchControl (
  283. PHAL_DEVICE_CONTROL_CONTEXT Context
  284. );
  285. BOOLEAN
  286. FASTCALL
  287. PciBCtlNone (
  288. PDEVICE_DATA DeviceData,
  289. PHAL_DEVICE_CONTROL_CONTEXT Context
  290. );
  291. BOOLEAN
  292. FASTCALL
  293. PciBCtlPower (
  294. PDEVICE_DATA DeviceData,
  295. PHAL_DEVICE_CONTROL_CONTEXT Context
  296. );
  297. BOOLEAN
  298. FASTCALL
  299. PciBCtlSync (
  300. PDEVICE_DATA DeviceData,
  301. PHAL_DEVICE_CONTROL_CONTEXT Context
  302. );
  303. BOOLEAN
  304. FASTCALL
  305. PciBCtlEject (
  306. PDEVICE_DATA DeviceData,
  307. PHAL_DEVICE_CONTROL_CONTEXT Context
  308. );
  309. BOOLEAN
  310. FASTCALL
  311. PciBCtlLock (
  312. PDEVICE_DATA DeviceData,
  313. PHAL_DEVICE_CONTROL_CONTEXT Context
  314. );
  315. VOID
  316. PciCtlEject (
  317. PDEVICE_DATA DeviceData,
  318. PHAL_DEVICE_CONTROL_CONTEXT Context
  319. );
  320. VOID
  321. PciCtlLock (
  322. PDEVICE_DATA DeviceData,
  323. PHAL_DEVICE_CONTROL_CONTEXT Context
  324. );
  325. VOID
  326. PciCtlPower (
  327. PDEVICE_DATA DeviceData,
  328. PHAL_DEVICE_CONTROL_CONTEXT Context
  329. );
  330. VOID
  331. PciCtlQueryDeviceId (
  332. PDEVICE_DATA DeviceData,
  333. PHAL_DEVICE_CONTROL_CONTEXT Context
  334. );
  335. VOID
  336. PciCtlQueryDeviceUniqueId (
  337. PDEVICE_DATA DeviceData,
  338. PHAL_DEVICE_CONTROL_CONTEXT Context
  339. );
  340. VOID
  341. PciCtlQueryDeviceResources (
  342. PDEVICE_DATA DeviceData,
  343. PHAL_DEVICE_CONTROL_CONTEXT Context
  344. );
  345. VOID
  346. PciCtlQueryDeviceResourceRequirements (
  347. PDEVICE_DATA DeviceData,
  348. PHAL_DEVICE_CONTROL_CONTEXT Context
  349. );
  350. VOID
  351. PciCtlSetDeviceResources (
  352. PDEVICE_DATA DeviceData,
  353. PHAL_DEVICE_CONTROL_CONTEXT Context
  354. );
  355. VOID
  356. PciCtlAssignSlotResources (
  357. PDEVICE_DATA DeviceData,
  358. PHAL_DEVICE_CONTROL_CONTEXT Context
  359. );
  360. BOOLEAN
  361. FASTCALL
  362. PciBCtlNone (
  363. PDEVICE_DATA DeviceData,
  364. PHAL_DEVICE_CONTROL_CONTEXT Context
  365. );
  366. BOOLEAN
  367. FASTCALL
  368. PciBCtlResume (
  369. PDEVICE_DATA DeviceData,
  370. PHAL_DEVICE_CONTROL_CONTEXT Context
  371. );
  372. VOID
  373. PciCtlForward (
  374. PDEVICE_DATA DeviceData,
  375. PHAL_DEVICE_CONTROL_CONTEXT Context
  376. );
  377. VOID
  378. PcipCompletePowerUp (
  379. PDEVICE_DATA DeviceData,
  380. PHAL_DEVICE_CONTROL_CONTEXT Context
  381. );
  382. VOID
  383. PcipCompleteDeviceControl (
  384. NTSTATUS Status,
  385. PHAL_DEVICE_CONTROL_CONTEXT Context,
  386. PDEVICE_DATA DeviceData
  387. );
  388. VOID
  389. PcipReadConfig (
  390. IN PBUS_HANDLER Handler,
  391. IN PDEVICE_DATA DeviceData,
  392. OUT PPCI_COMMON_CONFIG PciData
  393. );
  394. NTSTATUS
  395. PcipFlushConfig (
  396. IN PBUS_HANDLER Handler,
  397. IN PDEVICE_DATA DeviceData
  398. );
  399. BOOLEAN
  400. PcipCompareDecodes (
  401. IN PDEVICE_DATA DeviceData,
  402. IN PPCI_COMMON_CONFIG PciData,
  403. IN PPCI_COMMON_CONFIG PciData2
  404. );
  405. BOOLEAN
  406. PcipCalcBaseAddrPointers (
  407. IN PDEVICE_DATA DeviceData,
  408. IN PPCI_COMMON_CONFIG PciData,
  409. OUT PULONG *BaseAddress,
  410. OUT PULONG NoBaseAddress,
  411. OUT PULONG RomIndex
  412. );
  413. NTSTATUS
  414. PcipPowerDownSlot (
  415. PBUS_HANDLER Handler,
  416. PDEVICE_DATA DeviceData
  417. );
  418. VOID
  419. PciCtlCheckDevice (
  420. PDEVICE_DATA DeviceData,
  421. PHAL_DEVICE_CONTROL_CONTEXT Context
  422. );
  423. NTSTATUS
  424. PcipVerifyBarBits (
  425. PDEVICE_DATA DeviceData,
  426. PBUS_HANDLER Handler
  427. );
  428. NTSTATUS
  429. PcipGetBarBits (
  430. PDEVICE_DATA DeviceData,
  431. PBUS_HANDLER Handler
  432. );
  433. PDEVICE_DATA
  434. PcipFindDeviceData (
  435. IN PPCI_PORT PciPort,
  436. IN PCI_SLOT_NUMBER SlotNumber
  437. );
  438. VOID
  439. PcipCheckBus (
  440. PPCI_PORT PciPort,
  441. BOOLEAN Initialize
  442. );
  443. BOOLEAN
  444. PcipCrackBAR (
  445. IN PULONG *BaseAddress,
  446. IN PULONG BarBits,
  447. IN OUT PULONG Index,
  448. OUT PLONGLONG pbase,
  449. OUT PLONGLONG plength,
  450. OUT PLONGLONG pmax
  451. );
  452. NTSTATUS
  453. BugBugSubclass (
  454. VOID
  455. );