3 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
8 #define PASTE2(x,y) x ## y
9 #define POINTER_TO_(x) PASTE2(P,x)
10 #define READ_FROM(x) PASTE2(READ_PORT_, x)
11 #define WRITE_TO(x) PASTE2(WRITE_PORT_, x)
14 // Declares a PCI Register Read/Write Routine
16 #define TYPE_DEFINE(x, y) \
20 IN PPCIPBUSDATA BusData, \
25 #define TYPE1_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS);
26 #define TYPE2_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS);
29 // Defines a PCI Register Read/Write Type 1 Routine Prologue and Epilogue
31 #define TYPE1_START(x, y) \
32 TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS) \
34 ULONG i = Offset % sizeof(ULONG); \
35 PciCfg->u.bits.RegisterNumber = Offset / sizeof(ULONG); \
36 WRITE_PORT_ULONG(BusData->Config.Type1.Address, PciCfg->u.AsULONG);
37 #define TYPE1_END(y) \
39 #define TYPE2_END TYPE1_END
42 // PCI Register Read Type 1 Routine
44 #define TYPE1_READ(x, y) \
46 *((POINTER_TO_(y))Buffer) = \
47 READ_FROM(y)((POINTER_TO_(y))(ULONG_PTR)(BusData->Config.Type1.Data + i)); \
51 // PCI Register Write Type 1 Routine
53 #define TYPE1_WRITE(x, y) \
55 WRITE_TO(y)((POINTER_TO_(y))(ULONG_PTR)(BusData->Config.Type1.Data + i), \
56 *((POINTER_TO_(y))Buffer)); \
60 // Defines a PCI Register Read/Write Type 2 Routine Prologue and Epilogue
62 #define TYPE2_START(x, y) \
63 TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS) \
65 PciCfg->u.bits.RegisterNumber = (USHORT)Offset;
68 // PCI Register Read Type 2 Routine
70 #define TYPE2_READ(x, y) \
72 *((POINTER_TO_(y))Buffer) = \
73 READ_FROM(y)((POINTER_TO_(y))(ULONG_PTR)PciCfg->u.AsUSHORT); \
77 // PCI Register Write Type 2 Routine
79 #define TYPE2_WRITE(x, y) \
81 WRITE_TO(y)((POINTER_TO_(y))(ULONG_PTR)PciCfg->u.AsUSHORT, \
82 *((POINTER_TO_(y))Buffer)); \
87 IN PBUS_HANDLER BusHandler
,
88 IN PBUS_HANDLER RootHandler
,
89 IN PCI_SLOT_NUMBER PciSlot
,
90 OUT PSUPPORTED_RANGE
*Interrupt
93 typedef struct _PCIPBUSDATA
95 PCIBUSDATA CommonData
;
111 PciIrqRange GetIrqRange
;
112 BOOLEAN BridgeConfigRead
;
117 RTL_BITMAP DeviceConfigured
;
118 ULONG ConfiguredBits
[PCI_MAX_DEVICES
* PCI_MAX_FUNCTION
/ 32];
119 } PCIPBUSDATA
, *PPCIPBUSDATA
;
122 (NTAPI
*FncConfigIO
)(
123 IN PPCIPBUSDATA BusData
,
131 IN PBUS_HANDLER BusHandler
,
132 IN PCI_SLOT_NUMBER Slot
,
138 (NTAPI
*FncReleaseSync
)(
139 IN PBUS_HANDLER BusHandler
,
143 typedef struct _PCI_CONFIG_HANDLER
146 FncReleaseSync ReleaseSynchronzation
;
147 FncConfigIO ConfigRead
[3];
148 FncConfigIO ConfigWrite
[3];
149 } PCI_CONFIG_HANDLER
, *PPCI_CONFIG_HANDLER
;
151 typedef struct _PCI_REGISTRY_INFO_INTERNAL
155 UCHAR NoBuses
; // Number Of Buses
156 UCHAR HardwareMechanism
;
158 PCI_CARD_DESCRIPTOR CardList
[ANYSIZE_ARRAY
];
159 } PCI_REGISTRY_INFO_INTERNAL
, *PPCI_REGISTRY_INFO_INTERNAL
;
164 #define PCI_TYPE1_ADDRESS_PORT (PULONG)0xCF8
165 #define PCI_TYPE1_DATA_PORT 0xCFC
170 #define PCI_TYPE2_CSE_PORT (PUCHAR)0xCF8
171 #define PCI_TYPE2_FORWARD_PORT (PUCHAR)0xCFA
172 #define PCI_TYPE2_ADDRESS_BASE 0xC
175 // PCI Type 1 Configuration Register
177 typedef struct _PCI_TYPE1_CFG_BITS
184 ULONG RegisterNumber
:6;
185 ULONG FunctionNumber
:3;
186 ULONG DeviceNumber
:5;
194 } PCI_TYPE1_CFG_BITS
, *PPCI_TYPE1_CFG_BITS
;
197 // PCI Type 2 CSE Register
199 typedef struct _PCI_TYPE2_CSE_BITS
206 UCHAR FunctionNumber
:3;
212 } PCI_TYPE2_CSE_BITS
, PPCI_TYPE2_CSE_BITS
;
215 // PCI Type 2 Address Register
217 typedef struct _PCI_TYPE2_ADDRESS_BITS
223 USHORT RegisterNumber
:8;
225 USHORT AddressBase
:4;
230 } PCI_TYPE2_ADDRESS_BITS
, *PPCI_TYPE2_ADDRESS_BITS
;
232 typedef struct _PCI_TYPE0_CFG_CYCLE_BITS
239 ULONG RegisterNumber
:6;
240 ULONG FunctionNumber
:3;
245 } PCI_TYPE0_CFG_CYCLE_BITS
, *PPCI_TYPE0_CFG_CYCLE_BITS
;
247 typedef union _PCI_TYPE1_CFG_CYCLE_BITS
252 ULONG RegisterNumber
:6;
253 ULONG FunctionNumber
:3;
254 ULONG DeviceNumber
:5;
259 } PCI_TYPE1_CFG_CYCLE_BITS
, *PPCI_TYPE1_CFG_CYCLE_BITS
;
261 typedef struct _ARRAY
264 PVOID Element
[ANYSIZE_ARRAY
];
267 typedef struct _HAL_BUS_HANDLER
269 LIST_ENTRY AllHandlers
;
270 ULONG ReferenceCount
;
272 } HAL_BUS_HANDLER
, *PHAL_BUS_HANDLER
;
274 /* FUNCTIONS *****************************************************************/
276 /* SHARED (Fake PCI-BUS HANDLER) */
278 extern PCI_CONFIG_HANDLER PCIConfigHandler
;
279 extern PCI_CONFIG_HANDLER PCIConfigHandlerType1
;
280 extern PCI_CONFIG_HANDLER PCIConfigHandlerType2
;
283 PPCI_REGISTRY_INFO_INTERNAL
285 HalpQueryPciRegistryInfo(
291 HalpPCISynchronizeType1(
292 IN PBUS_HANDLER BusHandler
,
293 IN PCI_SLOT_NUMBER Slot
,
295 IN PPCI_TYPE1_CFG_BITS PciCfg
300 HalpPCIReleaseSynchronzationType1(
301 IN PBUS_HANDLER BusHandler
,
307 HalpPCISynchronizeType2(
308 IN PBUS_HANDLER BusHandler
,
309 IN PCI_SLOT_NUMBER Slot
,
311 IN PPCI_TYPE2_ADDRESS_BITS PciCfg
316 HalpPCIReleaseSynchronizationType2(
317 IN PBUS_HANDLER BusHandler
,
321 TYPE1_DEFINE(HalpPCIReadUcharType1
);
322 TYPE1_DEFINE(HalpPCIReadUshortType1
);
323 TYPE1_DEFINE(HalpPCIReadUlongType1
);
324 TYPE2_DEFINE(HalpPCIReadUcharType2
);
325 TYPE2_DEFINE(HalpPCIReadUshortType2
);
326 TYPE2_DEFINE(HalpPCIReadUlongType2
);
327 TYPE1_DEFINE(HalpPCIWriteUcharType1
);
328 TYPE1_DEFINE(HalpPCIWriteUshortType1
);
329 TYPE1_DEFINE(HalpPCIWriteUlongType1
);
330 TYPE2_DEFINE(HalpPCIWriteUcharType2
);
331 TYPE2_DEFINE(HalpPCIWriteUshortType2
);
332 TYPE2_DEFINE(HalpPCIWriteUlongType2
);
337 IN PBUS_HANDLER BusHandler
,
338 IN PCI_SLOT_NUMBER Slot
344 IN PBUS_HANDLER BusHandler
,
345 IN PCI_SLOT_NUMBER Slot
,
354 IN PBUS_HANDLER BusHandler
,
355 IN PCI_SLOT_NUMBER Slot
,
364 IN PBUS_HANDLER BusHandler
,
365 IN PBUS_HANDLER RootBusHandler
,
375 IN PBUS_HANDLER BusHandler
,
376 IN PBUS_HANDLER RootBusHandler
,
385 HalpAssignPCISlotResources(
386 IN PBUS_HANDLER BusHandler
,
387 IN PBUS_HANDLER RootHandler
,
388 IN PUNICODE_STRING RegistryPath
,
389 IN PUNICODE_STRING DriverClassName OPTIONAL
,
390 IN PDRIVER_OBJECT DriverObject
,
391 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
393 IN OUT PCM_RESOURCE_LIST
*pAllocatedResources
398 HalpPhase0GetPciDataByOffset(
400 _In_ PCI_SLOT_NUMBER PciSlot
,
401 _Out_writes_bytes_all_(Length
) PVOID Buffer
,
407 HalpPhase0SetPciDataByOffset(
409 _In_ PCI_SLOT_NUMBER PciSlot
,
410 _In_reads_bytes_(Length
) PVOID Buffer
,
418 HalpGetRootInterruptVector(
419 _In_ ULONG BusInterruptLevel
,
420 _In_ ULONG BusInterruptVector
,
422 _Out_ PKAFFINITY Affinity
);
427 _In_ ULONG BusNumber
,
428 _In_ ULONG SlotNumber
,
429 _Out_writes_bytes_(Length
) PVOID Buffer
,
435 _In_ ULONG BusNumber
,
436 _In_ ULONG SlotNumber
,
437 _In_reads_bytes_(Length
) PVOID Buffer
,
443 HalpInitializePciBus(
450 HalpInitializePciStubs(
456 HalpTranslateBusAddress(
457 IN INTERFACE_TYPE InterfaceType
,
459 IN PHYSICAL_ADDRESS BusAddress
,
460 IN OUT PULONG AddressSpace
,
461 OUT PPHYSICAL_ADDRESS TranslatedAddress
466 HalpAssignSlotResources(
467 IN PUNICODE_STRING RegistryPath
,
468 IN PUNICODE_STRING DriverClassName
,
469 IN PDRIVER_OBJECT DriverObject
,
470 IN PDEVICE_OBJECT DeviceObject
,
471 IN INTERFACE_TYPE BusType
,
474 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
479 HalpFindBusAddressTranslation(
480 IN PHYSICAL_ADDRESS BusAddress
,
481 IN OUT PULONG AddressSpace
,
482 OUT PPHYSICAL_ADDRESS TranslatedAddress
,
483 IN OUT PULONG_PTR Context
,
490 HalpRegisterPciDebuggingDeviceInfo(
498 HaliTranslateBusAddress(
499 IN INTERFACE_TYPE InterfaceType
,
501 IN PHYSICAL_ADDRESS BusAddress
,
502 IN OUT PULONG AddressSpace
,
503 OUT PPHYSICAL_ADDRESS TranslatedAddress
508 HaliFindBusAddressTranslation(
509 IN PHYSICAL_ADDRESS BusAddress
,
510 IN OUT PULONG AddressSpace
,
511 OUT PPHYSICAL_ADDRESS TranslatedAddress
,
512 IN OUT PULONG_PTR Context
,
518 HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler
,
519 IN PBUS_HANDLER RootHandler
,
520 IN OUT PIO_RESOURCE_REQUIREMENTS_LIST
*pResourceList
);
524 HalpGetPCIIntOnISABus(IN PBUS_HANDLER BusHandler
,
525 IN PBUS_HANDLER RootHandler
,
526 IN ULONG BusInterruptLevel
,
527 IN ULONG BusInterruptVector
,
529 OUT PKAFFINITY Affinity
);
532 HalpPCIPin2ISALine(IN PBUS_HANDLER BusHandler
,
533 IN PBUS_HANDLER RootHandler
,
534 IN PCI_SLOT_NUMBER SlotNumber
,
535 IN PPCI_COMMON_CONFIG PciData
);
539 HalpPCIISALine2Pin(IN PBUS_HANDLER BusHandler
,
540 IN PBUS_HANDLER RootHandler
,
541 IN PCI_SLOT_NUMBER SlotNumber
,
542 IN PPCI_COMMON_CONFIG PciNewData
,
543 IN PPCI_COMMON_CONFIG PciOldData
);
547 HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler
,
548 IN PBUS_HANDLER RootHandler
,
549 IN PCI_SLOT_NUMBER PciSlot
,
550 OUT PSUPPORTED_RANGE
*Range
);
560 HalpContextToBusHandler(
561 IN ULONG_PTR ContextValue
566 HaliReferenceHandlerForConfigSpace(
567 IN BUS_DATA_TYPE ConfigType
,
574 _In_ PBUS_HANDLER BusHandler
,
575 _In_ PBUS_HANDLER RootHandler
,
576 _In_ ULONG SlotNumber
,
584 _In_ PBUS_HANDLER BusHandler
,
585 _In_ PBUS_HANDLER RootHandler
,
586 _In_ ULONG SlotNumber
,
587 _Out_writes_bytes_(Length
) PVOID Buffer
,
594 _In_ PBUS_HANDLER BusHandler
,
595 _In_ PBUS_HANDLER RootHandler
,
596 _In_ ULONG SlotNumber
,
597 _In_reads_bytes_(Length
) PVOID Buffer
,
603 HalpTranslateSystemBusAddress(
604 IN PBUS_HANDLER BusHandler
,
605 IN PBUS_HANDLER RootHandler
,
606 IN PHYSICAL_ADDRESS BusAddress
,
607 IN OUT PULONG AddressSpace
,
608 OUT PPHYSICAL_ADDRESS TranslatedAddress
613 HalpTranslateIsaBusAddress(
614 IN PBUS_HANDLER BusHandler
,
615 IN PBUS_HANDLER RootHandler
,
616 IN PHYSICAL_ADDRESS BusAddress
,
617 IN OUT PULONG AddressSpace
,
618 OUT PPHYSICAL_ADDRESS TranslatedAddress
623 HalpGetSystemInterruptVector(
624 IN PBUS_HANDLER BusHandler
,
625 IN PBUS_HANDLER RootHandler
,
626 IN ULONG BusInterruptLevel
,
627 IN ULONG BusInterruptVector
,
629 OUT PKAFFINITY Affinity
632 extern ULONG HalpBusType
;
633 extern BOOLEAN HalpPCIConfigInitialized
;
634 extern BUS_HANDLER HalpFakePciBusHandler
;
635 extern ULONG HalpMinPciBus
, HalpMaxPciBus
;
636 extern LIST_ENTRY HalpAllBusHandlers
;