1 #ifndef __INTERNAL_HAL_BUS_H
2 #define __INTERNAL_HAL_BUS_H
7 #define PASTE2(x,y) x ## y
8 #define POINTER_TO_(x) PASTE2(P,x)
9 #define READ_FROM(x) PASTE2(READ_PORT_, x)
10 #define WRITE_TO(x) PASTE2(WRITE_PORT_, x)
13 // Declares a PCI Register Read/Write Routine
15 #define TYPE_DEFINE(x, y) \
19 IN PPCIPBUSDATA BusData, \
24 #define TYPE1_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS);
25 #define TYPE2_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS);
28 // Defines a PCI Register Read/Write Type 1 Routine Prologue and Epilogue
30 #define TYPE1_START(x, y) \
31 TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS) \
33 ULONG i = Offset % sizeof(ULONG); \
34 PciCfg->u.bits.RegisterNumber = Offset / sizeof(ULONG); \
35 WRITE_PORT_ULONG(BusData->Config.Type1.Address, PciCfg->u.AsULONG);
36 #define TYPE1_END(y) \
38 #define TYPE2_END TYPE1_END
41 // PCI Register Read Type 1 Routine
43 #define TYPE1_READ(x, y) \
45 *((POINTER_TO_(y))Buffer) = \
46 READ_FROM(y)((POINTER_TO_(y))(ULONG_PTR)(BusData->Config.Type1.Data + i)); \
50 // PCI Register Write Type 1 Routine
52 #define TYPE1_WRITE(x, y) \
54 WRITE_TO(y)((POINTER_TO_(y))(ULONG_PTR)(BusData->Config.Type1.Data + i), \
55 *((POINTER_TO_(y))Buffer)); \
59 // Defines a PCI Register Read/Write Type 2 Routine Prologue and Epilogue
61 #define TYPE2_START(x, y) \
62 TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS) \
64 PciCfg->u.bits.RegisterNumber = (USHORT)Offset;
67 // PCI Register Read Type 2 Routine
69 #define TYPE2_READ(x, y) \
71 *((POINTER_TO_(y))Buffer) = \
72 READ_FROM(y)((POINTER_TO_(y))(ULONG_PTR)PciCfg->u.AsUSHORT); \
76 // PCI Register Write Type 2 Routine
78 #define TYPE2_WRITE(x, y) \
80 WRITE_TO(y)((POINTER_TO_(y))(ULONG_PTR)PciCfg->u.AsUSHORT, \
81 *((POINTER_TO_(y))Buffer)); \
84 typedef struct _PCIPBUSDATA
86 PCIBUSDATA CommonData
;
102 } PCIPBUSDATA
, *PPCIPBUSDATA
;
105 (NTAPI
*FncConfigIO
)(
106 IN PPCIPBUSDATA BusData
,
114 IN PBUS_HANDLER BusHandler
,
115 IN PCI_SLOT_NUMBER Slot
,
121 (NTAPI
*FncReleaseSync
)(
122 IN PBUS_HANDLER BusHandler
,
126 typedef struct _PCI_CONFIG_HANDLER
129 FncReleaseSync ReleaseSynchronzation
;
130 FncConfigIO ConfigRead
[3];
131 FncConfigIO ConfigWrite
[3];
132 } PCI_CONFIG_HANDLER
, *PPCI_CONFIG_HANDLER
;
134 typedef struct _PCI_REGISTRY_INFO_INTERNAL
139 UCHAR HardwareMechanism
;
141 PCI_CARD_DESCRIPTOR CardList
[ANYSIZE_ARRAY
];
142 } PCI_REGISTRY_INFO_INTERNAL
, *PPCI_REGISTRY_INFO_INTERNAL
;
144 /* FUNCTIONS *****************************************************************/
148 HalpPCISynchronizeType1(
149 IN PBUS_HANDLER BusHandler
,
150 IN PCI_SLOT_NUMBER Slot
,
152 IN PPCI_TYPE1_CFG_BITS PciCfg
157 HalpPCIReleaseSynchronzationType1(
158 IN PBUS_HANDLER BusHandler
,
164 HalpPCISynchronizeType2(
165 IN PBUS_HANDLER BusHandler
,
166 IN PCI_SLOT_NUMBER Slot
,
168 IN PPCI_TYPE2_ADDRESS_BITS PciCfg
173 HalpPCIReleaseSynchronizationType2(
174 IN PBUS_HANDLER BusHandler
,
178 TYPE1_DEFINE(HalpPCIReadUcharType1
);
179 TYPE1_DEFINE(HalpPCIReadUshortType1
);
180 TYPE1_DEFINE(HalpPCIReadUlongType1
);
181 TYPE2_DEFINE(HalpPCIReadUcharType2
);
182 TYPE2_DEFINE(HalpPCIReadUshortType2
);
183 TYPE2_DEFINE(HalpPCIReadUlongType2
);
184 TYPE1_DEFINE(HalpPCIWriteUcharType1
);
185 TYPE1_DEFINE(HalpPCIWriteUshortType1
);
186 TYPE1_DEFINE(HalpPCIWriteUlongType1
);
187 TYPE2_DEFINE(HalpPCIWriteUcharType2
);
188 TYPE2_DEFINE(HalpPCIWriteUshortType2
);
189 TYPE2_DEFINE(HalpPCIWriteUlongType2
);
194 IN PBUS_HANDLER BusHandler
,
195 IN PCI_SLOT_NUMBER Slot
201 IN PBUS_HANDLER BusHandler
,
202 IN PCI_SLOT_NUMBER Slot
,
211 IN PBUS_HANDLER BusHandler
,
212 IN PCI_SLOT_NUMBER Slot
,
220 HalpGetSystemInterruptVector(
222 ULONG BusInterruptLevel
,
223 ULONG BusInterruptVector
,
249 IN PBUS_HANDLER BusHandler
,
250 IN PBUS_HANDLER RootBusHandler
,
251 IN PCI_SLOT_NUMBER SlotNumber
,
260 IN PBUS_HANDLER BusHandler
,
261 IN PBUS_HANDLER RootBusHandler
,
262 IN PCI_SLOT_NUMBER SlotNumber
,
270 HalpAssignPCISlotResources(
271 IN PBUS_HANDLER BusHandler
,
272 IN PBUS_HANDLER RootHandler
,
273 IN PUNICODE_STRING RegistryPath
,
274 IN PUNICODE_STRING DriverClassName OPTIONAL
,
275 IN PDRIVER_OBJECT DriverObject
,
276 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
278 IN OUT PCM_RESOURCE_LIST
*pAllocatedResources
283 HalpInitializePciBus(
287 extern ULONG HalpBusType
;
288 extern BOOLEAN HalpPCIConfigInitialized
;
289 extern BUS_HANDLER HalpFakePciBusHandler
;
290 extern ULONG HalpMinPciBus
, HalpMaxPciBus
;
292 #endif /* __INTERNAL_HAL_BUS_H */