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
;
161 typedef struct _PCI_TYPE0_CFG_CYCLE_BITS
168 ULONG RegisterNumber
:6;
169 ULONG FunctionNumber
:3;
174 } PCI_TYPE0_CFG_CYCLE_BITS
, *PPCI_TYPE0_CFG_CYCLE_BITS
;
176 typedef struct _PCI_TYPE1_CFG_CYCLE_BITS
183 ULONG RegisterNumber
:6;
184 ULONG FunctionNumber
:3;
185 ULONG DeviceNumber
:5;
191 } PCI_TYPE1_CFG_CYCLE_BITS
, *PPCI_TYPE1_CFG_CYCLE_BITS
;
193 typedef struct _ARRAY
196 PVOID Element
[ANYSIZE_ARRAY
];
199 typedef struct _HAL_BUS_HANDLER
201 LIST_ENTRY AllHandlers
;
202 ULONG ReferenceCount
;
204 } HAL_BUS_HANDLER
, *PHAL_BUS_HANDLER
;
206 /* FUNCTIONS *****************************************************************/
208 /* SHARED (Fake PCI-BUS HANDLER) */
210 extern PCI_CONFIG_HANDLER PCIConfigHandler
;
211 extern PCI_CONFIG_HANDLER PCIConfigHandlerType1
;
212 extern PCI_CONFIG_HANDLER PCIConfigHandlerType2
;
214 PPCI_REGISTRY_INFO_INTERNAL
216 HalpQueryPciRegistryInfo(
222 HalpPCISynchronizeType1(
223 IN PBUS_HANDLER BusHandler
,
224 IN PCI_SLOT_NUMBER Slot
,
226 IN PPCI_TYPE1_CFG_BITS PciCfg
231 HalpPCIReleaseSynchronzationType1(
232 IN PBUS_HANDLER BusHandler
,
238 HalpPCISynchronizeType2(
239 IN PBUS_HANDLER BusHandler
,
240 IN PCI_SLOT_NUMBER Slot
,
242 IN PPCI_TYPE2_ADDRESS_BITS PciCfg
247 HalpPCIReleaseSynchronizationType2(
248 IN PBUS_HANDLER BusHandler
,
252 TYPE1_DEFINE(HalpPCIReadUcharType1
);
253 TYPE1_DEFINE(HalpPCIReadUshortType1
);
254 TYPE1_DEFINE(HalpPCIReadUlongType1
);
255 TYPE2_DEFINE(HalpPCIReadUcharType2
);
256 TYPE2_DEFINE(HalpPCIReadUshortType2
);
257 TYPE2_DEFINE(HalpPCIReadUlongType2
);
258 TYPE1_DEFINE(HalpPCIWriteUcharType1
);
259 TYPE1_DEFINE(HalpPCIWriteUshortType1
);
260 TYPE1_DEFINE(HalpPCIWriteUlongType1
);
261 TYPE2_DEFINE(HalpPCIWriteUcharType2
);
262 TYPE2_DEFINE(HalpPCIWriteUshortType2
);
263 TYPE2_DEFINE(HalpPCIWriteUlongType2
);
268 IN PBUS_HANDLER BusHandler
,
269 IN PCI_SLOT_NUMBER Slot
275 IN PBUS_HANDLER BusHandler
,
276 IN PCI_SLOT_NUMBER Slot
,
285 IN PBUS_HANDLER BusHandler
,
286 IN PCI_SLOT_NUMBER Slot
,
295 IN PBUS_HANDLER BusHandler
,
296 IN PBUS_HANDLER RootBusHandler
,
297 IN PCI_SLOT_NUMBER SlotNumber
,
306 IN PBUS_HANDLER BusHandler
,
307 IN PBUS_HANDLER RootBusHandler
,
308 IN PCI_SLOT_NUMBER SlotNumber
,
316 HalpAssignPCISlotResources(
317 IN PBUS_HANDLER BusHandler
,
318 IN PBUS_HANDLER RootHandler
,
319 IN PUNICODE_STRING RegistryPath
,
320 IN PUNICODE_STRING DriverClassName OPTIONAL
,
321 IN PDRIVER_OBJECT DriverObject
,
322 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
324 IN OUT PCM_RESOURCE_LIST
*pAllocatedResources
331 HalpGetSystemInterruptVector_Acpi(
333 ULONG BusInterruptLevel
,
334 ULONG BusInterruptVector
,
359 HalpInitializePciBus(
365 HalpInitializePciStubs(
371 HalpTranslateBusAddress(
372 IN INTERFACE_TYPE InterfaceType
,
374 IN PHYSICAL_ADDRESS BusAddress
,
375 IN OUT PULONG AddressSpace
,
376 OUT PPHYSICAL_ADDRESS TranslatedAddress
381 HalpAssignSlotResources(
382 IN PUNICODE_STRING RegistryPath
,
383 IN PUNICODE_STRING DriverClassName
,
384 IN PDRIVER_OBJECT DriverObject
,
385 IN PDEVICE_OBJECT DeviceObject
,
386 IN INTERFACE_TYPE BusType
,
389 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
394 HalpFindBusAddressTranslation(
395 IN PHYSICAL_ADDRESS BusAddress
,
396 IN OUT PULONG AddressSpace
,
397 OUT PPHYSICAL_ADDRESS TranslatedAddress
,
398 IN OUT PULONG_PTR Context
,
404 HalpRegisterPciDebuggingDeviceInfo(
412 HaliTranslateBusAddress(
413 IN INTERFACE_TYPE InterfaceType
,
415 IN PHYSICAL_ADDRESS BusAddress
,
416 IN OUT PULONG AddressSpace
,
417 OUT PPHYSICAL_ADDRESS TranslatedAddress
422 HaliFindBusAddressTranslation(
423 IN PHYSICAL_ADDRESS BusAddress
,
424 IN OUT PULONG AddressSpace
,
425 OUT PPHYSICAL_ADDRESS TranslatedAddress
,
426 IN OUT PULONG_PTR Context
,
432 HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler
,
433 IN PBUS_HANDLER RootHandler
,
434 IN OUT PIO_RESOURCE_REQUIREMENTS_LIST
*pResourceList
);
438 HalpGetPCIIntOnISABus(IN PBUS_HANDLER BusHandler
,
439 IN PBUS_HANDLER RootHandler
,
440 IN ULONG BusInterruptLevel
,
441 IN ULONG BusInterruptVector
,
443 OUT PKAFFINITY Affinity
);
446 HalpPCIPin2ISALine(IN PBUS_HANDLER BusHandler
,
447 IN PBUS_HANDLER RootHandler
,
448 IN PCI_SLOT_NUMBER SlotNumber
,
449 IN PPCI_COMMON_CONFIG PciData
);
453 HalpPCIISALine2Pin(IN PBUS_HANDLER BusHandler
,
454 IN PBUS_HANDLER RootHandler
,
455 IN PCI_SLOT_NUMBER SlotNumber
,
456 IN PPCI_COMMON_CONFIG PciNewData
,
457 IN PPCI_COMMON_CONFIG PciOldData
);
461 HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler
,
462 IN PBUS_HANDLER RootHandler
,
463 IN PCI_SLOT_NUMBER PciSlot
,
464 OUT PSUPPORTED_RANGE
*Range
);
474 HalpContextToBusHandler(
475 IN ULONG_PTR ContextValue
480 HaliReferenceHandlerForConfigSpace(
481 IN BUS_DATA_TYPE ConfigType
,
488 IN PBUS_HANDLER BusHandler
,
489 IN PBUS_HANDLER RootHandler
,
499 IN PBUS_HANDLER BusHandler
,
500 IN PBUS_HANDLER RootHandler
,
510 IN PBUS_HANDLER BusHandler
,
511 IN PBUS_HANDLER RootHandler
,
520 HalpTranslateSystemBusAddress(
521 IN PBUS_HANDLER BusHandler
,
522 IN PBUS_HANDLER RootHandler
,
523 IN PHYSICAL_ADDRESS BusAddress
,
524 IN OUT PULONG AddressSpace
,
525 OUT PPHYSICAL_ADDRESS TranslatedAddress
530 HalpTranslateIsaBusAddress(
531 IN PBUS_HANDLER BusHandler
,
532 IN PBUS_HANDLER RootHandler
,
533 IN PHYSICAL_ADDRESS BusAddress
,
534 IN OUT PULONG AddressSpace
,
535 OUT PPHYSICAL_ADDRESS TranslatedAddress
540 HalpGetSystemInterruptVector(
541 IN PBUS_HANDLER BusHandler
,
542 IN PBUS_HANDLER RootHandler
,
543 IN ULONG BusInterruptLevel
,
544 IN ULONG BusInterruptVector
,
546 OUT PKAFFINITY Affinity
549 extern ULONG HalpBusType
;
550 extern BOOLEAN HalpPCIConfigInitialized
;
551 extern BUS_HANDLER HalpFakePciBusHandler
;
552 extern ULONG HalpMinPciBus
, HalpMaxPciBus
;
553 extern LIST_ENTRY HalpAllBusHandlers
;